Themes(GRB): fix detection of overlapping buildings
Some checks failed
/ deploy_on_hosted (push) Failing after 1m3s

This commit is contained in:
Pieter Vander Vennet 2025-05-04 03:56:38 +02:00
parent 915b732204
commit 6bdda9fb12
9 changed files with 34 additions and 184 deletions

View file

@ -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": "<div style='margin-top: -42px; color: white' class='rounded-full p-1 font-bold relative'>{_HNRLABEL}</div>",
"anchor": "center",
"marker": [
{
"icon": "./assets/layers/crab_address/housenumber_blank.svg"
}
]
}
],
"lineRendering": [],
"tagRenderings": [
{
"id": "render_crab",
"render": "Volgens het CRAB ligt hier <b>{STRAATNM}</b> {HUISNR} (label: {HNRLABEL})"
}
],
"allowMove": false
}

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" width="371px" height="190px" viewBox="0 0 371 190" version="1.1">
<g id="surface1">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,35.294119%,67.843139%);fill-opacity:1;" d="M 30.542969 0 L 340.457031 0 C 357.261719 0 370.792969 13.542969 370.792969 30.363281 L 370.792969 159.636719 C 370.792969 176.457031 357.261719 190 340.457031 190 L 30.542969 190 C 13.738281 190 0.210938 176.457031 0.210938 159.636719 L 0.210938 30.363281 C 0.210938 13.542969 13.738281 0 30.542969 0 Z M 30.542969 0 "/>
<path style="fill:none;stroke-width:5.0152;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,100%,100%);stroke-opacity:1;stroke-miterlimit:4;" d="M 8.747177 22.772972 L 8.747177 65.005236 C 15.786155 65.005236 22.825134 72.044549 22.825134 79.083862 L 148.642348 79.083862 C 148.642348 72.044549 155.681326 65.005236 162.720304 65.005236 L 162.720304 22.772972 C 155.681326 22.772972 148.642348 15.733659 148.642348 8.694346 L 22.825134 8.694346 C 22.825134 15.733659 15.786155 22.772972 8.747177 22.772972 Z M 8.747177 22.772972 " transform="matrix(2.159848,0,0,2.161965,0.208987,0.000000000000015341)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1,2 +0,0 @@
SPDX-FileCopyrightText: Pieter Vander Vennet
SPDX-License-Identifier: CC0-1.0

View file

@ -1,10 +0,0 @@
[
{
"path": "housenumber_blank.svg",
"license": "CC0-1.0",
"authors": [
"Pieter Vander Vennet"
],
"sources": []
}
]

View file

@ -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 <a href='https://osm.org/{_embedding_id}' target='_blank'>OSM-gebouw {_embedding_id}</a>",
"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 <b>{_embedding_street}</b> {_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. <div class=subtle>Importeer eerst de gebouwen. Vernieuw dan de pagina om losse adressen toe te voegen</div>"
}
}
],
"condition": {
"or": [
"_embedding_street!:={STRAATNM}",
"_embedding_nr!:={_HNRLABEL}"
]
}
}
]
}
},
{
"builtin": "current_view",
"override": {

View file

@ -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<Geometry, Record<string, string>>[][]
getProbablyOverlapsWith: (
layerId: string,
bbox: BBox
) => Feature<Geometry, Record<string, string>>[][]
getFeatureById: (id: string) => Feature<Geometry, Record<string, string>>
}
@ -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<string>()
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
}

View file

@ -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 {

View file

@ -290,8 +290,22 @@ export default class MetaTagging {
indexedFeatures: IndexedFeatureSource
perLayer: ReadonlyMap<string, GeoIndexedStoreForLayer>
}) {
return {
return <ExtraFuncParams>{
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[][] = []

View file

@ -278,7 +278,6 @@ class LineRenderingLayer {
}
})
features.features.addCallbackAndRunD(async (feats) => {
console.log("New features!", this._layername, feats)
updateNeededSrc.set(true)
this.update(feats)
})