{ "source": "yuanlingPic3 z19 TMS local imagery, per-pixel classified then 8-connected segmented", "imageryDir": "D:/GIS/GIS/yuanlingPic3", "command": "node tools/city-massing/segment-imagery-footprints.mjs", "thresholds": { "greenMin": 8, "greenG": 55, "waterBrightness": 90, "waterBlueGreen": 14, "waterTexture": 9, "darkLightSplit": 95, "edgeBarrier": 14, "erodeRadius": 1, "minAreaSqm": 40, "maxAreaSqm": 4000, "minFillRatio": 0.55, "maxLongSideM": 90, "minShortSideM": 4, "ringRadiusPx": 3, "maxRingVegetation": 0.5 }, "tiles": { "z19": { "considered": 4885, "read": 4885, "missing": 0 }, "z18Audit": { "read": 1296, "missing": 0 } }, "tileRefFormat": "tileRefs entries are [z, x, tmsY]; tmsY = 2**z - 1 - googleY matches the on-disk path", "perMask": [ { "maskId": 63, "maskAreaSqm": 47969, "tileRange": { "z": 19, "x0": 423015, "x1": 423021, "googleY0": 218927, "googleY1": 218930 }, "tilesConsidered": 28, "tilesRead": 28, "tilesMissing": 0, "windowPx": [ 1792, 1024 ], "metresPerPixel": 0.2626, "candidateComponents": 1442, "accepted": 21, "rejected": 1421, "rejections": { "areaBelowMin": 1378, "areaAboveMax": 0, "fillRatioBelowMin": 34, "longSideAboveMax": 0, "shortSideBelowMin": 4, "ringDominatedByVegetation": 1, "outsideMask": 4, "outsidePrimaryArea": 0, "intersectsRoad": 0, "intersectsWater": 0, "intersectsOsmBuilding": 0, "overlapsRegularEstateRoof": 0 } }, { "maskId": 65, "maskAreaSqm": 2595985, "tileRange": { "z": 19, "x0": 422916, "x1": 422952, "googleY0": 218889, "googleY1": 218941 }, "tilesConsidered": 1961, "tilesRead": 1961, "tilesMissing": 0, "windowPx": [ 9472, 13568 ], "metresPerPixel": 0.2626, "candidateComponents": 59883, "accepted": 1763, "rejected": 58120, "rejections": { "areaBelowMin": 55920, "areaAboveMax": 26, "fillRatioBelowMin": 1938, "longSideAboveMax": 9, "shortSideBelowMin": 78, "ringDominatedByVegetation": 18, "outsideMask": 88, "outsidePrimaryArea": 0, "intersectsRoad": 25, "intersectsWater": 0, "intersectsOsmBuilding": 18, "overlapsRegularEstateRoof": 0 } }, { "maskId": 66, "maskAreaSqm": 4293111, "tileRange": { "z": 19, "x0": 422893, "x1": 422938, "googleY0": 218858, "googleY1": 218894 }, "tilesConsidered": 1702, "tilesRead": 1702, "tilesMissing": 0, "windowPx": [ 11776, 9472 ], "metresPerPixel": 0.2625, "candidateComponents": 114053, "accepted": 3779, "rejected": 110274, "rejections": { "areaBelowMin": 105208, "areaAboveMax": 18, "fillRatioBelowMin": 4170, "longSideAboveMax": 11, "shortSideBelowMin": 158, "ringDominatedByVegetation": 27, "outsideMask": 83, "outsidePrimaryArea": 0, "intersectsRoad": 328, "intersectsWater": 0, "intersectsOsmBuilding": 271, "overlapsRegularEstateRoof": 0 } }, { "maskId": 126, "maskAreaSqm": 60802, "tileRange": { "z": 19, "x0": 422884, "x1": 422889, "googleY0": 218888, "googleY1": 218896 }, "tilesConsidered": 54, "tilesRead": 54, "tilesMissing": 0, "windowPx": [ 1536, 2304 ], "metresPerPixel": 0.2625, "candidateComponents": 1810, "accepted": 33, "rejected": 1777, "rejections": { "areaBelowMin": 1710, "areaAboveMax": 0, "fillRatioBelowMin": 47, "longSideAboveMax": 1, "shortSideBelowMin": 1, "ringDominatedByVegetation": 0, "outsideMask": 18, "outsidePrimaryArea": 0, "intersectsRoad": 0, "intersectsWater": 0, "intersectsOsmBuilding": 0, "overlapsRegularEstateRoof": 0 } }, { "maskId": 130, "maskAreaSqm": 1018440, "tileRange": { "z": 19, "x0": 422952, "x1": 422981, "googleY0": 218947, "googleY1": 218984 }, "tilesConsidered": 1140, "tilesRead": 1140, "tilesMissing": 0, "windowPx": [ 7680, 9728 ], "metresPerPixel": 0.2626, "candidateComponents": 26599, "accepted": 404, "rejected": 26195, "rejections": { "areaBelowMin": 25374, "areaAboveMax": 13, "fillRatioBelowMin": 718, "longSideAboveMax": 6, "shortSideBelowMin": 28, "ringDominatedByVegetation": 9, "outsideMask": 47, "outsidePrimaryArea": 0, "intersectsRoad": 0, "intersectsWater": 0, "intersectsOsmBuilding": 0, "overlapsRegularEstateRoof": 0 } } ], "totals": { "accepted": 6000, "candidateComponents": 203787, "rejected": 197787 }, "rejectionReasons": { "areaBelowMin": 189590, "fillRatioBelowMin": 6907, "intersectsRoad": 353, "intersectsOsmBuilding": 289, "shortSideBelowMin": 269, "outsideMask": 240, "areaAboveMax": 57, "ringDominatedByVegetation": 55, "longSideAboveMax": 27, "outsidePrimaryArea": 0, "intersectsWater": 0, "overlapsRegularEstateRoof": 0 }, "exclusionAssertions": { "checked": 6000, "violations": 0, "tests": [ "fullyInsideResidentialMask", "fullyInsidePrimaryArea", "noRoadIntersection", "noWaterIntersection", "noOsmBuildingIntersection", "noRegularEstateRoofOverlap" ] }, "auditImage": { "path": "tools/city-massing/city/imagery-footprints-audit.png", "layout": "per-mask z18 crops stacked vertically; accepted footprints 2 px bright yellow, rejected components 1 px red; panels top to bottom: mask 63, mask 65, mask 66, mask 126, mask 130", "size": [ 2400, 8748 ] }, "limitations": [ "This is imagery segmentation, not survey geometry. Boundaries follow visible roof pixels at about 0.26 m/px.", "Two touching buildings with no shadow or brightness edge between them merge into a single footprint.", "Very dark roofs on dark ground are missed or merged with the ground, because brightness cannot separate them.", "Dark blue roofs can be classified as water, because they are dark, blue-dominant and smooth.", "The emitted polygon is a minimum-area rotated rectangle: it does not follow L-shapes, courtyards or roof ridges.", "Bare bright ground (construction spoil, concrete yards) can be classified as light roof; the fill, side and ring filters remove most but not all of it.", "Positional uncertainty is on the order of one to two pixels, roughly 0.3-0.6 m.", "No height, storey count or roof material is derived; only the footprint outline." ] }