Merge branch 'feature/schools'

This commit is contained in:
pietervdvn 2022-06-22 15:27:25 +02:00
commit dd483fc42b
30 changed files with 1551 additions and 135 deletions

View file

@ -5,6 +5,7 @@ import BaseUIElement from "../UI/BaseUIElement";
import List from "../UI/Base/List";
import Title from "../UI/Base/Title";
import {BBox} from "./BBox";
import {Feature, Geometry, MultiPolygon, Polygon} from "@turf/turf";
export interface ExtraFuncParams {
/**
@ -12,9 +13,9 @@ export interface ExtraFuncParams {
* Note that more features then requested can be given back.
* Format: [ [ geojson, geojson, geojson, ... ], [geojson, ...], ...]
*/
getFeaturesWithin: (layerId: string, bbox: BBox) => any[][],
getFeaturesWithin: (layerId: string, bbox: BBox) => Feature<Geometry, {id: string}>[][],
memberships: RelationsTracker
getFeatureById: (id: string) => any
getFeatureById: (id: string) => Feature<Geometry, {id: string}>
}
/**
@ -24,21 +25,65 @@ interface ExtraFunction {
readonly _name: string;
readonly _args: string[];
readonly _doc: string;
readonly _f: (params: ExtraFuncParams, feat: any) => any;
readonly _f: (params: ExtraFuncParams, feat: Feature<Geometry, any>) => any;
}
class EnclosingFunc implements ExtraFunction {
_name = "enclosingFeatures"
_doc = ["Gives a list of all features in the specified layers which fully contain this object. Returned features will always be (multi)polygons. (LineStrings and Points from the other layers are ignored)","",
"The result is a list of features: `{feat: Polygon}[]`",
"This function will never return the feature itself."].join("\n")
_args = ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"]
_f(params: ExtraFuncParams, feat: Feature<Geometry, any>) {
return (...layerIds: string[]) => {
const result: { feat: any }[] = []
const bbox = BBox.get(feat)
const seenIds = new Set<string>()
seenIds.add(feat.properties.id)
for (const layerId of layerIds) {
const otherFeaturess = params.getFeaturesWithin(layerId, bbox)
if (otherFeaturess === undefined) {
continue;
}
if (otherFeaturess.length === 0) {
continue;
}
for (const otherFeatures of otherFeaturess) {
for (const otherFeature of otherFeatures) {
if(seenIds.has(otherFeature.properties.id)){
continue
}
seenIds.add(otherFeature.properties.id)
if(otherFeature.geometry.type !== "Polygon" && otherFeature.geometry.type !== "MultiPolygon"){
continue;
}
if(GeoOperations.completelyWithin(feat, <Feature<Polygon | MultiPolygon, any>> otherFeature)){
result.push({feat: otherFeature})
}
}
}
}
return result;
}
}
}
class OverlapFunc implements ExtraFunction {
_name = "overlapWith";
_doc = "Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well." +
"If the current feature is a point, all features that this point is embeded in are given.\n\n" +
"The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.\n" +
"The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list\n" +
"\n" +
"For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`"
_doc = ["Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.",
"If the current feature is a point, all features that this point is embeded in are given." ,
"",
"The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point." ,
"The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list." ,
"",
"For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`",
"",
"Also see [enclosingFeatures](#enclosingFeatures) which can be used to get all objects which fully contain this feature"
].join("\n")
_args = ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"]
_f(params, feat) {
@ -46,15 +91,15 @@ class OverlapFunc implements ExtraFunction {
const result: { feat: any, overlap: number }[] = []
const bbox = BBox.get(feat)
for (const layerId of layerIds) {
const otherLayers = params.getFeaturesWithin(layerId, bbox)
if (otherLayers === undefined) {
const otherFeaturess = params.getFeaturesWithin(layerId, bbox)
if (otherFeaturess === undefined) {
continue;
}
if (otherLayers.length === 0) {
if (otherFeaturess.length === 0) {
continue;
}
for (const otherLayer of otherLayers) {
result.push(...GeoOperations.calculateOverlap(feat, otherLayer));
for (const otherFeatures of otherFeaturess) {
result.push(...GeoOperations.calculateOverlap(feat, otherFeatures));
}
}
@ -392,6 +437,7 @@ export class ExtraFunctions {
private static readonly allFuncs: ExtraFunction[] = [
new DistanceToFunc(),
new OverlapFunc(),
new EnclosingFunc(),
new IntersectionFunc(),
new ClosestObjectFunc(),
new ClosestNObjectFunc(),

View file

@ -79,6 +79,9 @@ export default class SaveTileToLocalStorageActor {
}
loadedTiles.add(key)
this.GetIdb(key).then((features: { feature: any, freshness: Date }[]) => {
if(features === undefined){
return;
}
console.debug("Loaded tile " + self._layer.id + "_" + key + " from disk")
const src = new SimpleFeatureSource(self._flayer, key, new UIEventSource<{ feature: any; freshness: Date }[]>(features))
registerTile(src)

View file

@ -23,6 +23,7 @@ import TileFreshnessCalculator from "./TileFreshnessCalculator";
import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource";
import MapState from "../State/MapState";
import {ElementStorage} from "../ElementStorage";
import {Feature, Geometry} from "@turf/turf";
/**
@ -337,7 +338,7 @@ export default class FeaturePipeline {
}
public GetAllFeaturesWithin(bbox: BBox): any[][] {
public GetAllFeaturesWithin(bbox: BBox): Feature<Geometry, {id: string}>[][] {
const self = this
const tiles = []
Array.from(this.perLayerHierarchy.keys())

View file

@ -1,13 +1,10 @@
/**
* Merges features from different featureSources for a single layer
* Uses the freshest feature available in the case multiple sources offer data with the same identifier
*/
import {UIEventSource} from "../../UIEventSource";
import FeatureSource, {FeatureSourceForLayer, IndexedFeatureSource, Tiled} from "../FeatureSource";
import FilteredLayer from "../../../Models/FilteredLayer";
import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox";
export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled, IndexedFeatureSource {
public features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]);
@ -17,7 +14,10 @@ export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled
public readonly bbox: BBox;
public readonly containedIds: UIEventSource<Set<string>> = new UIEventSource<Set<string>>(new Set())
private readonly _sources: UIEventSource<FeatureSource[]>;
/**
* Merges features from different featureSources for a single layer
* Uses the freshest feature available in the case multiple sources offer data with the same identifier
*/
constructor(layer: FilteredLayer, tileIndex: number, bbox: BBox, sources: UIEventSource<FeatureSource[]>) {
this.tileIndex = tileIndex;
this.bbox = bbox;

View file

@ -6,23 +6,90 @@ import {GeoOperations} from "../../GeoOperations";
import FeatureSource from "../FeatureSource";
import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
import LineRenderingConfig from "../../../Models/ThemeConfig/LineRenderingConfig";
import {within} from "@turf/turf";
export default class RenderingMultiPlexerFeatureSource {
public readonly features: UIEventSource<(any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[]>;
private readonly pointRenderings: { rendering: PointRenderingConfig; index: number }[];
private centroidRenderings: { rendering: PointRenderingConfig; index: number }[];
private projectedCentroidRenderings: { rendering: PointRenderingConfig; index: number }[];
private startRenderings: { rendering: PointRenderingConfig; index: number }[];
private endRenderings: { rendering: PointRenderingConfig; index: number }[];
private hasCentroid: boolean;
private lineRenderObjects: LineRenderingConfig[];
private inspectFeature(feat, addAsPoint: (feat, rendering, centerpoint: [number, number]) => void, withIndex: any[]){
if (feat.geometry.type === "Point") {
for (const rendering of this.pointRenderings) {
withIndex.push({
...feat,
pointRenderingIndex: rendering.index
})
}
} else {
// This is a a line: add the centroids
let centerpoint: [number, number] = undefined;
let projectedCenterPoint : [number, number] = undefined
if(this.hasCentroid){
centerpoint = GeoOperations.centerpointCoordinates(feat)
if(this.projectedCentroidRenderings.length > 0){
projectedCenterPoint = <[number,number]> GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates
}
}
for (const rendering of this.centroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
if (feat.geometry.type === "LineString") {
for (const rendering of this.projectedCentroidRenderings) {
addAsPoint(feat, rendering, projectedCenterPoint)
}
// Add start- and endpoints
const coordinates = feat.geometry.coordinates
for (const rendering of this.startRenderings) {
addAsPoint(feat, rendering, coordinates[0])
}
for (const rendering of this.endRenderings) {
const coordinate = coordinates[coordinates.length - 1]
addAsPoint(feat, rendering, coordinate)
}
}else{
for (const rendering of this.projectedCentroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
}
// AT last, add it 'as is' to what we should render
for (let i = 0; i < this.lineRenderObjects.length; i++) {
withIndex.push({
...feat,
lineRenderingIndex: i
})
}
}
}
constructor(upstream: FeatureSource, layer: LayerConfig) {
const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({
rendering: r,
index: i
}))
const pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point"))
const centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid"))
const projectedCentroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("projected_centerpoint"))
const startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start"))
const endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end"))
const hasCentroid = centroidRenderings.length > 0 || projectedCentroidRenderings.length > 0
const lineRenderObjects = layer.lineRendering
this.pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point"))
this.centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid"))
this.projectedCentroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("projected_centerpoint"))
this.startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start"))
this.endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end"))
this.hasCentroid = this.centroidRenderings.length > 0 || this.projectedCentroidRenderings.length > 0
this.lineRenderObjects = layer.lineRendering
this.features = upstream.features.map(
features => {
@ -31,8 +98,7 @@ export default class RenderingMultiPlexerFeatureSource {
}
const withIndex: (any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined, multiLineStringIndex: number | undefined })[] = [];
const withIndex: any[] = [];
function addAsPoint(feat, rendering, coordinate) {
const patched = {
@ -45,63 +111,10 @@ export default class RenderingMultiPlexerFeatureSource {
}
withIndex.push(patched)
}
for (const f of features) {
const feat = f.feature;
if (feat.geometry.type === "Point") {
for (const rendering of pointRenderings) {
withIndex.push({
...feat,
pointRenderingIndex: rendering.index
})
}
} else {
// This is a a line: add the centroids
let centerpoint: [number, number] = undefined;
let projectedCenterPoint : [number, number] = undefined
if(hasCentroid){
centerpoint = GeoOperations.centerpointCoordinates(feat)
if(projectedCentroidRenderings.length > 0){
projectedCenterPoint = <[number,number]> GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates
}
}
for (const rendering of centroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
if (feat.geometry.type === "LineString") {
for (const rendering of projectedCentroidRenderings) {
addAsPoint(feat, rendering, projectedCenterPoint)
}
// Add start- and endpoints
const coordinates = feat.geometry.coordinates
for (const rendering of startRenderings) {
addAsPoint(feat, rendering, coordinates[0])
}
for (const rendering of endRenderings) {
const coordinate = coordinates[coordinates.length - 1]
addAsPoint(feat, rendering, coordinate)
}
}else{
for (const rendering of projectedCentroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
}
// AT last, add it 'as is' to what we should render
for (let i = 0; i < lineRenderObjects.length; i++) {
withIndex.push({
...feat,
lineRenderingIndex: i
})
}
}
this.inspectFeature(f.feature, addAsPoint, withIndex)
}

View file

@ -7,7 +7,6 @@ import FilteredLayer from "../../../Models/FilteredLayer";
import {FeatureSourceForLayer, Tiled} from "../FeatureSource";
import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox";
import {OsmConnection} from "../../Osm/OsmConnection";
import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig";
import {Or} from "../../Tags/Or";
import {TagsFilter} from "../../Tags/TagsFilter";
@ -27,65 +26,71 @@ export default class OsmFeatureSource {
handleTile: (tile: FeatureSourceForLayer & Tiled) => void;
isActive: UIEventSource<boolean>,
neededTiles: UIEventSource<number[]>,
state: {
readonly osmConnection: OsmConnection;
},
markTileVisited?: (tileId: number) => void
};
private readonly allowedTags: TagsFilter;
/**
*
* @param options: allowedFeatures is normally calculated from the layoutToUse
*/
constructor(options: {
handleTile: (tile: FeatureSourceForLayer & Tiled) => void;
isActive: UIEventSource<boolean>,
neededTiles: UIEventSource<number[]>,
state: {
readonly filteredLayers: UIEventSource<FilteredLayer[]>;
readonly osmConnection: OsmConnection;
readonly layoutToUse: LayoutConfig
readonly osmConnection: {
Backend(): string
};
readonly layoutToUse?: LayoutConfig
},
readonly allowedFeatures?: TagsFilter,
markTileVisited?: (tileId: number) => void
}) {
this.options = options;
this._backend = options.state.osmConnection._oauth_config.url;
this._backend = options.state.osmConnection.Backend();
this.filteredLayers = options.state.filteredLayers.map(layers => layers.filter(layer => layer.layerDef.source.geojsonSource === undefined))
this.handleTile = options.handleTile
this.isActive = options.isActive
const self = this
options.neededTiles.addCallbackAndRunD(neededTiles => {
if (options.isActive?.data === false) {
return;
}
neededTiles = neededTiles.filter(tile => !self.downloadedTiles.has(tile))
if (neededTiles.length == 0) {
return;
}
self.isRunning.setData(true)
try {
for (const neededTile of neededTiles) {
self.downloadedTiles.add(neededTile)
self.LoadTile(...Tiles.tile_from_index(neededTile)).then(_ => {
console.debug("Tile ", Tiles.tile_from_index(neededTile).join("/"), "loaded from OSM")
})
}
} catch (e) {
console.error(e)
} finally {
self.isRunning.setData(false)
}
self.Update(neededTiles)
})
const neededLayers = (options.state.layoutToUse?.layers ?? [])
.filter(layer => !layer.doNotDownload)
.filter(layer => layer.source.geojsonSource === undefined || layer.source.isOsmCacheLayer)
this.allowedTags = new Or(neededLayers.map(l => l.source.osmTags))
this.allowedTags = options.allowedFeatures ?? new Or(neededLayers.map(l => l.source.osmTags))
}
private async LoadTile(z, x, y): Promise<void> {
private async Update(neededTiles: number[]) {
if (this.options.isActive?.data === false) {
return;
}
neededTiles = neededTiles.filter(tile => !this.downloadedTiles.has(tile))
if (neededTiles.length == 0) {
return;
}
this.isRunning.setData(true)
try {
for (const neededTile of neededTiles) {
this.downloadedTiles.add(neededTile)
this.LoadTile(...Tiles.tile_from_index(neededTile))
}
} catch (e) {
console.error(e)
} finally {
this.isRunning.setData(false)
}
}
private LoadTile(z, x, y): void {
if (z > 25) {
throw "This is an absurd high zoom level"
}
@ -96,11 +101,10 @@ export default class OsmFeatureSource {
const bbox = BBox.fromTile(z, x, y)
const url = `${this._backend}/api/0.6/map?bbox=${bbox.minLon},${bbox.minLat},${bbox.maxLon},${bbox.maxLat}`
try {
const osmJson = await Utils.downloadJson(url)
Utils.downloadJson(url).then(osmJson => {
try {
console.debug("Got tile", z, x, y, "from the osm api")
console.log("Got tile", z, x, y, "from the osm api")
this.rawDataHandlers.forEach(handler => handler(osmJson, Tiles.tile_index(z, x, y)))
const geojson = OsmToGeoJson.default(osmJson,
// @ts-ignore
@ -130,17 +134,18 @@ export default class OsmFeatureSource {
} catch (e) {
console.error("Weird error: ", e)
}
} catch (e) {
console.error("Could not download tile", z, x, y, "due to", e, "; retrying with smaller bounds")
if (e === "rate limited") {
})
.catch(e => {
console.error("Could not download tile", z, x, y, "due to", e, "; retrying with smaller bounds")
if (e === "rate limited") {
return;
}
this.LoadTile(z + 1, x * 2, y * 2)
this.LoadTile(z + 1, 1 + x * 2, y * 2)
this.LoadTile(z + 1, x * 2, 1 + y * 2)
this.LoadTile(z + 1, 1 + x * 2, 1 + y * 2)
return;
}
await this.LoadTile(z + 1, x * 2, y * 2)
await this.LoadTile(z + 1, 1 + x * 2, y * 2)
await this.LoadTile(z + 1, x * 2, 1 + y * 2)
await this.LoadTile(z + 1, 1 + x * 2, 1 + y * 2)
return;
}
})
}

View file

@ -3,7 +3,7 @@ import {BBox} from "./BBox";
import togpx from "togpx"
import Constants from "../Models/Constants";
import LayerConfig from "../Models/ThemeConfig/LayerConfig";
import {Coord} from "@turf/turf";
import {booleanWithin, Coord, Feature, Geometry, MultiPolygon, Polygon, Properties} from "@turf/turf";
export class GeoOperations {
@ -142,7 +142,10 @@ export class GeoOperations {
return result;
}
public static pointInPolygonCoordinates(x: number, y: number, coordinates: [number, number][][]) {
/**
* Helper function which does the heavy lifting for 'inside'
*/
private static pointInPolygonCoordinates(x: number, y: number, coordinates: [number, number][][]) {
const inside = GeoOperations.pointWithinRing(x, y, /*This is the outer ring of the polygon */coordinates[0])
if (!inside) {
return false;
@ -737,6 +740,38 @@ export class GeoOperations {
return turf.bearing(a, b)
}
/**
* Returns 'true' if one feature contains the other feature
*
* const pond: Feature<Polygon, any> = {
* "type": "Feature",
* "properties": {"natural":"water","water":"pond"},
* "geometry": {
* "type": "Polygon",
* "coordinates": [[
* [4.362924098968506,50.8435422298544 ],
* [4.363272786140442,50.8435219059949 ],
* [4.363213777542114,50.8437420806679 ],
* [4.362924098968506,50.8435422298544 ]
* ]]}}
* const park: Feature<Polygon, any> = {
* "type": "Feature",
* "properties": {"leisure":"park"},
* "geometry": {
* "type": "Polygon",
* "coordinates": [[
* [ 4.36073541641235,50.84323737103244 ],
* [ 4.36469435691833, 50.8423905305197 ],
* [ 4.36659336090087, 50.8458997374786 ],
* [ 4.36254858970642, 50.8468007074916 ],
* [ 4.36073541641235, 50.8432373710324 ]
* ]]}}
* GeoOperations.completelyWithin(pond, park) // => true
* GeoOperations.completelyWithin(park, pond) // => false
*/
static completelyWithin(feature: Feature<Geometry, any>, possiblyEncloingFeature: Feature<Polygon | MultiPolygon, any>) : boolean {
return booleanWithin(feature, possiblyEncloingFeature);
}
}

View file

@ -155,7 +155,6 @@ export default class MetaTagging {
// Lazy function
const f = (feature: any) => {
const oldValue = feature.properties[key]
delete feature.properties[key]
Object.defineProperty(feature.properties, key, {
configurable: true,

View file

@ -143,6 +143,10 @@ export class OsmConnection {
console.log("Logged out")
this.loadingStatus.setData("not-attempted")
}
public Backend(): string {
return this._oauth_config.url;
}
public AttemptLogin() {
this.loadingStatus.setData("loading")

View file

@ -486,7 +486,7 @@ export default class SimpleMetaTaggers {
const subElements: (string | BaseUIElement)[] = [
new Combine([
"Metatags are extra tags available, in order to display more data or to give better questions.",
"The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags.",
"They are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags.",
"**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object"
]).SetClass("flex-col")

View file

@ -60,7 +60,7 @@ export default interface PointRenderingConfigJson {
rotation?: string | TagRenderingConfigJson;
/**
* A HTML-fragment that is shown below the icon, for example:
* <div style="background: white; display: block">{name}</div>
* <div style="background: white">{name}</div>
*
* If the icon is undefined, then the label is shown in the center of the feature.
* Note that, if the wayhandling hides the icon then no label is shown as well.

View file

@ -0,0 +1,205 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="700pt"
height="700pt"
version="1.1"
viewBox="0 0 700 700"
id="svg154"
sodipodi:docname="childcare.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview156"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:document-units="pt"
showgrid="false"
inkscape:zoom="0.27202157"
inkscape:cx="-84.552117"
inkscape:cy="-124.99009"
inkscape:current-layer="g152" />
<defs
id="defs68">
<symbol
id="v"
overflow="visible">
<path
d="m18.766-1.125c-0.96875 0.5-1.9805 0.875-3.0312 1.125-1.043 0.25781-2.1367 0.39062-3.2812 0.39062-3.3984 0-6.0898-0.94531-8.0781-2.8438-1.9922-1.9062-2.9844-4.4844-2.9844-7.7344 0-3.2578 0.99219-5.8359 2.9844-7.7344 1.9883-1.9062 4.6797-2.8594 8.0781-2.8594 1.1445 0 2.2383 0.13281 3.2812 0.39062 1.0508 0.25 2.0625 0.625 3.0312 1.125v4.2188c-0.98047-0.65625-1.9453-1.1406-2.8906-1.4531-0.94922-0.3125-1.9492-0.46875-3-0.46875-1.875 0-3.3516 0.60547-4.4219 1.8125-1.0742 1.1992-1.6094 2.8555-1.6094 4.9688 0 2.1055 0.53516 3.7617 1.6094 4.9688 1.0703 1.1992 2.5469 1.7969 4.4219 1.7969 1.0508 0 2.0508-0.14844 3-0.45312 0.94531-0.3125 1.9102-0.80078 2.8906-1.4688z"
id="path2" />
</symbol>
<symbol
id="d"
overflow="visible">
<path
d="m13.734-11.141c-0.4375-0.19531-0.87109-0.34375-1.2969-0.4375-0.41797-0.10156-0.83984-0.15625-1.2656-0.15625-1.2617 0-2.2305 0.40625-2.9062 1.2188-0.67969 0.80469-1.0156 1.9531-1.0156 3.4531v7.0625h-4.8906v-15.312h4.8906v2.5156c0.625-1 1.3438-1.7266 2.1562-2.1875 0.82031-0.46875 1.8008-0.70312 2.9375-0.70312 0.16406 0 0.34375 0.011719 0.53125 0.03125 0.19531 0.011719 0.47656 0.039062 0.84375 0.078125z"
id="path5" />
</symbol>
<symbol
id="a"
overflow="visible">
<path
d="m17.641-7.7031v1.4062h-11.453c0.125 1.1484 0.53906 2.0078 1.25 2.5781 0.70703 0.57422 1.7031 0.85938 2.9844 0.85938 1.0312 0 2.082-0.14844 3.1562-0.45312 1.082-0.3125 2.1914-0.77344 3.3281-1.3906v3.7656c-1.1562 0.4375-2.3125 0.76562-3.4688 0.98438-1.1562 0.22656-2.3125 0.34375-3.4688 0.34375-2.7734 0-4.9297-0.70312-6.4688-2.1094-1.5312-1.4062-2.2969-3.3789-2.2969-5.9219 0-2.5 0.75391-4.4609 2.2656-5.8906 1.5078-1.4375 3.582-2.1562 6.2188-2.1562 2.4062 0 4.332 0.73047 5.7812 2.1875 1.4453 1.4492 2.1719 3.3828 2.1719 5.7969zm-5.0312-1.625c0-0.92578-0.27344-1.6719-0.8125-2.2344-0.54297-0.57031-1.25-0.85938-2.125-0.85938-0.94922 0-1.7188 0.26562-2.3125 0.79688s-0.96484 1.2969-1.1094 2.2969z"
id="path8" />
</symbol>
<symbol
id="e"
overflow="visible">
<path
d="m9.2188-6.8906c-1.0234 0-1.793 0.17188-2.3125 0.51562-0.51172 0.34375-0.76562 0.85547-0.76562 1.5312 0 0.625 0.20703 1.1172 0.625 1.4688 0.41406 0.34375 0.98828 0.51562 1.7188 0.51562 0.92578 0 1.7031-0.32812 2.3281-0.98438 0.63281-0.66406 0.95312-1.4922 0.95312-2.4844v-0.5625zm7.4688-1.8438v8.7344h-4.9219v-2.2656c-0.65625 0.92969-1.3984 1.6055-2.2188 2.0312-0.82422 0.41406-1.8242 0.625-3 0.625-1.5859 0-2.8711-0.45703-3.8594-1.375-0.99219-0.92578-1.4844-2.1289-1.4844-3.6094 0-1.7891 0.61328-3.1016 1.8438-3.9375 1.2383-0.84375 3.1797-1.2656 5.8281-1.2656h2.8906v-0.39062c0-0.76953-0.30859-1.332-0.92188-1.6875-0.61719-0.36328-1.5703-0.54688-2.8594-0.54688-1.0547 0-2.0312 0.10547-2.9375 0.3125-0.89844 0.21094-1.7305 0.52344-2.5 0.9375v-3.7344c1.0391-0.25 2.0859-0.44141 3.1406-0.57812 1.0625-0.13281 2.125-0.20312 3.1875-0.20312 2.7578 0 4.75 0.54688 5.9688 1.6406 1.2266 1.0859 1.8438 2.8555 1.8438 5.3125z"
id="path11" />
</symbol>
<symbol
id="c"
overflow="visible">
<path
d="m7.7031-19.656v4.3438h5.0469v3.5h-5.0469v6.5c0 0.71094 0.14062 1.1875 0.42188 1.4375s0.83594 0.375 1.6719 0.375h2.5156v3.5h-4.1875c-1.9375 0-3.3125-0.39844-4.125-1.2031-0.80469-0.8125-1.2031-2.1797-1.2031-4.1094v-6.5h-2.4219v-3.5h2.4219v-4.3438z"
id="path14" />
</symbol>
<symbol
id="k"
overflow="visible">
<path
d="m12.766-13.078v-8.2031h4.9219v21.281h-4.9219v-2.2188c-0.66797 0.90625-1.4062 1.5703-2.2188 1.9844s-1.7578 0.625-2.8281 0.625c-1.8867 0-3.4336-0.75-4.6406-2.25-1.2109-1.5-1.8125-3.4258-1.8125-5.7812 0-2.3633 0.60156-4.2969 1.8125-5.7969 1.207-1.5 2.7539-2.25 4.6406-2.25 1.0625 0 2 0.21484 2.8125 0.64062 0.82031 0.42969 1.5664 1.0859 2.2344 1.9688zm-3.2188 9.9219c1.0391 0 1.8359-0.37891 2.3906-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3516-1.1562-2.3906-1.1562-1.043 0-1.8398 0.38672-2.3906 1.1562-0.55469 0.76172-0.82812 1.8711-0.82812 3.3281 0 1.4609 0.27344 2.5742 0.82812 3.3438 0.55078 0.76172 1.3477 1.1406 2.3906 1.1406z"
id="path17" />
</symbol>
<symbol
id="j"
overflow="visible">
<path
d="m10.5-3.1562c1.0508 0 1.8516-0.37891 2.4062-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3555-1.1562-2.4062-1.1562-1.0547 0-1.8594 0.38672-2.4219 1.1562-0.55469 0.77344-0.82812 1.8828-0.82812 3.3281 0 1.4492 0.27344 2.5586 0.82812 3.3281 0.5625 0.77344 1.3672 1.1562 2.4219 1.1562zm-3.25-9.9219c0.67578-0.88281 1.4219-1.5391 2.2344-1.9688 0.82031-0.42578 1.7656-0.64062 2.8281-0.64062 1.8945 0 3.4453 0.75 4.6562 2.25 1.207 1.5 1.8125 3.4336 1.8125 5.7969 0 2.3555-0.60547 4.2812-1.8125 5.7812-1.2109 1.5-2.7617 2.25-4.6562 2.25-1.0625 0-2.0078-0.21094-2.8281-0.625-0.8125-0.42578-1.5586-1.0859-2.2344-1.9844v2.2188h-4.8906v-21.281h4.8906z"
id="path20" />
</symbol>
<symbol
id="i"
overflow="visible">
<path
d="m0.34375-15.312h4.8906l4.125 10.391 3.5-10.391h4.8906l-6.4375 16.766c-0.64844 1.6953-1.4023 2.8828-2.2656 3.5625-0.86719 0.6875-2 1.0312-3.4062 1.0312h-2.8438v-3.2188h1.5312c0.83203 0 1.4375-0.13672 1.8125-0.40625 0.38281-0.26172 0.67969-0.73047 0.89062-1.4062l0.14062-0.42188z"
id="path23" />
</symbol>
<symbol
id="h"
overflow="visible">
<path
d="m7.8281-16.438v12.453h1.8906c2.1562 0 3.8008-0.53125 4.9375-1.5938 1.1328-1.0625 1.7031-2.6133 1.7031-4.6562 0-2.0195-0.57031-3.5547-1.7031-4.6094-1.125-1.0625-2.7734-1.5938-4.9375-1.5938zm-5.25-3.9688h5.5469c3.0938 0 5.3984 0.21875 6.9219 0.65625 1.5195 0.4375 2.8203 1.1875 3.9062 2.25 0.95703 0.91797 1.6641 1.9805 2.125 3.1875 0.46875 1.1992 0.70312 2.5586 0.70312 4.0781 0 1.543-0.23438 2.918-0.70312 4.125-0.46094 1.2109-1.168 2.2773-2.125 3.2031-1.0938 1.0547-2.4062 1.8047-3.9375 2.25-1.5312 0.4375-3.8281 0.65625-6.8906 0.65625h-5.5469z"
id="path26" />
</symbol>
<symbol
id="g"
overflow="visible">
<path
d="m2.3594-15.312h4.8906v15.312h-4.8906zm0-5.9688h4.8906v4h-4.8906z"
id="path29" />
</symbol>
<symbol
id="u"
overflow="visible">
<path
d="m12.766-2.5938c-0.66797 0.88672-1.4062 1.543-2.2188 1.9688-0.8125 0.41797-1.7578 0.625-2.8281 0.625-1.8672 0-3.4062-0.73438-4.625-2.2031-1.2188-1.4766-1.8281-3.3516-1.8281-5.625 0-2.2891 0.60938-4.1641 1.8281-5.625 1.2188-1.4688 2.7578-2.2031 4.625-2.2031 1.0703 0 2.0156 0.21484 2.8281 0.64062 0.8125 0.41797 1.5508 1.0742 2.2188 1.9688v-2.2656h4.9219v13.766c0 2.457-0.77734 4.3359-2.3281 5.6406-1.5547 1.3008-3.8086 1.9531-6.7656 1.9531-0.94922 0-1.8711-0.074219-2.7656-0.21875-0.89844-0.14844-1.7969-0.37109-2.7031-0.67188v-3.8125c0.86328 0.48828 1.7031 0.85156 2.5156 1.0938 0.82031 0.23828 1.6484 0.35938 2.4844 0.35938 1.6016 0 2.7734-0.35156 3.5156-1.0469 0.75-0.69922 1.125-1.7969 1.125-3.2969zm-3.2188-9.5312c-1.0117 0-1.8047 0.375-2.375 1.125-0.5625 0.74219-0.84375 1.7969-0.84375 3.1719 0 1.3984 0.26953 2.4609 0.8125 3.1875 0.55078 0.71875 1.3516 1.0781 2.4062 1.0781 1.0195 0 1.8125-0.36719 2.375-1.1094 0.5625-0.75 0.84375-1.8008 0.84375-3.1562 0-1.375-0.28125-2.4297-0.84375-3.1719-0.5625-0.75-1.3555-1.125-2.375-1.125z"
id="path32" />
</symbol>
<symbol
id="b"
overflow="visible">
<path
d="m9.6406-12.188c-1.0859 0-1.9141 0.39062-2.4844 1.1719-0.57422 0.78125-0.85938 1.9062-0.85938 3.375s0.28516 2.5938 0.85938 3.375c0.57031 0.77344 1.3984 1.1562 2.4844 1.1562 1.0625 0 1.875-0.38281 2.4375-1.1562 0.57031-0.78125 0.85938-1.9062 0.85938-3.375s-0.28906-2.5938-0.85938-3.375c-0.5625-0.78125-1.375-1.1719-2.4375-1.1719zm0-3.5c2.6328 0 4.6914 0.71484 6.1719 2.1406 1.4766 1.418 2.2188 3.3867 2.2188 5.9062 0 2.5117-0.74219 4.4805-2.2188 5.9062-1.4805 1.418-3.5391 2.125-6.1719 2.125-2.6484 0-4.7148-0.70703-6.2031-2.125-1.4922-1.4258-2.2344-3.3945-2.2344-5.9062 0-2.5195 0.74219-4.4883 2.2344-5.9062 1.4883-1.4258 3.5547-2.1406 6.2031-2.1406z"
id="path35" />
</symbol>
<symbol
id="f"
overflow="visible">
<path
d="m2.5781-20.406h5.875l7.4219 14v-14h4.9844v20.406h-5.875l-7.4219-14v14h-4.9844z"
id="path38" />
</symbol>
<symbol
id="t"
overflow="visible">
<path
d="m0.42188-15.312h4.8906l3.8281 10.578 3.7969-10.578h4.9062l-6.0312 15.312h-5.375z"
id="path41" />
</symbol>
<symbol
id="s"
overflow="visible">
<path
d="m12.422-21.281v3.2188h-2.7031c-0.6875 0-1.1719 0.125-1.4531 0.375-0.27344 0.25-0.40625 0.6875-0.40625 1.3125v1.0625h4.1875v3.5h-4.1875v11.812h-4.8906v-11.812h-2.4375v-3.5h2.4375v-1.0625c0-1.6641 0.46094-2.8984 1.3906-3.7031 0.92578-0.80078 2.3672-1.2031 4.3281-1.2031z"
id="path44" />
</symbol>
<symbol
id="r"
overflow="visible">
<path
d="m16.547-12.766c0.61328-0.94531 1.3477-1.6719 2.2031-2.1719 0.85156-0.5 1.7891-0.75 2.8125-0.75 1.7578 0 3.0977 0.54688 4.0156 1.6406 0.92578 1.0859 1.3906 2.6562 1.3906 4.7188v9.3281h-4.9219v-7.9844-0.35938c0.007813-0.13281 0.015625-0.32031 0.015625-0.5625 0-1.082-0.16406-1.8633-0.48438-2.3438-0.3125-0.48828-0.82422-0.73438-1.5312-0.73438-0.92969 0-1.6484 0.38672-2.1562 1.1562-0.51172 0.76172-0.77344 1.8672-0.78125 3.3125v7.5156h-4.9219v-7.9844c0-1.6953-0.14844-2.7852-0.4375-3.2656-0.29297-0.48828-0.8125-0.73438-1.5625-0.73438-0.9375 0-1.6641 0.38672-2.1719 1.1562-0.51172 0.76172-0.76562 1.8594-0.76562 3.2969v7.5312h-4.9219v-15.312h4.9219v2.2344c0.60156-0.86328 1.2891-1.5156 2.0625-1.9531 0.78125-0.4375 1.6406-0.65625 2.5781-0.65625 1.0625 0 2 0.25781 2.8125 0.76562 0.8125 0.51172 1.4258 1.2305 1.8438 2.1562z"
id="path47" />
</symbol>
<symbol
id="q"
overflow="visible">
<path
d="m17.75-9.3281v9.3281h-4.9219v-7.1094c0-1.3438-0.03125-2.2656-0.09375-2.7656s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-21.281h4.8906v8.2031c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path50" />
</symbol>
<symbol
id="p"
overflow="visible">
<path
d="m2.1875-5.9688v-9.3438h4.9219v1.5312c0 0.83594-0.007813 1.875-0.015625 3.125-0.011719 1.25-0.015625 2.0859-0.015625 2.5 0 1.2422 0.03125 2.1328 0.09375 2.6719 0.070313 0.54297 0.17969 0.93359 0.32812 1.1719 0.20703 0.32422 0.47266 0.57422 0.79688 0.75 0.32031 0.16797 0.69141 0.25 1.1094 0.25 1.0195 0 1.8203-0.39062 2.4062-1.1719 0.58203-0.78125 0.875-1.8672 0.875-3.2656v-7.5625h4.8906v15.312h-4.8906v-2.2188c-0.74219 0.89844-1.5234 1.5586-2.3438 1.9844-0.82422 0.41406-1.7344 0.625-2.7344 0.625-1.7617 0-3.1055-0.53906-4.0312-1.625-0.92969-1.082-1.3906-2.6602-1.3906-4.7344z"
id="path53" />
</symbol>
<symbol
id="o"
overflow="visible">
<path
d="m17.75-9.3281v9.3281h-4.9219v-7.1406c0-1.3203-0.03125-2.2344-0.09375-2.7344s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-15.312h4.8906v2.2344c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path56" />
</symbol>
<symbol
id="n"
overflow="visible">
<path
d="m2.5781-20.406h8.7344c2.5938 0 4.582 0.57812 5.9688 1.7344 1.3945 1.1484 2.0938 2.7891 2.0938 4.9219 0 2.1367-0.69922 3.7812-2.0938 4.9375-1.3867 1.1562-3.375 1.7344-5.9688 1.7344h-3.4844v7.0781h-5.25zm5.25 3.8125v5.7031h2.9219c1.0195 0 1.8047-0.25 2.3594-0.75 0.5625-0.5 0.84375-1.2031 0.84375-2.1094 0-0.91406-0.28125-1.6172-0.84375-2.1094-0.55469-0.48828-1.3398-0.73438-2.3594-0.73438z"
id="path59" />
</symbol>
<symbol
id="m"
overflow="visible">
<path
d="m2.3594-15.312h4.8906v15.031c0 2.0508-0.49609 3.6172-1.4844 4.7031-0.98047 1.082-2.4062 1.625-4.2812 1.625h-2.4219v-3.2188h0.85938c0.92578 0 1.5625-0.21094 1.9062-0.625 0.35156-0.41797 0.53125-1.2461 0.53125-2.4844zm0-5.9688h4.8906v4h-4.8906z"
id="path62" />
</symbol>
<symbol
id="l"
overflow="visible">
<path
d="m14.719-14.828v3.9844c-0.65625-0.45703-1.3242-0.79688-2-1.0156-0.66797-0.21875-1.3594-0.32812-2.0781-0.32812-1.3672 0-2.4336 0.40234-3.2031 1.2031-0.76172 0.79297-1.1406 1.9062-1.1406 3.3438 0 1.4297 0.37891 2.543 1.1406 3.3438 0.76953 0.79297 1.8359 1.1875 3.2031 1.1875 0.75781 0 1.4844-0.10938 2.1719-0.32812 0.6875-0.22656 1.3203-0.56641 1.9062-1.0156v4c-0.76172 0.28125-1.5391 0.48828-2.3281 0.625-0.78125 0.14453-1.5742 0.21875-2.375 0.21875-2.7617 0-4.9219-0.70703-6.4844-2.125-1.5547-1.4141-2.3281-3.3828-2.3281-5.9062 0-2.5312 0.77344-4.5039 2.3281-5.9219 1.5625-1.4141 3.7227-2.125 6.4844-2.125 0.80078 0 1.5938 0.074219 2.375 0.21875 0.78125 0.13672 1.5547 0.35156 2.3281 0.64062z"
id="path65" />
</symbol>
</defs>
<g
id="g152">
<path
d="m 665.72555,461.26937 c -11.44488,-19.82013 -36.78258,-26.61858 -56.62229,-15.16953 l -151.84212,87.67239 c -0.76012,4.37903 -2.11786,8.99243 -4.48905,13.73029 -4.76149,9.48001 -19.58638,31.25082 -54.39368,29.00874 -29.15682,-1.87885 -158.08372,-40.88858 -163.77458,-42.62398 -0.14342,-0.0431 -13.62994,-4.3504 -27.0102,-0.43983 -4.12093,1.22862 -8.38051,-0.61671 -10.43607,-4.16865 -0.349,-0.61671 -0.64539,-1.29079 -0.85095,-1.99352 -1.41024,-4.81888 1.34341,-9.87677 6.16706,-11.28713 18.99403,-5.57423 37.12648,0.38245 37.62336,0.55456 36.72996,11.1437 136.98468,40.34886 159.46666,41.80156 23.02782,1.48672 33.01927,-11.22496 36.92577,-18.98424 2.83968,-7.20439 3.49468,-12.88339 2.32812,-19.82502 -3.63335,-21.83335 -26.63326,-26.28814 -26.63326,-26.28814 0.005,-0.005 -195.7903,-70.23264 -242.62675,-80.57288 -46.83155,-10.32617 -70.33299,5.58378 -70.33299,5.58378 l -85.807267,49.54114 89.473897,154.98739 53.4146,-30.83471 c 0,0 121.26564,28.05292 190.44211,48.79582 69.18503,20.76738 88.40792,1.50117 88.40792,1.50117 L 650.5521,517.90396 c 19.82012,-11.44966 26.61857,-36.79605 15.16952,-56.62719 z m -211.03937,52.19932 146.70198,-84.69356 c -12.58232,-7.87372 -28.98548,-8.72465 -42.75371,-0.77925 l -113.85038,65.7338 c 4.66112,5.78939 8.0076,12.53949 9.90553,19.73935 z m -35.2332,-37.01634 c 4.43643,1.38637 8.51427,3.35125 12.27636,5.70813 l 122.88601,-70.94003 c -12.58232,-7.88325 -28.99038,-8.72465 -42.7586,-0.77924 l -106.61258,61.5507 z m 88.36998,-82.76723 c -12.58232,-7.88326 -28.98548,-8.72942 -42.74392,-0.7888 l -109.84474,63.4244 28.59263,8.9589 z"
fill-rule="evenodd"
id="path70"
style="stroke-width:1.22384" />
<path
d="m 299.45401,149.72805 c -0.95134,-0.94656 -2.00306,-1.67801 -3.10269,-2.32334 V 93.159125 c 0,-24.897849 -20.17871,-45.076562 -45.07656,-45.076562 -24.89295,0 -45.07656,20.178713 -45.07656,45.076562 v 54.250485 c -1.10432,0.63582 -2.15127,1.37682 -3.09779,2.31857 l -49.48974,49.48973 c -5.93282,5.94237 -5.93282,15.55137 0,21.47966 5.92805,5.93282 15.55137,5.93282 21.46987,0 l 30.634,-30.634 -37.28925,103.07568 h 42.6766 v 54.45119 c 0,8.39005 6.80763,15.18789 15.19278,15.18789 8.39005,0 15.19278,-6.80763 15.19278,-15.18789 v -54.45119 h 19.57169 v 54.45119 c 0,8.39005 6.7933,15.18789 15.17809,15.18789 8.38051,0 15.18788,-6.80763 15.18788,-15.18789 v -54.45119 h 42.68151 l -37.30272,-103.08914 30.64379,30.64868 c 5.92805,5.93283 15.54157,5.92316 21.47966,0 5.92805,-5.92804 5.92805,-15.54157 0,-21.47965 z"
id="path72"
style="stroke-width:1.22384" />
<path
d="m 525.73022,201.75359 -49.47505,-49.48484 c -2.98789,-2.98311 -6.90798,-4.46029 -10.78511,-4.44597 H 390.6627 c -3.901,0 -7.80677,1.48195 -10.7517,4.44597 l -49.49341,49.48974 c -5.92805,5.92805 -5.92805,15.54157 0,21.47966 5.92805,5.93282 15.55136,5.93282 21.47966,0 l 31.10762,-31.11742 v 101.71721 h 4.91446 V 350.12 c 0,8.38051 6.8124,15.1781 15.20257,15.1781 8.39005,0 15.1781,-6.79808 15.1781,-15.1781 v -56.28206 h 19.57168 V 350.12 c 0,8.38051 6.78376,15.1781 15.1781,15.1781 8.3805,0 15.19277,-6.79808 15.19277,-15.1781 v -56.28206 h 4.91447 v -101.727 l 31.11741,31.10762 c 5.92805,5.94714 15.54158,5.93282 21.46497,0 5.92805,-5.92804 5.92805,-15.53667 -0.01,-21.46497 z"
id="path74"
style="stroke-width:1.22384" />
<path
d="m 473.15396,95.697864 c 0,24.897846 -20.18361,45.076556 -45.07657,45.076556 -24.89295,0 -45.07656,-20.17871 -45.07656,-45.076556 0,-24.892954 20.18361,-45.071667 45.07656,-45.071667 24.89296,0 45.07657,20.178713 45.07657,45.071667"
id="path76"
style="stroke-width:1.22384" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,158 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 960 960"
style="enable-background:new 0 0 960 960;"
xml:space="preserve"
sodipodi:docname="kindergarten.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs35">
<symbol
id="v"
overflow="visible"><path
d="m18.766-1.125c-0.96875 0.5-1.9805 0.875-3.0312 1.125-1.043 0.25781-2.1367 0.39062-3.2812 0.39062-3.3984 0-6.0898-0.94531-8.0781-2.8438-1.9922-1.9062-2.9844-4.4844-2.9844-7.7344 0-3.2578 0.99219-5.8359 2.9844-7.7344 1.9883-1.9062 4.6797-2.8594 8.0781-2.8594 1.1445 0 2.2383 0.13281 3.2812 0.39062 1.0508 0.25 2.0625 0.625 3.0312 1.125v4.2188c-0.98047-0.65625-1.9453-1.1406-2.8906-1.4531-0.94922-0.3125-1.9492-0.46875-3-0.46875-1.875 0-3.3516 0.60547-4.4219 1.8125-1.0742 1.1992-1.6094 2.8555-1.6094 4.9688 0 2.1055 0.53516 3.7617 1.6094 4.9688 1.0703 1.1992 2.5469 1.7969 4.4219 1.7969 1.0508 0 2.0508-0.14844 3-0.45312 0.94531-0.3125 1.9102-0.80078 2.8906-1.4688z"
id="path2" /></symbol><symbol
id="d"
overflow="visible"><path
d="m13.734-11.141c-0.4375-0.19531-0.87109-0.34375-1.2969-0.4375-0.41797-0.10156-0.83984-0.15625-1.2656-0.15625-1.2617 0-2.2305 0.40625-2.9062 1.2188-0.67969 0.80469-1.0156 1.9531-1.0156 3.4531v7.0625h-4.8906v-15.312h4.8906v2.5156c0.625-1 1.3438-1.7266 2.1562-2.1875 0.82031-0.46875 1.8008-0.70312 2.9375-0.70312 0.16406 0 0.34375 0.011719 0.53125 0.03125 0.19531 0.011719 0.47656 0.039062 0.84375 0.078125z"
id="path5" /></symbol><symbol
id="a"
overflow="visible"><path
d="m17.641-7.7031v1.4062h-11.453c0.125 1.1484 0.53906 2.0078 1.25 2.5781 0.70703 0.57422 1.7031 0.85938 2.9844 0.85938 1.0312 0 2.082-0.14844 3.1562-0.45312 1.082-0.3125 2.1914-0.77344 3.3281-1.3906v3.7656c-1.1562 0.4375-2.3125 0.76562-3.4688 0.98438-1.1562 0.22656-2.3125 0.34375-3.4688 0.34375-2.7734 0-4.9297-0.70312-6.4688-2.1094-1.5312-1.4062-2.2969-3.3789-2.2969-5.9219 0-2.5 0.75391-4.4609 2.2656-5.8906 1.5078-1.4375 3.582-2.1562 6.2188-2.1562 2.4062 0 4.332 0.73047 5.7812 2.1875 1.4453 1.4492 2.1719 3.3828 2.1719 5.7969zm-5.0312-1.625c0-0.92578-0.27344-1.6719-0.8125-2.2344-0.54297-0.57031-1.25-0.85938-2.125-0.85938-0.94922 0-1.7188 0.26562-2.3125 0.79688s-0.96484 1.2969-1.1094 2.2969z"
id="path8" /></symbol><symbol
id="e"
overflow="visible"><path
d="m9.2188-6.8906c-1.0234 0-1.793 0.17188-2.3125 0.51562-0.51172 0.34375-0.76562 0.85547-0.76562 1.5312 0 0.625 0.20703 1.1172 0.625 1.4688 0.41406 0.34375 0.98828 0.51562 1.7188 0.51562 0.92578 0 1.7031-0.32812 2.3281-0.98438 0.63281-0.66406 0.95312-1.4922 0.95312-2.4844v-0.5625zm7.4688-1.8438v8.7344h-4.9219v-2.2656c-0.65625 0.92969-1.3984 1.6055-2.2188 2.0312-0.82422 0.41406-1.8242 0.625-3 0.625-1.5859 0-2.8711-0.45703-3.8594-1.375-0.99219-0.92578-1.4844-2.1289-1.4844-3.6094 0-1.7891 0.61328-3.1016 1.8438-3.9375 1.2383-0.84375 3.1797-1.2656 5.8281-1.2656h2.8906v-0.39062c0-0.76953-0.30859-1.332-0.92188-1.6875-0.61719-0.36328-1.5703-0.54688-2.8594-0.54688-1.0547 0-2.0312 0.10547-2.9375 0.3125-0.89844 0.21094-1.7305 0.52344-2.5 0.9375v-3.7344c1.0391-0.25 2.0859-0.44141 3.1406-0.57812 1.0625-0.13281 2.125-0.20312 3.1875-0.20312 2.7578 0 4.75 0.54688 5.9688 1.6406 1.2266 1.0859 1.8438 2.8555 1.8438 5.3125z"
id="path11" /></symbol><symbol
id="c"
overflow="visible"><path
d="m7.7031-19.656v4.3438h5.0469v3.5h-5.0469v6.5c0 0.71094 0.14062 1.1875 0.42188 1.4375s0.83594 0.375 1.6719 0.375h2.5156v3.5h-4.1875c-1.9375 0-3.3125-0.39844-4.125-1.2031-0.80469-0.8125-1.2031-2.1797-1.2031-4.1094v-6.5h-2.4219v-3.5h2.4219v-4.3438z"
id="path14" /></symbol><symbol
id="k"
overflow="visible"><path
d="m12.766-13.078v-8.2031h4.9219v21.281h-4.9219v-2.2188c-0.66797 0.90625-1.4062 1.5703-2.2188 1.9844s-1.7578 0.625-2.8281 0.625c-1.8867 0-3.4336-0.75-4.6406-2.25-1.2109-1.5-1.8125-3.4258-1.8125-5.7812 0-2.3633 0.60156-4.2969 1.8125-5.7969 1.207-1.5 2.7539-2.25 4.6406-2.25 1.0625 0 2 0.21484 2.8125 0.64062 0.82031 0.42969 1.5664 1.0859 2.2344 1.9688zm-3.2188 9.9219c1.0391 0 1.8359-0.37891 2.3906-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3516-1.1562-2.3906-1.1562-1.043 0-1.8398 0.38672-2.3906 1.1562-0.55469 0.76172-0.82812 1.8711-0.82812 3.3281 0 1.4609 0.27344 2.5742 0.82812 3.3438 0.55078 0.76172 1.3477 1.1406 2.3906 1.1406z"
id="path17" /></symbol><symbol
id="j"
overflow="visible"><path
d="m10.5-3.1562c1.0508 0 1.8516-0.37891 2.4062-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3555-1.1562-2.4062-1.1562-1.0547 0-1.8594 0.38672-2.4219 1.1562-0.55469 0.77344-0.82812 1.8828-0.82812 3.3281 0 1.4492 0.27344 2.5586 0.82812 3.3281 0.5625 0.77344 1.3672 1.1562 2.4219 1.1562zm-3.25-9.9219c0.67578-0.88281 1.4219-1.5391 2.2344-1.9688 0.82031-0.42578 1.7656-0.64062 2.8281-0.64062 1.8945 0 3.4453 0.75 4.6562 2.25 1.207 1.5 1.8125 3.4336 1.8125 5.7969 0 2.3555-0.60547 4.2812-1.8125 5.7812-1.2109 1.5-2.7617 2.25-4.6562 2.25-1.0625 0-2.0078-0.21094-2.8281-0.625-0.8125-0.42578-1.5586-1.0859-2.2344-1.9844v2.2188h-4.8906v-21.281h4.8906z"
id="path20" /></symbol><symbol
id="i"
overflow="visible"><path
d="m0.34375-15.312h4.8906l4.125 10.391 3.5-10.391h4.8906l-6.4375 16.766c-0.64844 1.6953-1.4023 2.8828-2.2656 3.5625-0.86719 0.6875-2 1.0312-3.4062 1.0312h-2.8438v-3.2188h1.5312c0.83203 0 1.4375-0.13672 1.8125-0.40625 0.38281-0.26172 0.67969-0.73047 0.89062-1.4062l0.14062-0.42188z"
id="path23" /></symbol><symbol
id="h"
overflow="visible"><path
d="m7.8281-16.438v12.453h1.8906c2.1562 0 3.8008-0.53125 4.9375-1.5938 1.1328-1.0625 1.7031-2.6133 1.7031-4.6562 0-2.0195-0.57031-3.5547-1.7031-4.6094-1.125-1.0625-2.7734-1.5938-4.9375-1.5938zm-5.25-3.9688h5.5469c3.0938 0 5.3984 0.21875 6.9219 0.65625 1.5195 0.4375 2.8203 1.1875 3.9062 2.25 0.95703 0.91797 1.6641 1.9805 2.125 3.1875 0.46875 1.1992 0.70312 2.5586 0.70312 4.0781 0 1.543-0.23438 2.918-0.70312 4.125-0.46094 1.2109-1.168 2.2773-2.125 3.2031-1.0938 1.0547-2.4062 1.8047-3.9375 2.25-1.5312 0.4375-3.8281 0.65625-6.8906 0.65625h-5.5469z"
id="path26" /></symbol><symbol
id="g"
overflow="visible"><path
d="m2.3594-15.312h4.8906v15.312h-4.8906zm0-5.9688h4.8906v4h-4.8906z"
id="path29" /></symbol><symbol
id="u"
overflow="visible"><path
d="m12.766-2.5938c-0.66797 0.88672-1.4062 1.543-2.2188 1.9688-0.8125 0.41797-1.7578 0.625-2.8281 0.625-1.8672 0-3.4062-0.73438-4.625-2.2031-1.2188-1.4766-1.8281-3.3516-1.8281-5.625 0-2.2891 0.60938-4.1641 1.8281-5.625 1.2188-1.4688 2.7578-2.2031 4.625-2.2031 1.0703 0 2.0156 0.21484 2.8281 0.64062 0.8125 0.41797 1.5508 1.0742 2.2188 1.9688v-2.2656h4.9219v13.766c0 2.457-0.77734 4.3359-2.3281 5.6406-1.5547 1.3008-3.8086 1.9531-6.7656 1.9531-0.94922 0-1.8711-0.074219-2.7656-0.21875-0.89844-0.14844-1.7969-0.37109-2.7031-0.67188v-3.8125c0.86328 0.48828 1.7031 0.85156 2.5156 1.0938 0.82031 0.23828 1.6484 0.35938 2.4844 0.35938 1.6016 0 2.7734-0.35156 3.5156-1.0469 0.75-0.69922 1.125-1.7969 1.125-3.2969zm-3.2188-9.5312c-1.0117 0-1.8047 0.375-2.375 1.125-0.5625 0.74219-0.84375 1.7969-0.84375 3.1719 0 1.3984 0.26953 2.4609 0.8125 3.1875 0.55078 0.71875 1.3516 1.0781 2.4062 1.0781 1.0195 0 1.8125-0.36719 2.375-1.1094 0.5625-0.75 0.84375-1.8008 0.84375-3.1562 0-1.375-0.28125-2.4297-0.84375-3.1719-0.5625-0.75-1.3555-1.125-2.375-1.125z"
id="path32" /></symbol><symbol
id="b"
overflow="visible"><path
d="m9.6406-12.188c-1.0859 0-1.9141 0.39062-2.4844 1.1719-0.57422 0.78125-0.85938 1.9062-0.85938 3.375s0.28516 2.5938 0.85938 3.375c0.57031 0.77344 1.3984 1.1562 2.4844 1.1562 1.0625 0 1.875-0.38281 2.4375-1.1562 0.57031-0.78125 0.85938-1.9062 0.85938-3.375s-0.28906-2.5938-0.85938-3.375c-0.5625-0.78125-1.375-1.1719-2.4375-1.1719zm0-3.5c2.6328 0 4.6914 0.71484 6.1719 2.1406 1.4766 1.418 2.2188 3.3867 2.2188 5.9062 0 2.5117-0.74219 4.4805-2.2188 5.9062-1.4805 1.418-3.5391 2.125-6.1719 2.125-2.6484 0-4.7148-0.70703-6.2031-2.125-1.4922-1.4258-2.2344-3.3945-2.2344-5.9062 0-2.5195 0.74219-4.4883 2.2344-5.9062 1.4883-1.4258 3.5547-2.1406 6.2031-2.1406z"
id="path35" /></symbol><symbol
id="f"
overflow="visible"><path
d="m2.5781-20.406h5.875l7.4219 14v-14h4.9844v20.406h-5.875l-7.4219-14v14h-4.9844z"
id="path38" /></symbol><symbol
id="t"
overflow="visible"><path
d="m0.42188-15.312h4.8906l3.8281 10.578 3.7969-10.578h4.9062l-6.0312 15.312h-5.375z"
id="path41" /></symbol><symbol
id="s"
overflow="visible"><path
d="m12.422-21.281v3.2188h-2.7031c-0.6875 0-1.1719 0.125-1.4531 0.375-0.27344 0.25-0.40625 0.6875-0.40625 1.3125v1.0625h4.1875v3.5h-4.1875v11.812h-4.8906v-11.812h-2.4375v-3.5h2.4375v-1.0625c0-1.6641 0.46094-2.8984 1.3906-3.7031 0.92578-0.80078 2.3672-1.2031 4.3281-1.2031z"
id="path44" /></symbol><symbol
id="r"
overflow="visible"><path
d="m16.547-12.766c0.61328-0.94531 1.3477-1.6719 2.2031-2.1719 0.85156-0.5 1.7891-0.75 2.8125-0.75 1.7578 0 3.0977 0.54688 4.0156 1.6406 0.92578 1.0859 1.3906 2.6562 1.3906 4.7188v9.3281h-4.9219v-7.9844-0.35938c0.007813-0.13281 0.015625-0.32031 0.015625-0.5625 0-1.082-0.16406-1.8633-0.48438-2.3438-0.3125-0.48828-0.82422-0.73438-1.5312-0.73438-0.92969 0-1.6484 0.38672-2.1562 1.1562-0.51172 0.76172-0.77344 1.8672-0.78125 3.3125v7.5156h-4.9219v-7.9844c0-1.6953-0.14844-2.7852-0.4375-3.2656-0.29297-0.48828-0.8125-0.73438-1.5625-0.73438-0.9375 0-1.6641 0.38672-2.1719 1.1562-0.51172 0.76172-0.76562 1.8594-0.76562 3.2969v7.5312h-4.9219v-15.312h4.9219v2.2344c0.60156-0.86328 1.2891-1.5156 2.0625-1.9531 0.78125-0.4375 1.6406-0.65625 2.5781-0.65625 1.0625 0 2 0.25781 2.8125 0.76562 0.8125 0.51172 1.4258 1.2305 1.8438 2.1562z"
id="path47" /></symbol><symbol
id="q"
overflow="visible"><path
d="m17.75-9.3281v9.3281h-4.9219v-7.1094c0-1.3438-0.03125-2.2656-0.09375-2.7656s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-21.281h4.8906v8.2031c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path50" /></symbol><symbol
id="p"
overflow="visible"><path
d="m2.1875-5.9688v-9.3438h4.9219v1.5312c0 0.83594-0.007813 1.875-0.015625 3.125-0.011719 1.25-0.015625 2.0859-0.015625 2.5 0 1.2422 0.03125 2.1328 0.09375 2.6719 0.070313 0.54297 0.17969 0.93359 0.32812 1.1719 0.20703 0.32422 0.47266 0.57422 0.79688 0.75 0.32031 0.16797 0.69141 0.25 1.1094 0.25 1.0195 0 1.8203-0.39062 2.4062-1.1719 0.58203-0.78125 0.875-1.8672 0.875-3.2656v-7.5625h4.8906v15.312h-4.8906v-2.2188c-0.74219 0.89844-1.5234 1.5586-2.3438 1.9844-0.82422 0.41406-1.7344 0.625-2.7344 0.625-1.7617 0-3.1055-0.53906-4.0312-1.625-0.92969-1.082-1.3906-2.6602-1.3906-4.7344z"
id="path53" /></symbol><symbol
id="o"
overflow="visible"><path
d="m17.75-9.3281v9.3281h-4.9219v-7.1406c0-1.3203-0.03125-2.2344-0.09375-2.7344s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-15.312h4.8906v2.2344c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path56" /></symbol><symbol
id="n"
overflow="visible"><path
d="m2.5781-20.406h8.7344c2.5938 0 4.582 0.57812 5.9688 1.7344 1.3945 1.1484 2.0938 2.7891 2.0938 4.9219 0 2.1367-0.69922 3.7812-2.0938 4.9375-1.3867 1.1562-3.375 1.7344-5.9688 1.7344h-3.4844v7.0781h-5.25zm5.25 3.8125v5.7031h2.9219c1.0195 0 1.8047-0.25 2.3594-0.75 0.5625-0.5 0.84375-1.2031 0.84375-2.1094 0-0.91406-0.28125-1.6172-0.84375-2.1094-0.55469-0.48828-1.3398-0.73438-2.3594-0.73438z"
id="path59" /></symbol><symbol
id="m"
overflow="visible"><path
d="m2.3594-15.312h4.8906v15.031c0 2.0508-0.49609 3.6172-1.4844 4.7031-0.98047 1.082-2.4062 1.625-4.2812 1.625h-2.4219v-3.2188h0.85938c0.92578 0 1.5625-0.21094 1.9062-0.625 0.35156-0.41797 0.53125-1.2461 0.53125-2.4844zm0-5.9688h4.8906v4h-4.8906z"
id="path62" /></symbol><symbol
id="l"
overflow="visible"><path
d="m14.719-14.828v3.9844c-0.65625-0.45703-1.3242-0.79688-2-1.0156-0.66797-0.21875-1.3594-0.32812-2.0781-0.32812-1.3672 0-2.4336 0.40234-3.2031 1.2031-0.76172 0.79297-1.1406 1.9062-1.1406 3.3438 0 1.4297 0.37891 2.543 1.1406 3.3438 0.76953 0.79297 1.8359 1.1875 3.2031 1.1875 0.75781 0 1.4844-0.10938 2.1719-0.32812 0.6875-0.22656 1.3203-0.56641 1.9062-1.0156v4c-0.76172 0.28125-1.5391 0.48828-2.3281 0.625-0.78125 0.14453-1.5742 0.21875-2.375 0.21875-2.7617 0-4.9219-0.70703-6.4844-2.125-1.5547-1.4141-2.3281-3.3828-2.3281-5.9062 0-2.5312 0.77344-4.5039 2.3281-5.9219 1.5625-1.4141 3.7227-2.125 6.4844-2.125 0.80078 0 1.5938 0.074219 2.375 0.21875 0.78125 0.13672 1.5547 0.35156 2.3281 0.64062z"
id="path65" /></symbol></defs><sodipodi:namedview
id="namedview33"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
showguides="false"
inkscape:zoom="0.57562315"
inkscape:cx="616.72294"
inkscape:cy="580.24074"
inkscape:current-layer="Layer_1" />
<style
type="text/css"
id="style2">
.st0{fill:#DD9D57;}
.st1{fill:#C48341;}
.st2{fill:#006837;}
.st3{fill:#004924;}
.st4{fill:#FFFFFF;}
.st5{font-family:'MyriadPro-Bold';}
.st6{font-size:212.6998px;}
</style>
<g
id="g152"
transform="matrix(2.1924201,0,0,2.1924201,-255.5822,36.981846)"
style="fill:#000000;fill-opacity:1"><path
d="m 299.45401,149.72805 c -0.95134,-0.94656 -2.00306,-1.67801 -3.10269,-2.32334 V 93.159125 c 0,-24.897849 -20.17871,-45.076562 -45.07656,-45.076562 -24.89295,0 -45.07656,20.178713 -45.07656,45.076562 v 54.250485 c -1.10432,0.63582 -2.15127,1.37682 -3.09779,2.31857 l -49.48974,49.48973 c -5.93282,5.94237 -5.93282,15.55137 0,21.47966 5.92805,5.93282 15.55137,5.93282 21.46987,0 l 30.634,-30.634 -37.28925,103.07568 h 42.6766 v 54.45119 c 0,8.39005 6.80763,15.18789 15.19278,15.18789 8.39005,0 15.19278,-6.80763 15.19278,-15.18789 v -54.45119 h 19.57169 v 54.45119 c 0,8.39005 6.7933,15.18789 15.17809,15.18789 8.38051,0 15.18788,-6.80763 15.18788,-15.18789 v -54.45119 h 42.68151 l -37.30272,-103.08914 30.64379,30.64868 c 5.92805,5.93283 15.54157,5.92316 21.47966,0 5.92805,-5.92804 5.92805,-15.54157 0,-21.47965 z"
id="path72"
style="fill:#000000;fill-opacity:1;stroke-width:1.22384" /><path
d="m 525.73022,201.75359 -49.47505,-49.48484 c -2.98789,-2.98311 -6.90798,-4.46029 -10.78511,-4.44597 H 390.6627 c -3.901,0 -7.80677,1.48195 -10.7517,4.44597 l -49.49341,49.48974 c -5.92805,5.92805 -5.92805,15.54157 0,21.47966 5.92805,5.93282 15.55136,5.93282 21.47966,0 l 31.10762,-31.11742 v 101.71721 h 4.91446 V 350.12 c 0,8.38051 6.8124,15.1781 15.20257,15.1781 8.39005,0 15.1781,-6.79808 15.1781,-15.1781 v -56.28206 h 19.57168 V 350.12 c 0,8.38051 6.78376,15.1781 15.1781,15.1781 8.3805,0 15.19277,-6.79808 15.19277,-15.1781 v -56.28206 h 4.91447 v -101.727 l 31.11741,31.10762 c 5.92805,5.94714 15.54158,5.93282 21.46497,0 5.92805,-5.92804 5.92805,-15.53667 -0.01,-21.46497 z"
id="path74"
style="fill:#000000;fill-opacity:1;stroke-width:1.22384" /><path
d="m 473.15396,95.697864 c 0,24.897846 -20.18361,45.076556 -45.07657,45.076556 -24.89295,0 -45.07656,-20.17871 -45.07656,-45.076556 0,-24.892954 20.18361,-45.071667 45.07656,-45.071667 24.89296,0 45.07657,20.178713 45.07657,45.071667"
id="path76"
style="fill:#000000;fill-opacity:1;stroke-width:1.22384" /></g></svg>

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -0,0 +1,154 @@
{
"id": "kindergarten_childcare",
"name": {
"en": "Kindergartens and childcare"
},
"description": "Shows kindergartens and preschools. Both are grouped in one layer, as they are regularly confused with each other",
"minzoom": 12,
"source": {
"osmTags": {
"or": [
"amenity=childcare",
"amenity=kindergarten",
"isced:level:2011=early_childhood"
]
}
},
"title": {
"mappings": [
{
"if": "amenity=kindergarten",
"then": {
"en": "Kindergarten {name}"
}
},
{
"if": "amenity=childcare",
"then": {
"en": "Childcare {name}"
}
}
]
},
"tagRenderings": [
{
"id": "childcare-type",
"question": {
"en": "What type of facility is this?"
},
"mappings": [
{
"if": "amenity=kindergarten",
"then": {
"en": "This is a kindergarten (also known as <i>preschool</i>) where small kids receive early education."
},
"addExtraTags": [
"isced:level=0",
"isced:2011:level=early_childhood"
]
},
{
"if": "amenity=childcare",
"then": {
"en": "This is a childcare facility, such as a nursery or daycare where small kids are looked after. They do not offer an education and are ofter run as private businesses"
},
"addExtraTags": [
"isced:level=",
"isced:2011:level="
]
}
]
},
{
"id": "name",
"question": "What is the name of this facility?",
"render": "This facility is named <b>{name}</b>",
"freeform": {
"key": "name"
}
},
"website",
"email",
"phone",
{
"builtin": "opening_hours",
"override": {
"question": {
"en": "When is this childcare opened?"
},
"condition": "amenity=childcare"
}
},
{
"id": "capacity",
"question": {
"en": "How much kids (at most) can be enrolled here?"
},
"render": {
"en": "This facility has room for {capacity} kids"
},
"freeform": {
"key": "capacity",
"type": "pnat"
}
}
],
"presets": [
{
"title": {
"en": "a kindergarten"
},
"description": "A kindergarten (also known as <i>preschool</i>) is a school where small kids receive early education.",
"tags": [
"amenity=kindergarten",
"isced:level=0",
"isced:2011:level=early_childhood"
]
},
{
"title": {
"en": "a childcare"
},
"description": "A childcare (also known as <i>a nursery</i> or <i>daycare</i>) is a facility which looks after small kids, but does not offer them an education program.",
"tags": [
"amenity=kindergarten"
]
}
],
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"label": {
"mappings": [
{
"if": "name~*",
"then": "<div class='bg-white rounded-lg p-1'>{name}</div>"
}
]
},
"icon": {
"mappings": [
{
"if": "amenity=kindergarten",
"then": "circle:white;./assets/layers/kindergarten_childcare/kindergarten.svg"
},
{
"if": "amenity=childcare",
"then": "circle:white;./assets/layers/kindergarten_childcare/childcare.svg"
}
]
}
},
{
"color": "#62fc6c",
"width": 1
}
],
"allowMove": {
"enableRelocation": true,
"enableImproveAccuracy": true
}
}

View file

@ -0,0 +1,25 @@
[
{
"path": "childcare.svg",
"license": "CC-BY",
"authors": [
"Diego Naive"
],
"sources": [
"https://thenounproject.com/icon/child-care-332981/"
]
},
{
"path": "kindergarten.svg",
"license": "CC-BY",
"authors": [
"Diego Naive",
"VideoPlasty",
"Pietervdvn"
],
"sources": [
"https://thenounproject.com/icon/child-care-332981/",
"https://commons.wikimedia.org/wiki/File:Blackboard_Flat_Icon_Vector.svg"
]
}
]

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="college"
width="500"
height="500"
viewBox="0 0 500 500"
version="1.1"
sodipodi:docname="college.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs7" />
<sodipodi:namedview
id="namedview5"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.1752248"
inkscape:cx="119.12615"
inkscape:cy="225.48877"
inkscape:current-layer="college" />
<path
d="M 250.0465,31 0,147.68837 66.679067,177.69395 v 56.6772 c -20.00372,6.66791 -33.339534,26.67163 -33.339534,46.67535 0,20.00372 13.335814,40.00744 33.339534,46.67535 v 3.33395 l -30.00558,70.01302 c -10.00186,30.00558 -3.333954,63.34511 46.675346,63.34511 50.009297,0 56.677207,-33.33953 46.675347,-63.34511 L 100.0186,331.0558 c 20.00372,-10.00186 33.33953,-26.67163 33.33953,-50.0093 0,-23.33767 -13.33581,-40.00744 -33.33953,-46.67535 V 194.36371 L 250.0465,264.37673 500.093,147.68837 Z m 146.69395,216.70697 -150.0279,66.67906 -80.01488,-36.67348 v 3.33395 c 0,23.33767 -10.00186,43.34139 -26.67163,60.01116 l 20.00372,46.67535 v 3.33395 c 3.33395,13.33581 6.66791,26.67163 3.33395,40.00744 23.33768,10.00186 50.0093,16.66977 83.34884,16.66977 110.02046,0 150.0279,-66.67907 150.0279,-100.0186 z"
id="path2"
style="stroke-width:33.3395" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,23 @@
[
{
"path": "college.svg",
"license": "CC0",
"authors": [
"Maki"
],
"sources": [
"https://labs.mapbox.com/maki-icons/"
]
},
{
"path": "school.svg",
"license": "CC0",
"authors": [
"Temaki"
],
"sources": [
"https://github.com/ideditor/temaki",
"https://ideditor.github.io/temaki/docs/"
]
}
]

View file

@ -0,0 +1,280 @@
{
"id": "school",
"name": {
"en": "Primary and secondary schools"
},
"description": "Schools giving primary and secondary education and post-secondary, non-tertiary education. Note that this level of education does not imply an age of the pupiles",
"minzoom": 12,
"title": {
"render": {
"en": "School <i>{name}</i>"
}
},
"calculatedTags": [
"_enclosing=feat.enclosingFeatures('school').map(f => f.feat.properties.id)",
"_is_enclosed=feat.properties._enclosing != '[]'"
],
"isShown": {
"render": "yes",
"mappings": [
{
"if": {
"and": [
"building~*",
"_is_enclosed=true"
]
},
"then": "no"
}
]
},
"tagRenderings": [
{
"render": {
"en": "This school is named {name}"
},
"question": {
"en": "What is the name of this school?"
},
"freeform": {
"key": "name"
},
"id": "school-name"
},
{
"id": "capacity",
"question": "How much students can at most enroll in this school?",
"render": {
"en": "This school can enroll at most {capacity} students"
},
"freeform": {
"key": "capacity",
"type": "pnat"
}
},
{
"id": "education-level-belgium",
"condition": "_country=be",
"question": {
"en":"What level of education is given on this school?"
},
"mappings": [
{
"if": "school=kindergarten",
"then": {
"en": "This is a school with a kindergarten section where young kids receive some education which prepares reading and writing.",
"nl": "Dit is een school die ook een kleuterschool bevat"
}
},
{
"if": "school=primary",
"then": {
"en": "This is a school where one learns primary skills such as basic literacy and numerical skills. <div class='subtle'>Pupils typically enroll from 6 years old till 12 years old</div>",
"nl": "Dit is een lagere school"
}
},
{
"if": "school=secondary",
"then": {
"en": "This is a secondary school which offers all grades",
"nl": "Dit is een middelbare school die alle schooljaren aanbiedt (dus van het eerste tot en met het zesde middelbaar)"
}
},
{
"if": "school=lower_secondary",
"then": {
"en": "This is a secondary school which does <b>not</b> have all grades, but offers <b>first and second</b> grade",
"nl": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het eerste en tweede middelbaar</b>"
}
},
{
"if": "school=middle_secondary",
"then": {
"en": "This is a secondary school which does <b>not</b> have all grades, but offers <b>third and fourth</b> grade",
"nl": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het derde en vierde middelbaar</b>"
}
},
{
"if": "school=upper_secondary",
"then": {
"en": "This is a secondary school which does <b>not</b> have all grades, but offers <b>fifth and sixth</b> grade",
"nl": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het vijfde en zesde middelbaar</b>"
}
},
{
"if": "school=post_secondary",
"then": {
"en": "This schools offers post-secondary education (e.g. a seventh or eight specialisation year)",
"nl": "Deze school biedt post-secundair onderwijs (bijvoorbeeld <b>specialisatiejaren</b>)"
}
}
],
"multiAnswer": true
},
{
"id": "gender",
"question": {
"en": "Which genders can enroll at this school?"
},
"mappings": [
{
"if": "school:gender=mixed",
"then": {
"en": "Both boys and girls can enroll here and have classes together"
}
},
{
"if": "school:gender=separated",
"then": {
"en": "Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times)"
}
},
{
"if": "school:gender=male",
"then": {
"en": "This is a boys only-school"
}
},
{
"if": "school:gender=female",
"then": {
"en": "This is a girls-only school"
}
}
]
},
{
"id": "target-audience",
"condition": "school:for~*",
"question": {
"en":"What is the target audience for this school?"
},
"multiAnswer": true,
"render": {
"en":"This is a school for {school:for}"
},
"freeform": {
"key": "school:for",
"inline": true
},
"mappings": [
{
"if": "school:for=",
"then": {
"en": "This is a school where students study skills at their age-adequate level. <div>There are little or no special facilities to cater for students with special needs or facilities are ad-hoc</div>"
},
"hideInAnswer": true
},
{
"if": "school:for=mainstream",
"then": {
"en": "This is a school where students study skills at their age-adequate level."
}
},
{
"if": "school:for=adults",
"then": {
"en": "This is a school where adults are taught skills on the level as specified."
}
},
{
"if": "school:for=autism",
"then": {
"en": "This is a school with facilities for students on the autism specturm"
}
},
{
"if": "school:for=learning_disabilities",
"then": {
"en": "This is a school with facilities for students with learning disabilities"
}
},
{
"if": "school:for=blind",
"then": {
"en": "This is a school with facilities for blind students or students with sight impairments"
}
},
{
"if": "school:for=deaf",
"then": {
"en": "This is a school with facilities for deaf students or students with hearing impairments"
}
},
{
"if": "school:for=disabilities",
"then": {
"en": "This is a school with facilities for students with disabilities"
}
},
{
"if": "school:for=special_needs",
"then": {
"en": "This is a school with facilities for students with special needs"
}
}
]
},
"website",
"phone",
"email",
{
"id": "language",
"question": {
"en": "What is the main language of this school?<div class='subtle'>What language is spoken with the students in non-language related courses and with the administration?</div>"
},
"render": {
"en":"{school:language} is the main language of {title()}"
},
"freeform": {
"key": "school:language",
"inline": true
},
"mappings": [{
"if": "school:language=",
"then": {
"en": "The main language of this school is unknown"
},
"hideInAnswer": true
}]
}
],
"presets": [
{
"tags": [
"amenity=school","fixme=Added with MapComplete, the precise geometry should still be drawn"
],
"title": {
"en": "a primary or secondary school"
}
}
],
"source": {
"osmTags": "amenity=school"
},
"mapRendering": [
{
"icon": "circle:white;./assets/layers/school/school.svg",
"label": {
"mappings": [
{
"if": "name~*",
"then": "<div class='bg-white rounded-lg p-1'>{name}</div>"
}
]
},
"iconSize": {
"render": "40,40,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": "#fcd862",
"width": 1
}
]
}

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
x="0"
y="0"
viewBox="0 0 15 15"
id="svg6"
sodipodi:docname="school.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs10" />
<sodipodi:namedview
id="namedview8"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="19.217129"
inkscape:cx="3.5385098"
inkscape:cy="1.4570334"
inkscape:current-layer="svg6" />
<path
d="M 9.1416908,2.1457729 V 12.854227 c 0,0 -7.1389694,0 -7.1389694,0 0,0 0,-10.7084541 0,-10.7084541 z M 8.4277939,2.8596699 H 2.7166183 V 12.14033 c 0,0 5.7111756,0 5.7111756,0 z M 3.7874637,5.0013607 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z m 0,1.4277939 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z m 0,1.4277939 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z m 0,1.4277939 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z"
id="path2"
style="stroke-width:0.713897" />
<path
d="m 9.8555878,11.426433 c 0.3569482,0.356949 1.7847422,0.356949 2.1416912,0 0,0 -0.713897,1.427794 -1.070846,1.427794 -0.356948,0 -1.0708452,-1.427794 -1.0708452,-1.427794 z m 0,-7.1389693 c 0,0.3569485 2.1416912,0.3569485 2.1416912,0 0,0 0,6.4250723 0,6.4250723 0,0.356949 -2.1416912,0.356949 -2.1416912,0 0,0 0,-6.4250723 0,-6.4250723 z M 10.926433,2.1457729 c -1.0708452,0 -1.0708452,0.3569485 -1.0708452,0.713897 0,0 0,0.7138969 0,0.7138969 0,0.3569485 2.1416912,0.3569485 2.1416912,0 0,0 0,-0.7138969 0,-0.7138969 0,-0.3569485 0,-0.713897 -1.070846,-0.713897 z"
id="path4"
style="stroke-width:0.713897" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,141 @@
{
"id": "tertiary_education",
"name": {
"en": "Colleges and universities"
},
"description": "Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)",
"source": {
"osmTags": {
"or": [
"amenity=college",
"amenity=university",
{
"and": [
"amenity=school",
{
"or": [
"isced:2011:level~.*bachelor.*",
"isced:2011:level~.*master.*"
]
}
]
}
]
}
},
"title": {
"mappings": [
{
"if": "name~*",
"then": {
"*":"{name}"
}
},
{
"if": "amenity=college",
"then": {
"en": "College",
"nl": "Hogeschool"
}
},{
"if": "amenity=university",
"then": {
"en": "University"
}
},
{
"if": "amenity=school",
"then": {
"en": "School providing tertiary education"
}
}
]
},
"tagRenderings": [
{
"id": "institution-kind",
"question": {
"en": "What kind of institution is this?"
},
"mappings": [
{
"if": "amenity=college",
"then": {
"en": "This is an institution of post-secondary, non-tertiary education. One has to have completed secondary education to enroll here, but no bachelor (or higher) degrees are awarded here"
}
},
{
"if":"amenity=university",
"then": {
"en": "This is a university, an institution of tertiary education where bachelor degrees or higher are awarded."
}
}
]
},
{
"id": "isced",
"question": {
"en": "What level of education is given here?"
},
"multiAnswer": true,
"mappings": [{
"if": "isced:2011:level=bachelor",
"then": {
"en": "Bachelor degrees are awarded here"
}
},
{
"if": "isced:2011:level=master",
"then": {
"en": "Master degrees are awarded here"
}
},{
"if": "isced:2011:level=doctorate",
"then": {
"en": "Doctorate degrees are awarded here"
}
}],
"condition": "amenity=university"
},
{
"builtin": ["school.capacity","school.gender"],
"override": {
"condition": null
}
},
"website",
"email",
"phone"
],
"mapRendering": [{
"location": ["point","centroid"],
"iconSize": {
"render": "40,40,center"
},
"label": {
"mappings": [
{
"if": "name~*",
"then": "<div class='bg-white rounded-lg p-1'>{name}</div>"
}
]
},
"icon": "circle:white;./assets/layers/school/college.svg"
},
{
"color": "#22f1f4",
"width": 1
}
],
"presets": [
{
"title": {
"en": "a university"
},
"description": {
"en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points."
},
"tags": ["amenity=university","fixme=Added with MapComplete, geometry to be drawn"]
}
]
}

View file

@ -0,0 +1,137 @@
Published as https://www.openstreetmap.org/user/Pieter%20Vander%20Vennet/diary/399339/
For my work at [anyways.eu](https://anyways.eu), I've been tasked to make sure that all schools are in OSM - especially with capacity.
No better way to do this by making it easy for contributors to add the correct data... So, I wanted to create a MapComplete theme for education. Normally, I would open up the wiki to see what tagging is needed, but for schools there is very little tagging available at the moment, which is a mess.
As it turns out, schools are diverse and this is reflected in the tagging.
This diary entry serves two goals:
1. I want to organize my thoughts on how a tagging model could look like
2. It is meant to stir up some discussion.
Hopefully, some tagging proposals will come forward from from this post.
# So, what is a school (or educational institute) anyway?
This is already a hard question. The [openstreetmap-wiki on 'education features' states](https://wiki.openstreetmap.org/wiki/Education_features):
> Education features are map objects and object features which relate to educational activities
Well, thanks, captain obvious.
Let's turn to the [International Standard Classification of Education](http://uis.unesco.org/en/files/isced-2011-operational-manual-guidelines-classifying-national-education-programmes-and-related) (from Unesco) instead:
> As national education systems vary in terms of structure and curricular content, it can be difficult to benchmark performance over time or monitor progress.
So, in other words, it is difficult as this can be highly different amonst regions. The ISCED-document however does a good job to draw some lines and to give some definitions.
## What does a standard school curriculum look like?
In most countries, the school trajectory for most people (according the the ISCED, page 21) looks more or less as following:
Before formal education starts, kids younger then about 5 or 6 go to _preschool/kindergarten_. This is optional in most countries, and some education takes place, often to prepare spelling and simple math.
ISCED calls this **level 0**
Between 6 and around 12, kids learn to read an write, learn basic math skills and other skills. This is called **primary education** and corresponds with **isced level 1**
Between 12 and 14/15, kids get lower secondary eduction and learn more skills and competencies (**isced level 2**).
Between 14/15 and 18; kids get higher secondary education (**isced level 3**).
Note that the secondary levels have a split between education preparing for (a set of) trades versus a general training which prepares for tertiary education.
These orientations are called `vocational` and `general` education.
At age of 18, someone who has obtained **upper secondary** education, could join the workforce, could follow non-tertiary education (see below) or could enroll in tertiary education.
The first cycle of tertiary education are often **bachelors** (often 3 years, but 2 years is pretty common too) and correspond with **isced level 6**, after which a **master degree** (often 2 years) which corresponds with **isced level 7** can be obtained.
The bachelors and master degrees often have an orientation too, called `professional` or `academic`
At last, a **doctorate** can be obtained which corresponds with **isced level 8**.
If, at age 18 someone does not want to enroll in tertiary education or isn't ready yet for the labour market yet, they can also follow a **post-secondary non-tertiary** (ISCED level 4) education.
This is an education which is not sufficiently complex to qualify as tertiary eduction and often has a vocational training, thus a training which prepares for direct labour market entry. Note that the ISCED does not state typical ages for this education form, as it is often taken by adults too.
At last, **isced level 5**, officially called **short-cycle tertiary education** provides education to prepare for following bachelor degree, e.g. if the skills obtained by a vocational secondary degree are not sufficient to enter a bachelors degree.
## What if the education is non-standard?
A good tagging scheme doesn't break under special cases. Lets have a look at some of them to test the waters.
While _most_ of the people might follow a trajectory as outlined above, many don't.
The ISCED-definition leaves wiggle room by more or less defining what _skills_ one gains in a certain education level - not at what _age_ someone typically obtains these skills. While the typical ages are _stated_ in the ISCED, they are not the defining features.
Some examples of non-standard trajectories could be:
- Someone who has never had the chance on learning how to read might enroll in _primary education_ as an adult.
- Someone with a learning disability might be obtaining the _lower_secondary_ skill, even though people of their age age are in _higher_secondary_.
- Someone in their forties might wish to reorient their career and follow a vocational course of the skill level of a _vocational_upper_secondary_.
- Someone might follow a course in music, dancing, skiing or scuba diving as a hobby in an informal school during the evenings, while still working their job during the day.
This last example also touches upon specialized schools. How should these be handled? Examples of these schools are:
- driving schools or flight school.
- a secondary school which focuses on arts, but has enough general skills to be compatible with ISCED-level `upper_secondary`? [iAnd what if this school contains a college with a bachelor degree in music too,n the same buildings?](https://en.wikipedia.org/wiki/Lemmensinstituut)
So, this implies that knowing the `isced`-level of a school is very useful and often does imply the age of the pupils, we still need a way to express whom is going to this school.
## Who is the school for?
By default, we could assume that most schools are normal schools where pupils follow age-adequate courses.
This is not always the case. Some schools focus e.g. on secondary education for adults, other focus on people with disabilities.
To tag this, I propose to introduce a tag `school:for`, e.g. `school:for=autism`, `school:for=adults`, `school:for=learning_disabilities`, ...
If this tag is missing, one can assume that the school is for normal-abled people whom follow courses typical for their age.
In some places, schools are separated by gender too. Some schools are boys/girls only, others teach both but they are separated. This might fit this tag too, but not quite.
## What does a school teach?
The further in the education system, the more specialized education gets.
Where all primary education teaches more-or-less the same subjects, secondary education already starts to specialize.
And tertiary education is extremely specialized, with faculties teaching about just one field.
I propose to introduce a `school:subject`-tag, which indicates what subjects are taught at a school.
This must be independent of the ISCED-level. For example: a school might focus on "teaching music",
which can range from evening school for adults, to a secondary school that qualifies as `isced=upper_secondary` to even a college in arts having doctorate students.
Giving an exhaustive list of possible values is impossible, but some common values could be:
- arts, music, dance, painting, ...
- driving
- flight
- to disambiguate, a wikidata-entity could be linked
- ...
The tag `school:subject` would also remove the need for various extra amenities, such as `amenity=dance_school`, `amenity=music_school`, reducing complexity.
Other details and assumptions (e.g. target audience and offered education level) can be clarified as explained above.
Schools which do teach skills without general education (e.g. a driving school) could thus be tagged with:
```
amenity=school
school:subject=driving
isced:2011:level=post_secondary
```
A college, tagged with `amenity=college` thus implies `isced:2011:level=professional_bachelor`. Whether or not a `master`-degree can be obtained at that college can not safely be assumed.
## Schooling method
At last, there are multiple ways to teach students. Especially secondary education has a rich variety. In Flanders, we have Montessori schools, Freinet, Steiner, CLIL, ... This could be worthy of a tag too, e.g. with `educational_method` or`educational_method:wikidata`
## Other tags
Of course, there are still other well-established tags important too, such as `capacity`, contact information, ... I'm not covering them here, as these are already widely accepted.
# Conclusion
Schools are diverse in the subjects and the level of education they teach, how they teach and who they teach. This makes tagging difficult. This post describes a possible method of splitting these subjects into orthogonal tags which can be independently measured.
This blogpost attempts to give a first attempt, but of course, I'm only aware of my own environment. There must be other types of schools which I've never heard of before, so if you know of something that is considered an 'educational feature' which cannot be tagged with the tags described above, please let me know.

View file

@ -0,0 +1,22 @@
{
"id": "education",
"description": {
"en": "On this map, you'll find information about all types of schools and eduction and can easily add more information"
},
"title": {
"en": "Education"
},
"defaultBackgroundId": "CartoDB.Voyager",
"maintainer": "MapComplete",
"version": "0.0.1",
"startLat": 0,
"startLon": 0,
"startZoom": 0,
"icon": "./assets/layers/school/college.svg",
"#layers:note": "kindergarten_childcare must be _below_ school, as it can 'catch' primary schools which do have an integrated preschool",
"layers": [
"tertiary_education",
"school",
"kindergarten_childcare"
]
}

View file

@ -189,6 +189,10 @@
"if": "theme=drinking_water",
"then": "./assets/themes/drinking_water/logo.svg"
},
{
"if": "theme=education",
"then": "./assets/layers/school/college.svg"
},
{
"if": "theme=entrances",
"then": "./assets/layers/entrance/door.svg"

1
package-lock.json generated
View file

@ -11,6 +11,7 @@
"dependencies": {
"@babel/preset-env": "7.13.8",
"@parcel/service-worker": "^2.6.0",
"@turf/boolean-intersects": "^6.5.0",
"@turf/buffer": "^6.5.0",
"@turf/collect": "^6.5.0",
"@turf/distance": "^6.5.0",

View file

@ -68,6 +68,7 @@
"dependencies": {
"@babel/preset-env": "7.13.8",
"@parcel/service-worker": "^2.6.0",
"@turf/boolean-intersects": "^6.5.0",
"@turf/buffer": "^6.5.0",
"@turf/collect": "^6.5.0",
"@turf/distance": "^6.5.0",

View file

@ -70,6 +70,21 @@ knownLicenses.set("streetcomplete", {
license: "CC0",
sources: ["https://github.com/streetcomplete/StreetComplete/tree/master/res/graphics", "https://f-droid.org/packages/de.westnordost.streetcomplete/"]
})
knownLicenses.set("temaki", {
authors: ["Temaki"],
path: undefined,
license: "CC0",
sources: ["https://github.com/ideditor/temaki","https://ideditor.github.io/temaki/docs/"]
})
knownLicenses.set("maki", {
authors: ["Maki"],
path: undefined,
license: "CC0",
sources: ["https://labs.mapbox.com/maki-icons/"]
})
knownLicenses.set("t", {
authors: [],
path: undefined,

View file

@ -50,6 +50,9 @@ function addArticleToPresets(layerConfig: {presets?: {title: any}[]}){
if(txt.startsWith(article+" ")){
return txt;
}
if(txt.startsWith("an ")){
return txt;
}
return article +" " + txt.toLowerCase();
})
.translations

View file

@ -0,0 +1,70 @@
import {describe} from 'mocha'
import OsmFeatureSource from "../../../Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource";
import {UIEventSource} from "../../../Logic/UIEventSource";
import ScriptUtils from "../../../scripts/ScriptUtils";
import FilteredLayer, {FilterState} from "../../../Models/FilteredLayer";
import {Tiles} from "../../../Models/TileRange";
import {readFileSync} from "fs";
import {Utils} from "../../../Utils";
import {Tag} from "../../../Logic/Tags/Tag";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
import {expect} from "chai";
console.log(process.cwd())
let data = JSON.parse(readFileSync("./test/Logic/FeatureSource/osmdata.json", "utf8"))
describe("OsmFeatureSource", () => {
it("should work", (done) => {
ScriptUtils.fixUtils()
Utils.injectJsonDownloadForTests("https://osm.org/api/0.6/map?bbox=4.24346923828125,50.732978448277514,4.2462158203125,50.73471682490244", data)
let fetchedTile = undefined;
const neededTiles = new UIEventSource<number[]>([Tiles.tile_index(17, 67081, 44033)]);
new OsmFeatureSource({
allowedFeatures: new Tag("amenity", "school"),
handleTile: tile => {
fetchedTile = tile
const data = tile.features.data[0].feature
expect(data.properties).deep.eq({
id: 'relation/5759328', timestamp: '2022-06-10T00:46:55Z',
version: 6,
changeset: 122187206,
user: 'Pieter Vander Vennet',
uid: 3818858,
amenity: 'school',
'isced:2011:level': 'vocational_lower_secondary;vocational_upper_secondary',
name: 'Koninklijk Technisch Atheneum Pro Technica',
'school:gender': 'mixed',
type: 'multipolygon',
website: 'http://ktahalle.be/',
_backend: 'https://osm.org'
})
expect(data.geometry.type).eq("MultiPolygon")
done()
},
isActive: new UIEventSource<boolean>(true),
neededTiles,
state: {
osmConnection: {
Backend(): string {
return "https://osm.org"
}
},
filteredLayers: new UIEventSource<FilteredLayer[]>([
{
appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined),
layerDef: new LayerConfig({
id: "school",
source: {
osmTags: "amenity=school"
},
mapRendering: null
}),
isDisplayed: new UIEventSource<boolean>(true)
}
])
}
})
})
})

File diff suppressed because one or more lines are too long