Further work on professional services page

This commit is contained in:
pietervdvn 2021-11-30 21:29:17 +01:00
parent 9a20451e81
commit 5aeff895a9
5 changed files with 59 additions and 42 deletions

View file

@ -1,24 +0,0 @@
#### Making a map from different data sources
For example, one could make a map with all benches in some city, based on the benches known by OpenStreetMap. This printed map needs a clear statement that the map data is based on OpenStreetMap.
Selling these maps is permitted.
If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap.
This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.
Of course, a map with only benches can be boring. The mapmaker might also decide to add in a layer with shops, possibly sourced from another geodata provider under another license.
This is permitted to, if the map clearly states that the benches are sourced from OSM (under ODBL) and the shops have a different source (eventually with an all rights reserved).
However, mixing two datasets into one undistinguishible layer might not be permitted. For example, the mapmaker migth find that OSM has excellent data on benches in one part of the city and the closed-source provider might have excellent data on benches in another part of the city, merging these datasets into one could be problematic:
the open license would require the modifications to be openly republished, whereas the all-rights-reserved license would prohibit this.
#### Gathering open data
MapComplete is an excellent way to create Open Data, also in the setting of a government.
However, the ODBL is slightly more restrictive then a public domain license giving a licensing issue.
If you have a legal requirement to republish data as _public data_, MapComplete can still be used as data gathering tool using OpenStreetMap infastructure. In this case, the contributors using your custom built theme can opt-in to publish their edits into the _public domain_ instead of using the ODbL.

View file

@ -6,6 +6,8 @@ export default class Title extends BaseUIElement {
public readonly title: BaseUIElement;
public readonly level: number;
public readonly id : string
private static readonly defaultClassesPerLevel = ["", "text-3xl font-bold","text-2xl font-bold","text-xl font-bold", "text-lg font-bold"]
constructor(embedded: string | BaseUIElement, level: number = 3) {
super()
@ -16,6 +18,7 @@ export default class Title extends BaseUIElement {
}
this.level = level;
this.id = this.title.ConstructElement()?.innerText?.replace(/ /g, '_') ?? ""
this.SetClass(Title.defaultClassesPerLevel[level] ?? "")
}
AsMarkdown(): string {

View file

@ -9,7 +9,7 @@ export default class LanguagePicker {
languages: string[],
label: string | BaseUIElement = "") {
if (languages.length <= 1) {
if (languages === undefined || languages.length <= 1) {
return undefined;
}

View file

@ -17,7 +17,8 @@ class TableOfContents extends Combine {
private readonly titles: Title[]
constructor(elements: Combine | Title[], options: {
noTopLevel: false | boolean
noTopLevel: false | boolean,
maxDepth?: number
}) {
let titles: Title[]
if (elements instanceof Combine) {
@ -49,7 +50,7 @@ class TableOfContents extends Combine {
}
if (options.noTopLevel) {
const minLevel = Math.min(...els.map(e => e.level))
els = els.filter(e => e.level !== minLevel)
els = els.filter(e => e.level !== minLevel && e.level <= (options.maxDepth + minLevel))
}
@ -97,10 +98,18 @@ class TableOfContents extends Combine {
}
class Snippet extends Toggleable {
constructor(translations) {
constructor(translations, ...extraContent: BaseUIElement[]) {
super(
new Title(translations.title, 3),
new Combine([
new SnippetContent(translations, ...extraContent)
)
}
}
class SnippetContent extends Combine {
constructor(translations:any, ...extras: BaseUIElement[]) {
super([
translations.intro,
new List([
translations.li0,
@ -111,9 +120,10 @@ class Snippet extends Toggleable {
translations.li5,
translations.li6,
]),
translations.outro
]).SetClass("flex flex-col")
)
translations.outro,
...extras
])
this.SetClass("flex flex-col")
}
}
@ -128,14 +138,14 @@ export default class ProfessionalGui {
new FixedUiElement(`<img class="w-12 h-12 sm:h-24 sm:w-24" src="./assets/svg/logo.svg" alt="MapComplete Logo">`)
.SetClass("flex-none m-3"),
new Combine([
new Title(t.title, 1).SetClass("font-bold text-3xl"),
new Title(t.title, 1),
t.intro
]).SetClass("flex flex-col")
]).SetClass("flex")
const content = new Combine([
header,
new Title(t.osmTitle, 2).SetClass("text-2xl"),
new Title(t.osmTitle, 2),
t.text0,
t.text1,
new Accordeon([
@ -145,20 +155,26 @@ export default class ProfessionalGui {
new Snippet(t.aboutOsm.vandalism),
]).SetClass("flex flex-col"),
new Title(t.aboutMc.title, 2).SetClass("text-2xl"),
new Title(t.aboutMc.title, 2),
t.aboutMc.text0,
t.aboutMc.text1,
t.aboutMc.text2,
new Accordeon([
new Snippet(t.aboutMc.layers),
new Snippet(t.aboutMc.survey),
new Snippet(t.aboutMc.internalUse)
new Snippet(t.aboutMc.internalUse),
new Snippet(t.services)
]),
new Title(t.drawbacks.title, 2).SetClass("text-2xl"),
t.drawbacks.intro,
new Accordeon([
new Snippet(t.drawbacks.unsuitedData),
new Snippet(t.drawbacks.licenseNuances)
new Snippet(t.drawbacks.licenseNuances,
new Title( t.drawbacks.licenseNuances.usecaseMapDifferentSources.title, 4),
new SnippetContent(t.drawbacks.licenseNuances.usecaseMapDifferentSources),
new Title( t.drawbacks.licenseNuances.usecaseGatheringOpenData.title, 4),
new SnippetContent(t.drawbacks.licenseNuances.usecaseGatheringOpenData)
)
]),
]).SetClass("flex flex-col pb-12 m-3 lg:w-3/4 lg:ml-10 link-underline")
@ -175,10 +191,12 @@ export default class ProfessionalGui {
const leftContents: BaseUIElement[] = [
backToIndex,
new TableOfContents(content, {
noTopLevel: true
noTopLevel: true,
maxDepth: 2
}).SetClass("subtle"),
LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages()).SetClass("mt-4 self-end flex-col"),
].map(el => el.SetClass("pl-4"))
LanguagePicker.CreateLanguagePicker(Translations.t.professional.title.SupportedLanguages())?.SetClass("mt-4 self-end flex-col"),
].map(el => el?.SetClass("pl-4"))
const leftBar = new Combine([
new Combine(leftContents).SetClass("sticky top-4 m-4")
]).SetClass("block w-full md:w-2/6 lg:w-1/6")

View file

@ -376,6 +376,16 @@
"intro": "<p>Once the data is in OpenStreetMap, you'll probably want to use the data as well. Your MapComplete theme can have a convenient <i>export</i>-button, offering to download the data in many open formats usable in QGis, ArcGis, Excel, LibreOffice-calc, ...</p><p>Someone with basic spreadsheet-skills can thus easily create graphs and insights about the data, whereas the GIS-experts within your organisation can easily work with this data in their preferred application.</p><p>If an automated setup is needed, a free-to-use, community-run API is available.</p>"
}
},
"services": {
"title": "MapComplete services",
"intro": "The developer of MapComplete can help you with the following services:",
"li0": "Setting up a theme tailored for your need",
"li1": "Help with setting up the internal data flow to integrate OpenStreetMap",
"li2": "Training on how to contribute data with MapComplete",
"li3": "Advanced training (e.g. for the GIS-team) on how to add advanced data to OpenStreetMap",
"li4": "Training on how to download filtered data from OpenStreetMap",
"outro": "These services are offered at competitive prices. A simple theme without extra support can be setup for as little €2000, and a small additional yearly hosting cost."
},
"drawbacks": {
"title": "A few drawbacks to keep in mind",
"intro": "While joining this community has tremendous benefits, there are a few topics to carefully consider.",
@ -392,9 +402,19 @@
"li0": "All data can be reused for any purpose - including commercial purposes",
"li1": "Applications or products using OpenStreetMap should give a clear copyright notice",
"li2": "Any dataset or product which contains OpenStreetMap-data must be republished under ODbL too, including modifications to this dataset and in a usable format.",
"outro": "This has a few implications which should be considered for some usecases, as explained below"
"outro": "This has a few implications which should be considered for some usecases, as explained below",
"usecaseMapDifferentSources": {
"title": "Creating a map from different sources",
"intro": "<p>For example, one could make a map with all benches in some city, based on the benches known by OpenStreetMap. This printed map needs a clear statement that the map data is based on OpenStreetMap. Selling these maps is permitted.If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap.</p><p>This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.</p><p>If the mapmaker notices that the benches are missing in some area and adds them on the printed map, the data on the missing benches are automatically open data too. This means that an OpenStreetMap-contributor is allowed to take the paper map and use it to add the missing benches back into OpenStreetMap. This contributor also has the right to ask for the dataset of the missing benches, which should be provided too.</p><p>Of course, a map with only benches can be boring. The mapmaker might also decide to add in a layer with shops, possibly sourced from another geodata provider under another license. This is permitted to, if the map clearly states that the benches are sourced from OSM (under ODBL) and the shops have a different source (eventually with an all rights reserved).</p><p>However, mixing two datasets into one undistinguishible layer might not be permitted. For example, the mapmaker migth find that OSM has excellent data on benches in one part of the city and the closed-source provider might have excellent data on benches in another part of the city, merging these datasets into one could be problematic: </p>",
"li0": "the open license would require the modifications to be openly republished...",
"li1": "...whereas the all-rights-reserved license would prohibit this.",
"outro": "As a result, this kind of mixing is not allowed"
},
"usecaseGatheringOpenData": {
"title": "Gathering open data",
"intro": "MapComplete is an excellent way to create Open Data, also for governments. By default, this data will be freely redistributable under the ODbL. However, if there is a requirement to publish the gathered data under a <i>public domain</i>-license (where <b>all</b> rights are granted to the public and no attribution is required), the ODbL is too restrictive. In this case, one can ask the contributors to add data as Public Domain (e.g. by informing them in the mapcomplete theme). "
}
}
}
}
}