From 6bdda9fb124a6f987942cd6336a54101bc05731c Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sun, 4 May 2025 03:56:38 +0200 Subject: [PATCH] Themes(GRB): fix detection of overlapping buildings --- assets/layers/crab_address/crab_address.json | 38 ------ .../layers/crab_address/housenumber_blank.svg | 7 - .../housenumber_blank.svg.license | 2 - assets/layers/crab_address/license_info.json | 10 -- assets/themes/grb/grb.json | 122 ------------------ src/Logic/ExtraFunctions.ts | 9 +- .../FeatureSource/Actors/GeoIndexedStore.ts | 13 ++ src/Logic/MetaTagging.ts | 16 ++- src/UI/Map/ShowDataLayer.ts | 1 - 9 files changed, 34 insertions(+), 184 deletions(-) delete mode 100644 assets/layers/crab_address/crab_address.json delete mode 100644 assets/layers/crab_address/housenumber_blank.svg delete mode 100644 assets/layers/crab_address/housenumber_blank.svg.license delete mode 100644 assets/layers/crab_address/license_info.json diff --git a/assets/layers/crab_address/crab_address.json b/assets/layers/crab_address/crab_address.json deleted file mode 100644 index a71edc2ccf..0000000000 --- a/assets/layers/crab_address/crab_address.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "id": "crab_address", - "name": "CRAB-addressen", - "description": "Address data for Flanders by the governement, suited for import into OpenStreetMap. Datadump from 2021-10-26. This layer contains only visualisation logic. Import buttons should be added via an override. Note that HNRLABEL contains the original value, whereas _HNRLABEL contains a slightly cleaned version", - "source": { - "osmTags": "HUISNR~*", - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/CRAB_2021_10_26/tile_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 18 - }, - "calculatedTags": [ - "_HNRLABEL=(() => {const lbl = feat.properties.HNRLABEL?.split('-')?.map(l => Number(l))?.filter(i => !isNaN (i)) ;if(lbl?.length != 2) {return feat.properties.HNRLABEL}; const addresses = []; for(let i = lbl[0]; i <= lbl[1]; i += 1){addresses.push(''+i);}; return addresses.join(';') })()" - ], - "title": "CRAB-adres", - "pointRendering": [ - { - "location": [ - "point", - "centroid" - ], - "iconSize": "50,50", - "label": "
{_HNRLABEL}
", - "anchor": "center", - "marker": [ - { - "icon": "./assets/layers/crab_address/housenumber_blank.svg" - } - ] - } - ], - "lineRendering": [], - "tagRenderings": [ - { - "id": "render_crab", - "render": "Volgens het CRAB ligt hier {STRAATNM} {HUISNR} (label: {HNRLABEL})" - } - ], - "allowMove": false -} diff --git a/assets/layers/crab_address/housenumber_blank.svg b/assets/layers/crab_address/housenumber_blank.svg deleted file mode 100644 index 206227d522..0000000000 --- a/assets/layers/crab_address/housenumber_blank.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/assets/layers/crab_address/housenumber_blank.svg.license b/assets/layers/crab_address/housenumber_blank.svg.license deleted file mode 100644 index ed02883002..0000000000 --- a/assets/layers/crab_address/housenumber_blank.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: Pieter Vander Vennet -SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/crab_address/license_info.json b/assets/layers/crab_address/license_info.json deleted file mode 100644 index 48a4000d40..0000000000 --- a/assets/layers/crab_address/license_info.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "path": "housenumber_blank.svg", - "license": "CC0-1.0", - "authors": [ - "Pieter Vander Vennet" - ], - "sources": [] - } -] \ No newline at end of file diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json index cdd7260c26..f6726b22a8 100644 --- a/assets/themes/grb/grb.json +++ b/assets/themes/grb/grb.json @@ -622,128 +622,6 @@ "isCounted": false }, "address", - { - "builtin": "crab_address", - "override": { - "calculatedTags+": [ - "_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", - "_closeby_addresses=closestn(feat)('address',10,undefined,50).map(f => f.feat).filter(addr => addr.properties['addr:street'] == feat.properties['STRAATNM'] && feat.properties['HNRLABEL'] == addr.properties['addr:housenumber'] + (addr.properties['addr:unit']??'') ).length", - "_has_identical_closeby_address=get(feat)('_closeby_addresses') >= 1 ? 'yes' : 'no'", - "_embedded_in_grb=overlapWith(feat)('grb')[0]?.feat?.properties ?? {}", - "_embedding_nr_grb=get(feat)('_embedded_in_grb')['addr:housenumber']", - "_embedding_street_grb=get(feat)('_embedded_in_grb')['addr:street']" - ], - "filter": [ - { - "id": "show_matched_addresses", - "options": [ - { - "question": "Show all CRAB-addresses (including already matched ones)" - }, - { - "question": "Only show unmatched addresses", - "osmTags": { - "and": [ - "_has_identical_closeby_address!=yes", - { - "#": "Matches the embedding OSM object", - "or": [ - "_embedding_nr!:={HUISNR}", - "_embedding_street!:={STRAATNM}" - ] - }, - { - "#": "Matches the embedding GRB object", - "or": [ - "_embedding_nr_grb!:={HUISNR}", - "_embedding_street_grb!:={STRAATNM}" - ] - } - ] - }, - "default": true - } - ] - } - ], - "tagRenderings+": [ - { - "id": "render_embedded", - "render": "Dit CRAB-adres ligt in OSM-gebouw {_embedding_id}", - "mappings": [ - { - "if": "_embedding_id=", - "then": { - "nl": "Geen omliggend OSM-gebouw gevonden" - } - } - ] - }, - { - "id": "embedded_address", - "render": "Het omliggende OSM-gebouw heeft geen volledig address", - "mappings": [ - { - "if": { - "and": [ - "_embedding_street~*", - "_embedding_nr~*" - ] - }, - "then": "Het omliggende object met addres heeft {_embedding_street} {_embedding_nr}" - } - ], - "condition": "_embedding_id~*" - }, - { - "id": "apply-button", - "render": "{tag_apply(addr:street=$STRAATNM; addr:housenumber=$_HNRLABEL,Apply this address on the OSM-building,,_embedding_id)}", - "condition": { - "and": [ - "_embedding_id!=", - { - "or": [ - "_embedding_street!:={STRAATNM}", - "_embedding_nr!:={_HNRLABEL}" - ] - } - ] - } - }, - { - "id": "import-button", - "render": { - "special": { - "type": "import_button", - "targetLayer": "address", - "tags": "addr:street=$STRAATNM; addr:housenumber=$_HNRLABEL", - "text": { - "nl": "Voeg dit adres als een nieuw adrespunt toe" - }, - "snap_onto_layers": "osm_buildings_no_points" - } - }, - "mappings": [ - { - "if": "_embedding_id=", - "then": { - "nl": "Geen omliggend OSM-gebouw gevonden. Een omliggend gebouw is nodig om dit punt als adres punt toe te voegen.
Importeer eerst de gebouwen. Vernieuw dan de pagina om losse adressen toe te voegen
" - } - } - ], - "condition": { - "or": [ - "_embedding_street!:={STRAATNM}", - "_embedding_nr!:={_HNRLABEL}" - ] - } - } - ] - } - }, { "builtin": "current_view", "override": { diff --git a/src/Logic/ExtraFunctions.ts b/src/Logic/ExtraFunctions.ts index 0da3cd5b69..32bd2d7f7c 100644 --- a/src/Logic/ExtraFunctions.ts +++ b/src/Logic/ExtraFunctions.ts @@ -1,6 +1,5 @@ import { GeoOperations } from "./GeoOperations" import Combine from "../UI/Base/Combine" -import BaseUIElement from "../UI/BaseUIElement" import List from "../UI/Base/List" import Title from "../UI/Base/Title" import { BBox } from "./BBox" @@ -17,6 +16,10 @@ export interface ExtraFuncParams { layerId: string, bbox: BBox ) => Feature>[][] + getProbablyOverlapsWith: ( + layerId: string, + bbox: BBox + ) => Feature>[][] getFeatureById: (id: string) => Feature> } @@ -102,13 +105,13 @@ class OverlapFunc implements ExtraFunction { "...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)", ] - _f(params, feat) { + _f(params: ExtraFuncParams, feat: Feature) { return (...layerIds: string[]) => { const result: { feat: any; overlap: number }[] = [] const seenIds = new Set() const bbox = BBox.get(feat) for (const layerId of layerIds) { - const otherFeaturess = params.getFeaturesWithin(layerId, bbox) + const otherFeaturess = params.getProbablyOverlapsWith(layerId, bbox) if (otherFeaturess === undefined) { continue } diff --git a/src/Logic/FeatureSource/Actors/GeoIndexedStore.ts b/src/Logic/FeatureSource/Actors/GeoIndexedStore.ts index ec352cab45..045e17d60c 100644 --- a/src/Logic/FeatureSource/Actors/GeoIndexedStore.ts +++ b/src/Logic/FeatureSource/Actors/GeoIndexedStore.ts @@ -27,6 +27,19 @@ export default class GeoIndexedStore implements FeatureSource { const bboxFeature = bbox.asGeojsonCached() return this.features.data.filter((f) => GeoOperations.completelyWithin(f, bboxFeature)) } + + /** + * Gets the current features within the given bbox. + * + * @param bbox + * @constructor + */ + public GetFeaturesProbablyOverlappingWith(bbox: BBox): Feature[] { + return this.features.data.filter((f) => { + const fBbox = BBox.get(f) + return fBbox.overlapsWith(bbox) + }) + } } export class GeoIndexedStoreForLayer extends GeoIndexedStore implements FeatureSourceForLayer { diff --git a/src/Logic/MetaTagging.ts b/src/Logic/MetaTagging.ts index b93acc30bb..c8dfdcde04 100644 --- a/src/Logic/MetaTagging.ts +++ b/src/Logic/MetaTagging.ts @@ -290,8 +290,22 @@ export default class MetaTagging { indexedFeatures: IndexedFeatureSource perLayer: ReadonlyMap }) { - return { + return { getFeatureById: (id) => state.indexedFeatures.featuresById.data.get(id), + getProbablyOverlapsWith: (layerId, bbox) => { + if (layerId === "*" || layerId === null || layerId === undefined) { + const feats: Feature[][] = [] + state.perLayer.forEach((layer) => { + feats.push(layer.GetFeaturesWithin(bbox)) + }) + return feats + } + if (!state.perLayer.get(layerId)) { + // This layer is not loaded + return [] + } + return [state.perLayer.get(layerId).GetFeaturesProbablyOverlappingWith(bbox)] + }, getFeaturesWithin: (layerId, bbox) => { if (layerId === "*" || layerId === null || layerId === undefined) { const feats: Feature[][] = [] diff --git a/src/UI/Map/ShowDataLayer.ts b/src/UI/Map/ShowDataLayer.ts index 4cb36dd797..1eaa8a20e3 100644 --- a/src/UI/Map/ShowDataLayer.ts +++ b/src/UI/Map/ShowDataLayer.ts @@ -278,7 +278,6 @@ class LineRenderingLayer { } }) features.features.addCallbackAndRunD(async (feats) => { - console.log("New features!", this._layername, feats) updateNeededSrc.set(true) this.update(feats) })