LayerServer: make all layer ids unique
This commit is contained in:
parent
ef2f1487c6
commit
1d6c9ec1ef
12 changed files with 74 additions and 46 deletions
|
@ -45,7 +45,7 @@
|
|||
"hideFromOverview": true,
|
||||
"layers": [
|
||||
{
|
||||
"id": "osm:buildings",
|
||||
"id": "osm_buildings",
|
||||
"name": "OSM Buildings",
|
||||
"title": "OSM Building",
|
||||
"description": "Layer showing buildings that are in OpenStreetMap",
|
||||
|
@ -147,7 +147,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"id": "osm:adresses",
|
||||
"id": "osm_adresses",
|
||||
"name": "OSM Adresses",
|
||||
"title": "OSM Adress",
|
||||
"description": "Layer showing adresses that are in OpenStreetMap",
|
||||
|
@ -185,7 +185,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"id": "bag:pand",
|
||||
"id": "bag_pand",
|
||||
"name": "BAG Buildings",
|
||||
"title": "BAG Building",
|
||||
"description": {
|
||||
|
@ -207,7 +207,7 @@
|
|||
},
|
||||
"minzoom": 18,
|
||||
"calculatedTags": [
|
||||
"_overlaps_with_buildings=overlapWith(feat)('osm:buildings').filter(f => f.feat.properties.id.indexOf('-') < 0)",
|
||||
"_overlaps_with_buildings=overlapWith(feat)('osm_buildings').filter(f => f.feat.properties.id.indexOf('-') < 0)",
|
||||
"_overlaps_with=feat(get)('_overlaps_with_buildings').find(f => f.overlap > 1 /* square meter */ )",
|
||||
"_overlaps_with_properties=feat(get)('_overlaps_with')?.feat?.properties",
|
||||
"_overlap_percentage=Math.round(100 * (feat(get)('_overlaps_with')?.overlap / feat(get)('_overlaps_with_properties')['_surface:strict']))",
|
||||
|
@ -228,7 +228,7 @@
|
|||
"render": {
|
||||
"special": {
|
||||
"type": "import_way_button",
|
||||
"targetLayer": "osm:buildings",
|
||||
"targetLayer": "osm_buildings",
|
||||
"tags": "building=$_bag_obj:building; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date; start_date=$_bag_obj:start_date",
|
||||
"text": {
|
||||
"*": "Upload this building to OpenStreetMap"
|
||||
|
@ -258,7 +258,7 @@
|
|||
},
|
||||
{
|
||||
"if": "_overlaps_with!=",
|
||||
"then": "{conflate_button(osm:buildings, building=$_bag_obj:building; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date; start_date=$_bag_obj:start_date, Replace the geometry in OpenStreetMap, , _osm_obj:id)}"
|
||||
"then": "{conflate_button(osm_buildings, building=$_bag_obj:building; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date; start_date=$_bag_obj:start_date, Replace the geometry in OpenStreetMap, , _osm_obj:id)}"
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
|
@ -268,7 +268,7 @@
|
|||
"_bag_obj:in_construction=true"
|
||||
]
|
||||
},
|
||||
"then": "{import_way_button(osm:buildings, building=$_bag_obj:building; construction=$_bag_obj:construction; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date; start_date=$_bag_obj:start_date, Upload this building to OpenStreetMap)}"
|
||||
"then": "{import_way_button(osm_buildings, building=$_bag_obj:building; construction=$_bag_obj:construction; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date; start_date=$_bag_obj:start_date, Upload this building to OpenStreetMap)}"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -348,7 +348,7 @@
|
|||
},
|
||||
{
|
||||
"id": "Overlapping building",
|
||||
"render": "<div>The overlapping <a href=https://osm.org/{_osm_obj:id} target=_blank>osm:buildings</a> is a <b>{_osm_obj:building}</b> and covers <b>{_overlap_percentage}%</b> of the BAG building.<br>The BAG-building covers <b>{_reverse_overlap_percentage}%</b> of the OSM building<div><h3>BAG geometry:</h3>{minimap(21, id):height:10rem;border-radius:1rem;overflow:hidden}<h3>OSM geometry:</h3>{minimap(21,_osm_obj:id):height:10rem;border-radius:1rem;overflow:hidden}</div></div>",
|
||||
"render": "<div>The overlapping <a href=https://osm.org/{_osm_obj:id} target=_blank>osm_buildings</a> is a <b>{_osm_obj:building}</b> and covers <b>{_overlap_percentage}%</b> of the BAG building.<br>The BAG-building covers <b>{_reverse_overlap_percentage}%</b> of the OSM building<div><h3>BAG geometry:</h3>{minimap(21, id):height:10rem;border-radius:1rem;overflow:hidden}<h3>OSM geometry:</h3>{minimap(21,_osm_obj:id):height:10rem;border-radius:1rem;overflow:hidden}</div></div>",
|
||||
"condition": "_overlaps_with!="
|
||||
},
|
||||
{
|
||||
|
@ -386,7 +386,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"id": "bag:verblijfsobject",
|
||||
"id": "bag_verblijfsobject",
|
||||
"name": "BAG Addresses",
|
||||
"title": "BAG Address",
|
||||
"description": "Address information from the BAG register",
|
||||
|
@ -398,7 +398,7 @@
|
|||
},
|
||||
"minzoom": 18,
|
||||
"calculatedTags": [
|
||||
"_closed_osm_addr:=closest(feat)('osm:adresses').properties",
|
||||
"_closed_osm_addr:=closest(feat)('osm_adresses').properties",
|
||||
"_bag_obj:addr:housenumber=`${feat.properties.huisnummer}${feat.properties.huisletter}${(feat.properties.toevoeging != '') ? '-' : ''}${feat.properties.toevoeging}`",
|
||||
"_bag_obj:ref:bag=Number(feat.properties.identificatie)",
|
||||
"_bag_obj:source:date=new Date().toISOString().split('T')[0]",
|
||||
|
@ -411,7 +411,7 @@
|
|||
"tagRenderings": [
|
||||
{
|
||||
"id": "Import button",
|
||||
"render": "{import_button(osm:adresses, addr:city=$woonplaats; addr:housenumber=$_bag_obj:addr:housenumber; addr:postcode=$postcode; addr:street=$openbare_ruimte; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date, Upload this adress to OpenStreetMap)}",
|
||||
"render": "{import_button(osm_adresses, addr:city=$woonplaats; addr:housenumber=$_bag_obj:addr:housenumber; addr:postcode=$postcode; addr:street=$openbare_ruimte; ref:bag=$_bag_obj:ref:bag; source=BAG; source:date=$_bag_obj:source:date, Upload this adress to OpenStreetMap)}",
|
||||
"condition": "_imported_osm_object_found=false"
|
||||
},
|
||||
{
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
"hideFromOverview": true,
|
||||
"layers": [
|
||||
{
|
||||
"id": "node2node",
|
||||
"id": "node2node_bicycle",
|
||||
"name": {
|
||||
"en": "Node to node links",
|
||||
"de": "Knotenpunktverbindungen",
|
||||
|
@ -126,7 +126,7 @@
|
|||
"pointRendering": null
|
||||
},
|
||||
{
|
||||
"id": "node",
|
||||
"id": "node_bicycle",
|
||||
"name": {
|
||||
"en": "Nodes",
|
||||
"de": "Knotenpunkte",
|
||||
|
@ -321,6 +321,7 @@
|
|||
],
|
||||
"override": {
|
||||
"minzoom": 16,
|
||||
"id": "bicycle_guidepost",
|
||||
"source": {
|
||||
"osmTags": {
|
||||
"and": [
|
||||
|
|
|
@ -290,7 +290,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"id": "all_streets",
|
||||
"id": "not_cyclestreets",
|
||||
"name": {
|
||||
"nl": "Alle straten",
|
||||
"en": "All streets",
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
"hideFromOverview": true,
|
||||
"layers": [
|
||||
{
|
||||
"id": "osm-buildings",
|
||||
"id": "osm_buildings_no_points",
|
||||
"name": "All OSM-buildings",
|
||||
"source": {
|
||||
"osmTags": {
|
||||
|
@ -296,7 +296,7 @@
|
|||
"name": "GRB geometries",
|
||||
"title": "GRB outline",
|
||||
"calculatedTags": [
|
||||
"_overlaps_with_buildings=overlapWith(feat)('osm-buildings').filter(f => f.feat.properties.id.indexOf('-') < 0) ?? []",
|
||||
"_overlaps_with_buildings=overlapWith(feat)('osm_buildings_no_points').filter(f => f.feat.properties.id.indexOf('-') < 0) ?? []",
|
||||
"_overlaps_with=get(feat)('_overlaps_with_buildings').find(f => f.overlap > 1 /* square meter */ )",
|
||||
"_osm_obj:source:ref=get(feat)('_overlaps_with')?.feat?.properties['source:geometry:ref']",
|
||||
"_osm_obj:id=get(feat)('_overlaps_with')?.feat?.properties?.id",
|
||||
|
@ -319,7 +319,7 @@
|
|||
"tagRenderings": [
|
||||
{
|
||||
"id": "Import-button",
|
||||
"render": "{import_way_button(osm-buildings,building=$building;man_made=$man_made; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber; building:min_level=$_building:min_level, Upload this building to OpenStreetMap,,_is_part_of_building=true,1,_moveable=true)}",
|
||||
"render": "{import_way_button(osm_buildings_no_points,building=$building;man_made=$man_made; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber; building:min_level=$_building:min_level, Upload this building to OpenStreetMap,,_is_part_of_building=true,1,_moveable=true)}",
|
||||
"mappings": [
|
||||
{
|
||||
"#": "Failsafe",
|
||||
|
@ -371,7 +371,7 @@
|
|||
"addr:housenumber!:={_osm_obj:addr:housenumber}"
|
||||
]
|
||||
},
|
||||
"then": "{conflate_button(osm-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber, Replace the geometry in OpenStreetMap and add the address,,_osm_obj:id)}"
|
||||
"then": "{conflate_button(osm_buildings_no_points,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber, Replace the geometry in OpenStreetMap and add the address,,_osm_obj:id)}"
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
|
@ -380,7 +380,7 @@
|
|||
"_reverse_overlap_percentage>50"
|
||||
]
|
||||
},
|
||||
"then": "{conflate_button(osm-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Replace the geometry in OpenStreetMap,,_osm_obj:id)}"
|
||||
"then": "{conflate_button(osm_buildings_no_points,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Replace the geometry in OpenStreetMap,,_osm_obj:id)}"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -612,7 +612,7 @@
|
|||
"builtin": "crab_address",
|
||||
"override": {
|
||||
"calculatedTags+": [
|
||||
"_embedded_in=overlapWith(feat)('osm-buildings').filter(b => /* Do not match newly created objects */ b.feat.properties.id.indexOf('-') < 0)[0]?.feat?.properties ?? {}",
|
||||
"_embedded_in=overlapWith(feat)('osm_buildings_no_points').filter(b => /* Do not match newly created objects */ b.feat.properties.id.indexOf('-') < 0)[0]?.feat?.properties ?? {}",
|
||||
"_embedding_nr=get(feat)('_embedded_in')['addr:housenumber']+(get(feat)('_embedded_in')['addr:unit'] ?? '')",
|
||||
"_embedding_street=get(feat)('_embedded_in')['addr:street']",
|
||||
"_embedding_id=get(feat)('_embedded_in').id",
|
||||
|
@ -709,7 +709,7 @@
|
|||
"text": {
|
||||
"nl": "Voeg dit adres als een nieuw adrespunt toe"
|
||||
},
|
||||
"snap_onto_layers": "osm-buildings"
|
||||
"snap_onto_layers": "osm_buildings_no_points"
|
||||
}
|
||||
},
|
||||
"mappings": [
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
{
|
||||
"builtin": "shops",
|
||||
"override": {
|
||||
"id": "medical-shops",
|
||||
"id": "medical_shops",
|
||||
"minzoom": 13,
|
||||
"=filter": [
|
||||
"open_now",
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
{
|
||||
"builtin": "crossings",
|
||||
"override": {
|
||||
"id": "crossings_no_traffic_lights",
|
||||
"=presets": [
|
||||
{
|
||||
"title": {
|
||||
|
@ -87,4 +88,4 @@
|
|||
},
|
||||
"kerbs"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -258,6 +258,7 @@
|
|||
{
|
||||
"builtin": "parking_spaces",
|
||||
"override": {
|
||||
"id": "parking_spaces_disabled",
|
||||
"source": {
|
||||
"osmTags": "parking_space=disabled"
|
||||
},
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
{
|
||||
"builtin": "shops",
|
||||
"override": {
|
||||
"id": "erotic-shop",
|
||||
"id": "erotic_shop",
|
||||
"source": {
|
||||
"osmTags": "shop=erotic"
|
||||
},
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
"builtin": "shelter",
|
||||
"override": {
|
||||
"minzoom": 18,
|
||||
"id": "pt_shelter",
|
||||
"source": {
|
||||
"osmTags": {
|
||||
"and": [
|
||||
|
|
|
@ -185,7 +185,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"id": "address",
|
||||
"id": "uk_address",
|
||||
"name": {
|
||||
"en": "Known addresses in OSM"
|
||||
},
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
"hideFromOverview": true,
|
||||
"layers": [
|
||||
{
|
||||
"id": "node2node",
|
||||
"id": "node2node_hiking",
|
||||
"name": {
|
||||
"en": "Node to node links",
|
||||
"de": "Knotenpunktverbindungen",
|
||||
|
@ -120,7 +120,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"id": "node",
|
||||
"id": "node_hiking",
|
||||
"name": {
|
||||
"en": "Nodes",
|
||||
"de": "Knotenpunkte",
|
||||
|
@ -279,6 +279,7 @@
|
|||
],
|
||||
"override": {
|
||||
"minzoom": 16,
|
||||
"id": "guidepost_hiking",
|
||||
"source": {
|
||||
"osmTags": {
|
||||
"and": [
|
||||
|
|
|
@ -9,7 +9,7 @@ import { Or } from "../../src/Logic/Tags/Or"
|
|||
import { RegexTag } from "../../src/Logic/Tags/RegexTag"
|
||||
import { Utils } from "../../src/Utils"
|
||||
|
||||
class LuaSnippets{
|
||||
class LuaSnippets {
|
||||
/**
|
||||
* The main piece of code that calls `process_poi`
|
||||
*/
|
||||
|
@ -25,23 +25,25 @@ class LuaSnippets{
|
|||
"end",
|
||||
""].join("\n")
|
||||
|
||||
public static combine(calls: string[]): string{
|
||||
public static combine(calls: string[]): string {
|
||||
return [
|
||||
`function process_poi(object, geom)`,
|
||||
...calls.map(c => " "+c+"(object, geom)"),
|
||||
...calls.map(c => " " + c + "(object, geom)"),
|
||||
`end`,
|
||||
].join("\n")
|
||||
}
|
||||
}
|
||||
|
||||
class GenerateLayerLua {
|
||||
private readonly _layer: LayerConfig
|
||||
|
||||
constructor(layer: LayerConfig) {
|
||||
this._layer = layer
|
||||
}
|
||||
public functionName(){
|
||||
|
||||
public functionName() {
|
||||
const l = this._layer
|
||||
if(!l.source?.osmTags){
|
||||
if (!l.source?.osmTags) {
|
||||
return undefined
|
||||
}
|
||||
return `process_poi_${l.id}`
|
||||
|
@ -49,7 +51,7 @@ class GenerateLayerLua {
|
|||
|
||||
public generateFunction(): string {
|
||||
const l = this._layer
|
||||
if(!l.source?.osmTags){
|
||||
if (!l.source?.osmTags) {
|
||||
return undefined
|
||||
}
|
||||
return [
|
||||
|
@ -75,10 +77,38 @@ class GenerateLayerLua {
|
|||
" ",
|
||||
` pois_${l.id}:insert(a)`,
|
||||
"end",
|
||||
""
|
||||
"",
|
||||
].join("\n")
|
||||
}
|
||||
|
||||
private regexTagToLua(tag: RegexTag) {
|
||||
if (typeof tag.value === "string" && tag.invert) {
|
||||
return `object.tags["${tag.key}"] ~= "${tag.value}"`
|
||||
}
|
||||
|
||||
if ("" + tag.value === "/.+/is" && !tag.invert) {
|
||||
return `object.tags["${tag.key}"] ~= nil`
|
||||
}
|
||||
|
||||
if ("" + tag.value === "/.+/is" && tag.invert) {
|
||||
return `object.tags["${tag.key}"] == nil`
|
||||
}
|
||||
|
||||
if (tag.matchesEmpty && !tag.invert) {
|
||||
return `object.tags["${tag.key}"] == nil or object.tags["${tag.key}"] == ""`
|
||||
}
|
||||
|
||||
|
||||
if (tag.matchesEmpty && tag.invert) {
|
||||
return `object.tags["${tag.key}"] ~= nil or object.tags["${tag.key}"] ~= ""`
|
||||
}
|
||||
|
||||
if (tag.invert) {
|
||||
return `object.tags["${tag.key}"] == nil or not string.find(object.tags["${tag.key}"], "${tag.value}")`
|
||||
}
|
||||
|
||||
return `(object.tags["${tag.key}"] ~= nil and string.find(object.tags["${tag.key}"], "${tag.value}"))`
|
||||
}
|
||||
|
||||
private toLuaFilter(tag: TagsFilter, useParens: boolean = false): string {
|
||||
if (tag instanceof Tag) {
|
||||
|
@ -99,14 +129,7 @@ class GenerateLayerLua {
|
|||
return expr
|
||||
}
|
||||
if (tag instanceof RegexTag) {
|
||||
if(typeof tag.value === "string" && tag.invert){
|
||||
return `object.tags["${tag.key}"] ~= "${tag.value}"`
|
||||
}
|
||||
|
||||
let expr = `not string.find(object.tags["${tag.key}"], "${tag.value}")`
|
||||
if (!tag.invert) {
|
||||
expr = "not " + expr
|
||||
}
|
||||
let expr = this.regexTagToLua(tag)
|
||||
if (useParens) {
|
||||
expr = "(" + expr + ")"
|
||||
}
|
||||
|
@ -124,17 +147,17 @@ class GenerateLayerFile extends Script {
|
|||
}
|
||||
|
||||
async main(args: string[]) {
|
||||
const layerNames = Array.from(AllSharedLayers.sharedLayers.values())
|
||||
const layers = Array.from(AllSharedLayers.sharedLayers.values())
|
||||
|
||||
const generators = layerNames.map(l => new GenerateLayerLua(l))
|
||||
const generators = layers.filter(l => l.source.geojsonSource === undefined).map(l => new GenerateLayerLua(l))
|
||||
|
||||
const script = [
|
||||
...generators.map(g => g.generateFunction()),
|
||||
LuaSnippets.combine(Utils.NoNull(generators.map(g => g.functionName()))),
|
||||
LuaSnippets.tail
|
||||
LuaSnippets.tail,
|
||||
].join("\n\n\n")
|
||||
const path = "build_db.lua"
|
||||
fs.writeFileSync(path,script, "utf-8")
|
||||
fs.writeFileSync(path, script, "utf-8")
|
||||
console.log("Written", path)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue