| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- {
- "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."
- ]
- }
|