From 4845826debf3512b62bc38261320940ef9aed02e Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Sun, 1 Nov 2026 17:13:46 +0800 Subject: [PATCH 1/4] feat: sync Shanhe 2.2 source and add remote package verification --- .dockerignore | 13 + .gitea/workflows/verify.yml | 26 + .gitignore | 9 + Dockerfile.ci | 8 + README.md | 234 ++- package-lock.json | 36 +- package.json | 13 +- research/county-map-index.json | 1 + research/detail-map-index.json | 864 ++++++++ research/prefecture-map-index.json | 2736 ++++++++++++++++++++++++++ scripts/audit-county-maps.cjs | 19 + scripts/audit-maps.cjs | 23 +- scripts/build.mjs | 14 +- scripts/check.mjs | 1 + scripts/fetch-city-county-gis.py | 224 +++ scripts/map_geometry.py | 128 ++ scripts/pack-county-maps.cjs | 9 + scripts/package.py | 8 +- scripts/prepare-ci-audit.py | 19 + scripts/prepare-county-levels.py | 86 + scripts/prepare-detail-maps.py | 55 + scripts/prepare-maps.py | 114 +- scripts/prepare-taiwan.py | 53 + scripts/profile-physics.cjs | 15 + scripts/requirements-gis.txt | 2 + scripts/serve.mjs | 3 +- scripts/triangulate-county-holes.mjs | 14 + scripts/triangulate-holes.mjs | 10 + src/app.js | 331 +++- src/atlas.js | 28 + src/core.js | 29 +- src/county-index.js | 1 + src/county/130100.js | 1 + src/county/130200.js | 1 + src/county/130300.js | 1 + src/county/130400.js | 1 + src/county/130500.js | 1 + src/county/130600.js | 1 + src/county/130700.js | 1 + src/county/130800.js | 1 + src/county/130900.js | 1 + src/county/131000.js | 1 + src/county/131100.js | 1 + src/county/140100.js | 1 + src/county/140200.js | 1 + src/county/140300.js | 1 + src/county/140400.js | 1 + src/county/140500.js | 1 + src/county/140600.js | 1 + src/county/140700.js | 1 + src/county/140800.js | 1 + src/county/140900.js | 1 + src/county/141000.js | 1 + src/county/141100.js | 1 + src/county/150100.js | 1 + src/county/150200.js | 1 + src/county/150300.js | 1 + src/county/150400.js | 1 + src/county/150500.js | 1 + src/county/150600.js | 1 + src/county/150700.js | 1 + src/county/150800.js | 1 + src/county/150900.js | 1 + src/county/152200.js | 1 + src/county/152500.js | 1 + src/county/152900.js | 1 + src/county/210100.js | 1 + src/county/210200.js | 1 + src/county/210300.js | 1 + src/county/210400.js | 1 + src/county/210500.js | 1 + src/county/210600.js | 1 + src/county/210700.js | 1 + src/county/210800.js | 1 + src/county/210900.js | 1 + src/county/211000.js | 1 + src/county/211100.js | 1 + src/county/211200.js | 1 + src/county/211300.js | 1 + src/county/211400.js | 1 + src/county/220100.js | 1 + src/county/220200.js | 1 + src/county/220300.js | 1 + src/county/220400.js | 1 + src/county/220500.js | 1 + src/county/220600.js | 1 + src/county/220700.js | 1 + src/county/220800.js | 1 + src/county/222400.js | 1 + src/county/230100.js | 1 + src/county/230200.js | 1 + src/county/230300.js | 1 + src/county/230400.js | 1 + src/county/230500.js | 1 + src/county/230600.js | 1 + src/county/230700.js | 1 + src/county/230800.js | 1 + src/county/230900.js | 1 + src/county/231000.js | 1 + src/county/231100.js | 1 + src/county/231200.js | 1 + src/county/232700.js | 1 + src/county/320100.js | 1 + src/county/320200.js | 1 + src/county/320300.js | 1 + src/county/320400.js | 1 + src/county/320500.js | 1 + src/county/320600.js | 1 + src/county/320700.js | 1 + src/county/320800.js | 1 + src/county/320900.js | 1 + src/county/321000.js | 1 + src/county/321100.js | 1 + src/county/321200.js | 1 + src/county/321300.js | 1 + src/county/330100.js | 1 + src/county/330200.js | 1 + src/county/330300.js | 1 + src/county/330400.js | 1 + src/county/330500.js | 1 + src/county/330600.js | 1 + src/county/330700.js | 1 + src/county/330800.js | 1 + src/county/330900.js | 1 + src/county/331000.js | 1 + src/county/331100.js | 1 + src/county/340100.js | 1 + src/county/340200.js | 1 + src/county/340300.js | 1 + src/county/340400.js | 1 + src/county/340500.js | 1 + src/county/340600.js | 1 + src/county/340700.js | 1 + src/county/340800.js | 1 + src/county/341000.js | 1 + src/county/341100.js | 1 + src/county/341200.js | 1 + src/county/341300.js | 1 + src/county/341500.js | 1 + src/county/341600.js | 1 + src/county/341700.js | 1 + src/county/341800.js | 1 + src/county/350100.js | 1 + src/county/350200.js | 1 + src/county/350300.js | 1 + src/county/350400.js | 1 + src/county/350500.js | 1 + src/county/350600.js | 1 + src/county/350700.js | 1 + src/county/350800.js | 1 + src/county/350900.js | 1 + src/county/360100.js | 1 + src/county/360200.js | 1 + src/county/360300.js | 1 + src/county/360400.js | 1 + src/county/360500.js | 1 + src/county/360600.js | 1 + src/county/360700.js | 1 + src/county/360800.js | 1 + src/county/360900.js | 1 + src/county/361000.js | 1 + src/county/361100.js | 1 + src/county/370100.js | 1 + src/county/370200.js | 1 + src/county/370300.js | 1 + src/county/370400.js | 1 + src/county/370500.js | 1 + src/county/370600.js | 1 + src/county/370700.js | 1 + src/county/370800.js | 1 + src/county/370900.js | 1 + src/county/371000.js | 1 + src/county/371100.js | 1 + src/county/371300.js | 1 + src/county/371400.js | 1 + src/county/371500.js | 1 + src/county/371600.js | 1 + src/county/371700.js | 1 + src/county/410100.js | 1 + src/county/410200.js | 1 + src/county/410300.js | 1 + src/county/410400.js | 1 + src/county/410500.js | 1 + src/county/410600.js | 1 + src/county/410700.js | 1 + src/county/410800.js | 1 + src/county/410900.js | 1 + src/county/411000.js | 1 + src/county/411100.js | 1 + src/county/411200.js | 1 + src/county/411300.js | 1 + src/county/411400.js | 1 + src/county/411500.js | 1 + src/county/411600.js | 1 + src/county/411700.js | 1 + src/county/420100.js | 1 + src/county/420200.js | 1 + src/county/420300.js | 1 + src/county/420500.js | 1 + src/county/420600.js | 1 + src/county/420700.js | 1 + src/county/420800.js | 1 + src/county/420900.js | 1 + src/county/421000.js | 1 + src/county/421100.js | 1 + src/county/421200.js | 1 + src/county/421300.js | 1 + src/county/422800.js | 1 + src/county/430100.js | 1 + src/county/430200.js | 1 + src/county/430300.js | 1 + src/county/430400.js | 1 + src/county/430500.js | 1 + src/county/430600.js | 1 + src/county/430700.js | 1 + src/county/430800.js | 1 + src/county/430900.js | 1 + src/county/431000.js | 1 + src/county/431100.js | 1 + src/county/431200.js | 1 + src/county/431300.js | 1 + src/county/433100.js | 1 + src/county/440100.js | 1 + src/county/440200.js | 1 + src/county/440300.js | 1 + src/county/440400.js | 1 + src/county/440500.js | 1 + src/county/440600.js | 1 + src/county/440700.js | 1 + src/county/440800.js | 1 + src/county/440900.js | 1 + src/county/441200.js | 1 + src/county/441300.js | 1 + src/county/441400.js | 1 + src/county/441500.js | 1 + src/county/441600.js | 1 + src/county/441700.js | 1 + src/county/441800.js | 1 + src/county/445100.js | 1 + src/county/445200.js | 1 + src/county/445300.js | 1 + src/county/450100.js | 1 + src/county/450200.js | 1 + src/county/450300.js | 1 + src/county/450400.js | 1 + src/county/450500.js | 1 + src/county/450600.js | 1 + src/county/450700.js | 1 + src/county/450800.js | 1 + src/county/450900.js | 1 + src/county/451000.js | 1 + src/county/451100.js | 1 + src/county/451200.js | 1 + src/county/451300.js | 1 + src/county/451400.js | 1 + src/county/460100.js | 1 + src/county/460200.js | 1 + src/county/460300.js | 1 + src/county/510100.js | 1 + src/county/510300.js | 1 + src/county/510400.js | 1 + src/county/510500.js | 1 + src/county/510600.js | 1 + src/county/510700.js | 1 + src/county/510800.js | 1 + src/county/510900.js | 1 + src/county/511000.js | 1 + src/county/511100.js | 1 + src/county/511300.js | 1 + src/county/511400.js | 1 + src/county/511500.js | 1 + src/county/511600.js | 1 + src/county/511700.js | 1 + src/county/511800.js | 1 + src/county/511900.js | 1 + src/county/512000.js | 1 + src/county/513200.js | 1 + src/county/513300.js | 1 + src/county/513400.js | 1 + src/county/520100.js | 1 + src/county/520200.js | 1 + src/county/520300.js | 1 + src/county/520400.js | 1 + src/county/520500.js | 1 + src/county/520600.js | 1 + src/county/522300.js | 1 + src/county/522600.js | 1 + src/county/522700.js | 1 + src/county/530100.js | 1 + src/county/530300.js | 1 + src/county/530400.js | 1 + src/county/530500.js | 1 + src/county/530600.js | 1 + src/county/530700.js | 1 + src/county/530800.js | 1 + src/county/530900.js | 1 + src/county/532300.js | 1 + src/county/532500.js | 1 + src/county/532600.js | 1 + src/county/532800.js | 1 + src/county/532900.js | 1 + src/county/533100.js | 1 + src/county/533300.js | 1 + src/county/533400.js | 1 + src/county/540100.js | 1 + src/county/540200.js | 1 + src/county/540300.js | 1 + src/county/540400.js | 1 + src/county/540500.js | 1 + src/county/540600.js | 1 + src/county/542500.js | 1 + src/county/610100.js | 1 + src/county/610200.js | 1 + src/county/610300.js | 1 + src/county/610400.js | 1 + src/county/610500.js | 1 + src/county/610600.js | 1 + src/county/610700.js | 1 + src/county/610800.js | 1 + src/county/610900.js | 1 + src/county/611000.js | 1 + src/county/620100.js | 1 + src/county/620300.js | 1 + src/county/620400.js | 1 + src/county/620500.js | 1 + src/county/620600.js | 1 + src/county/620700.js | 1 + src/county/620800.js | 1 + src/county/620900.js | 1 + src/county/621000.js | 1 + src/county/621100.js | 1 + src/county/621200.js | 1 + src/county/622900.js | 1 + src/county/623000.js | 1 + src/county/630100.js | 1 + src/county/630200.js | 1 + src/county/632200.js | 1 + src/county/632300.js | 1 + src/county/632500.js | 1 + src/county/632600.js | 1 + src/county/632700.js | 1 + src/county/632800.js | 1 + src/county/640100.js | 1 + src/county/640200.js | 1 + src/county/640300.js | 1 + src/county/640400.js | 1 + src/county/640500.js | 1 + src/county/650100.js | 1 + src/county/650200.js | 1 + src/county/650400.js | 1 + src/county/650500.js | 1 + src/county/652300.js | 1 + src/county/652700.js | 1 + src/county/652800.js | 1 + src/county/652900.js | 1 + src/county/653000.js | 1 + src/county/653100.js | 1 + src/county/653200.js | 1 + src/county/654000.js | 1 + src/county/654200.js | 1 + src/county/654300.js | 1 + src/game.js | 302 ++- src/index.html | 39 +- src/maps.js | 2 +- src/result.js | 2 +- src/style.css | 548 +++++- src/video.js | 93 + tests/atlas.mjs | 22 + tests/browser.mjs | 23 +- tests/celebrations.mjs | 21 + tests/container-layout.mjs | 9 +- tests/county-levels.test.cjs | 54 + tests/county-packaging.test.cjs | 9 + tests/difficulty.test.cjs | 56 + tests/frame-loop.test.cjs | 9 + tests/game.test.cjs | 79 +- tests/growth.test.cjs | 29 + tests/helpers.mjs | 20 + tests/interactions.mjs | 13 +- tests/labels.mjs | 3 +- tests/magnet.test.cjs | 30 + tests/milestones.test.cjs | 11 + tests/overflow.test.cjs | 56 + tests/overlap.test.cjs | 11 + tests/physics-hotpaths.test.cjs | 28 + tests/pockets.test.cjs | 21 + tests/province-direct.mjs | 23 + tests/province-direct.test.cjs | 10 + tests/publish.test.cjs | 14 + tests/records.test.cjs | 61 + tests/results.mjs | 17 +- tests/shake-preview.mjs | 13 +- tests/staging.mjs | 14 + tests/swipes.mjs | 3 +- tests/upright.test.cjs | 12 + tests/video.mjs | 47 + 396 files changed, 6748 insertions(+), 411 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitea/workflows/verify.yml create mode 100644 Dockerfile.ci create mode 100644 research/county-map-index.json create mode 100644 research/detail-map-index.json create mode 100644 research/prefecture-map-index.json create mode 100644 scripts/audit-county-maps.cjs create mode 100644 scripts/fetch-city-county-gis.py create mode 100644 scripts/map_geometry.py create mode 100644 scripts/pack-county-maps.cjs create mode 100644 scripts/prepare-ci-audit.py create mode 100644 scripts/prepare-county-levels.py create mode 100644 scripts/prepare-detail-maps.py create mode 100644 scripts/prepare-taiwan.py create mode 100644 scripts/profile-physics.cjs create mode 100644 scripts/requirements-gis.txt create mode 100644 scripts/triangulate-county-holes.mjs create mode 100644 scripts/triangulate-holes.mjs create mode 100644 src/atlas.js create mode 100644 src/county-index.js create mode 100644 src/county/130100.js create mode 100644 src/county/130200.js create mode 100644 src/county/130300.js create mode 100644 src/county/130400.js create mode 100644 src/county/130500.js create mode 100644 src/county/130600.js create mode 100644 src/county/130700.js create mode 100644 src/county/130800.js create mode 100644 src/county/130900.js create mode 100644 src/county/131000.js create mode 100644 src/county/131100.js create mode 100644 src/county/140100.js create mode 100644 src/county/140200.js create mode 100644 src/county/140300.js create mode 100644 src/county/140400.js create mode 100644 src/county/140500.js create mode 100644 src/county/140600.js create mode 100644 src/county/140700.js create mode 100644 src/county/140800.js create mode 100644 src/county/140900.js create mode 100644 src/county/141000.js create mode 100644 src/county/141100.js create mode 100644 src/county/150100.js create mode 100644 src/county/150200.js create mode 100644 src/county/150300.js create mode 100644 src/county/150400.js create mode 100644 src/county/150500.js create mode 100644 src/county/150600.js create mode 100644 src/county/150700.js create mode 100644 src/county/150800.js create mode 100644 src/county/150900.js create mode 100644 src/county/152200.js create mode 100644 src/county/152500.js create mode 100644 src/county/152900.js create mode 100644 src/county/210100.js create mode 100644 src/county/210200.js create mode 100644 src/county/210300.js create mode 100644 src/county/210400.js create mode 100644 src/county/210500.js create mode 100644 src/county/210600.js create mode 100644 src/county/210700.js create mode 100644 src/county/210800.js create mode 100644 src/county/210900.js create mode 100644 src/county/211000.js create mode 100644 src/county/211100.js create mode 100644 src/county/211200.js create mode 100644 src/county/211300.js create mode 100644 src/county/211400.js create mode 100644 src/county/220100.js create mode 100644 src/county/220200.js create mode 100644 src/county/220300.js create mode 100644 src/county/220400.js create mode 100644 src/county/220500.js create mode 100644 src/county/220600.js create mode 100644 src/county/220700.js create mode 100644 src/county/220800.js create mode 100644 src/county/222400.js create mode 100644 src/county/230100.js create mode 100644 src/county/230200.js create mode 100644 src/county/230300.js create mode 100644 src/county/230400.js create mode 100644 src/county/230500.js create mode 100644 src/county/230600.js create mode 100644 src/county/230700.js create mode 100644 src/county/230800.js create mode 100644 src/county/230900.js create mode 100644 src/county/231000.js create mode 100644 src/county/231100.js create mode 100644 src/county/231200.js create mode 100644 src/county/232700.js create mode 100644 src/county/320100.js create mode 100644 src/county/320200.js create mode 100644 src/county/320300.js create mode 100644 src/county/320400.js create mode 100644 src/county/320500.js create mode 100644 src/county/320600.js create mode 100644 src/county/320700.js create mode 100644 src/county/320800.js create mode 100644 src/county/320900.js create mode 100644 src/county/321000.js create mode 100644 src/county/321100.js create mode 100644 src/county/321200.js create mode 100644 src/county/321300.js create mode 100644 src/county/330100.js create mode 100644 src/county/330200.js create mode 100644 src/county/330300.js create mode 100644 src/county/330400.js create mode 100644 src/county/330500.js create mode 100644 src/county/330600.js create mode 100644 src/county/330700.js create mode 100644 src/county/330800.js create mode 100644 src/county/330900.js create mode 100644 src/county/331000.js create mode 100644 src/county/331100.js create mode 100644 src/county/340100.js create mode 100644 src/county/340200.js create mode 100644 src/county/340300.js create mode 100644 src/county/340400.js create mode 100644 src/county/340500.js create mode 100644 src/county/340600.js create mode 100644 src/county/340700.js create mode 100644 src/county/340800.js create mode 100644 src/county/341000.js create mode 100644 src/county/341100.js create mode 100644 src/county/341200.js create mode 100644 src/county/341300.js create mode 100644 src/county/341500.js create mode 100644 src/county/341600.js create mode 100644 src/county/341700.js create mode 100644 src/county/341800.js create mode 100644 src/county/350100.js create mode 100644 src/county/350200.js create mode 100644 src/county/350300.js create mode 100644 src/county/350400.js create mode 100644 src/county/350500.js create mode 100644 src/county/350600.js create mode 100644 src/county/350700.js create mode 100644 src/county/350800.js create mode 100644 src/county/350900.js create mode 100644 src/county/360100.js create mode 100644 src/county/360200.js create mode 100644 src/county/360300.js create mode 100644 src/county/360400.js create mode 100644 src/county/360500.js create mode 100644 src/county/360600.js create mode 100644 src/county/360700.js create mode 100644 src/county/360800.js create mode 100644 src/county/360900.js create mode 100644 src/county/361000.js create mode 100644 src/county/361100.js create mode 100644 src/county/370100.js create mode 100644 src/county/370200.js create mode 100644 src/county/370300.js create mode 100644 src/county/370400.js create mode 100644 src/county/370500.js create mode 100644 src/county/370600.js create mode 100644 src/county/370700.js create mode 100644 src/county/370800.js create mode 100644 src/county/370900.js create mode 100644 src/county/371000.js create mode 100644 src/county/371100.js create mode 100644 src/county/371300.js create mode 100644 src/county/371400.js create mode 100644 src/county/371500.js create mode 100644 src/county/371600.js create mode 100644 src/county/371700.js create mode 100644 src/county/410100.js create mode 100644 src/county/410200.js create mode 100644 src/county/410300.js create mode 100644 src/county/410400.js create mode 100644 src/county/410500.js create mode 100644 src/county/410600.js create mode 100644 src/county/410700.js create mode 100644 src/county/410800.js create mode 100644 src/county/410900.js create mode 100644 src/county/411000.js create mode 100644 src/county/411100.js create mode 100644 src/county/411200.js create mode 100644 src/county/411300.js create mode 100644 src/county/411400.js create mode 100644 src/county/411500.js create mode 100644 src/county/411600.js create mode 100644 src/county/411700.js create mode 100644 src/county/420100.js create mode 100644 src/county/420200.js create mode 100644 src/county/420300.js create mode 100644 src/county/420500.js create mode 100644 src/county/420600.js create mode 100644 src/county/420700.js create mode 100644 src/county/420800.js create mode 100644 src/county/420900.js create mode 100644 src/county/421000.js create mode 100644 src/county/421100.js create mode 100644 src/county/421200.js create mode 100644 src/county/421300.js create mode 100644 src/county/422800.js create mode 100644 src/county/430100.js create mode 100644 src/county/430200.js create mode 100644 src/county/430300.js create mode 100644 src/county/430400.js create mode 100644 src/county/430500.js create mode 100644 src/county/430600.js create mode 100644 src/county/430700.js create mode 100644 src/county/430800.js create mode 100644 src/county/430900.js create mode 100644 src/county/431000.js create mode 100644 src/county/431100.js create mode 100644 src/county/431200.js create mode 100644 src/county/431300.js create mode 100644 src/county/433100.js create mode 100644 src/county/440100.js create mode 100644 src/county/440200.js create mode 100644 src/county/440300.js create mode 100644 src/county/440400.js create mode 100644 src/county/440500.js create mode 100644 src/county/440600.js create mode 100644 src/county/440700.js create mode 100644 src/county/440800.js create mode 100644 src/county/440900.js create mode 100644 src/county/441200.js create mode 100644 src/county/441300.js create mode 100644 src/county/441400.js create mode 100644 src/county/441500.js create mode 100644 src/county/441600.js create mode 100644 src/county/441700.js create mode 100644 src/county/441800.js create mode 100644 src/county/445100.js create mode 100644 src/county/445200.js create mode 100644 src/county/445300.js create mode 100644 src/county/450100.js create mode 100644 src/county/450200.js create mode 100644 src/county/450300.js create mode 100644 src/county/450400.js create mode 100644 src/county/450500.js create mode 100644 src/county/450600.js create mode 100644 src/county/450700.js create mode 100644 src/county/450800.js create mode 100644 src/county/450900.js create mode 100644 src/county/451000.js create mode 100644 src/county/451100.js create mode 100644 src/county/451200.js create mode 100644 src/county/451300.js create mode 100644 src/county/451400.js create mode 100644 src/county/460100.js create mode 100644 src/county/460200.js create mode 100644 src/county/460300.js create mode 100644 src/county/510100.js create mode 100644 src/county/510300.js create mode 100644 src/county/510400.js create mode 100644 src/county/510500.js create mode 100644 src/county/510600.js create mode 100644 src/county/510700.js create mode 100644 src/county/510800.js create mode 100644 src/county/510900.js create mode 100644 src/county/511000.js create mode 100644 src/county/511100.js create mode 100644 src/county/511300.js create mode 100644 src/county/511400.js create mode 100644 src/county/511500.js create mode 100644 src/county/511600.js create mode 100644 src/county/511700.js create mode 100644 src/county/511800.js create mode 100644 src/county/511900.js create mode 100644 src/county/512000.js create mode 100644 src/county/513200.js create mode 100644 src/county/513300.js create mode 100644 src/county/513400.js create mode 100644 src/county/520100.js create mode 100644 src/county/520200.js create mode 100644 src/county/520300.js create mode 100644 src/county/520400.js create mode 100644 src/county/520500.js create mode 100644 src/county/520600.js create mode 100644 src/county/522300.js create mode 100644 src/county/522600.js create mode 100644 src/county/522700.js create mode 100644 src/county/530100.js create mode 100644 src/county/530300.js create mode 100644 src/county/530400.js create mode 100644 src/county/530500.js create mode 100644 src/county/530600.js create mode 100644 src/county/530700.js create mode 100644 src/county/530800.js create mode 100644 src/county/530900.js create mode 100644 src/county/532300.js create mode 100644 src/county/532500.js create mode 100644 src/county/532600.js create mode 100644 src/county/532800.js create mode 100644 src/county/532900.js create mode 100644 src/county/533100.js create mode 100644 src/county/533300.js create mode 100644 src/county/533400.js create mode 100644 src/county/540100.js create mode 100644 src/county/540200.js create mode 100644 src/county/540300.js create mode 100644 src/county/540400.js create mode 100644 src/county/540500.js create mode 100644 src/county/540600.js create mode 100644 src/county/542500.js create mode 100644 src/county/610100.js create mode 100644 src/county/610200.js create mode 100644 src/county/610300.js create mode 100644 src/county/610400.js create mode 100644 src/county/610500.js create mode 100644 src/county/610600.js create mode 100644 src/county/610700.js create mode 100644 src/county/610800.js create mode 100644 src/county/610900.js create mode 100644 src/county/611000.js create mode 100644 src/county/620100.js create mode 100644 src/county/620300.js create mode 100644 src/county/620400.js create mode 100644 src/county/620500.js create mode 100644 src/county/620600.js create mode 100644 src/county/620700.js create mode 100644 src/county/620800.js create mode 100644 src/county/620900.js create mode 100644 src/county/621000.js create mode 100644 src/county/621100.js create mode 100644 src/county/621200.js create mode 100644 src/county/622900.js create mode 100644 src/county/623000.js create mode 100644 src/county/630100.js create mode 100644 src/county/630200.js create mode 100644 src/county/632200.js create mode 100644 src/county/632300.js create mode 100644 src/county/632500.js create mode 100644 src/county/632600.js create mode 100644 src/county/632700.js create mode 100644 src/county/632800.js create mode 100644 src/county/640100.js create mode 100644 src/county/640200.js create mode 100644 src/county/640300.js create mode 100644 src/county/640400.js create mode 100644 src/county/640500.js create mode 100644 src/county/650100.js create mode 100644 src/county/650200.js create mode 100644 src/county/650400.js create mode 100644 src/county/650500.js create mode 100644 src/county/652300.js create mode 100644 src/county/652700.js create mode 100644 src/county/652800.js create mode 100644 src/county/652900.js create mode 100644 src/county/653000.js create mode 100644 src/county/653100.js create mode 100644 src/county/653200.js create mode 100644 src/county/654000.js create mode 100644 src/county/654200.js create mode 100644 src/county/654300.js create mode 100644 src/video.js create mode 100644 tests/atlas.mjs create mode 100644 tests/celebrations.mjs create mode 100644 tests/county-levels.test.cjs create mode 100644 tests/county-packaging.test.cjs create mode 100644 tests/difficulty.test.cjs create mode 100644 tests/frame-loop.test.cjs create mode 100644 tests/growth.test.cjs create mode 100644 tests/helpers.mjs create mode 100644 tests/magnet.test.cjs create mode 100644 tests/milestones.test.cjs create mode 100644 tests/overflow.test.cjs create mode 100644 tests/overlap.test.cjs create mode 100644 tests/physics-hotpaths.test.cjs create mode 100644 tests/pockets.test.cjs create mode 100644 tests/province-direct.mjs create mode 100644 tests/province-direct.test.cjs create mode 100644 tests/publish.test.cjs create mode 100644 tests/records.test.cjs create mode 100644 tests/staging.mjs create mode 100644 tests/upright.test.cjs create mode 100644 tests/video.mjs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7a8a070 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +.git +node_modules +.codex +.claude +.cache +dist +artifacts +data +__pycache__ +**/__pycache__ +*.log +.env +.env.* diff --git a/.gitea/workflows/verify.yml b/.gitea/workflows/verify.yml new file mode 100644 index 0000000..42f0289 --- /dev/null +++ b/.gitea/workflows/verify.yml @@ -0,0 +1,26 @@ +name: Shanhe source and offline package checks +on: + pull_request: + branches: [main] + push: + branches: [main] +concurrency: + group: shanhe-${{ gitea.event.pull_request.number || gitea.ref }} + cancel-in-progress: true +jobs: + verify: + runs-on: ces-control + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - name: Check patch formatting + run: git diff --check HEAD^ HEAD + - name: Build isolated verification image + run: docker build -f Dockerfile.ci -t "shanhe-check:${{ gitea.sha }}" . + - name: Verify unit tests and offline package + run: docker run --rm "shanhe-check:${{ gitea.sha }}" + - name: Remove this verification image while retaining parent cache + if: always() + run: | + image="shanhe-check:${{ gitea.sha }}" + if docker image inspect "$image" >/dev/null 2>&1; then docker image rm --no-prune "$image"; fi diff --git a/.gitignore b/.gitignore index e587bcd..6810521 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,12 @@ __pycache__/ # Development research: only the map snapshot used by build-time audit is required /research/* !/research/china.json + +# Compact source index required by the detailed-map build audit +!/research/detail-map-index.json + +# Compact province-child index required to prevent missing-region regressions +!/research/prefecture-map-index.json + +# Compact county source index required by offline-stage integrity checks +!/research/county-map-index.json diff --git a/Dockerfile.ci b/Dockerfile.ci new file mode 100644 index 0000000..532f6ef --- /dev/null +++ b/Dockerfile.ci @@ -0,0 +1,8 @@ +FROM node:24-bookworm +RUN apt-get update && apt-get install -y --no-install-recommends python3 ca-certificates && rm -rf /var/lib/apt/lists/* +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci +COPY . . +RUN python3 scripts/prepare-ci-audit.py +CMD ["sh", "-c", "npm test && npm run build"] diff --git a/README.md b/README.md index 59637fb..7ce642a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # 山河拼图 -参考用户提供的日本地图下落合并视频开发的小红书离线小工具。正式交付包含**省级版、地级版**;县级素材已备好,未进入游戏发布包。 +参考用户提供的日本地图下落合并视频开发的小红书离线小工具。正式交付包含**省级版、地级版**,以及四直辖市县区、港澳分区、台湾县市细分关卡。新增329个地级行政区的县区关卡,共364关,支持全国→省域→城市县区的三级选关。 + +回正辅助现为“回正一次”按钮:只调整点击时已落下的地块,没有持续模式,新块和后续碰撞仍自由转动。 项目独立存放于 `ProjectRednote/shanhe-puzzle/`。以下命令请在 `shanhe-puzzle` 目录执行。仓库仅跟踪源码、测试和构建脚本、依赖清单、本文档,以及运行和构建校验必需的地图数据。 @@ -8,78 +10,99 @@ ```sh npm ci +npm run build npm run dev # http://localhost:4173 npm test npm run build npm run test:browser -npm run test:results -npm run test:interactions -npm run test:container -npm run test:swipes +npm run test:staging ``` -浏览器测试目前默认使用 macOS 已安装的 Google Chrome,路径见 `tests/browser.mjs`。构建要求 Python 3,以及官方 [minitool-zip-builder 1.8.0 Skill](https://fe-static.xhscdn.com/minitool/20261015161653/minitool-zip-builder-1.8.0.skill)。克隆后需将 Skill 解压到本地 `.codex/skills/minitool-zip-builder/`,该目录应直接包含 `SKILL.md`、`references/` 和 `scripts/`。本地工具、依赖、构建输出和报告均已忽略,不推送到代码库。所有运行依赖与地图随最终 ZIP 提供,无联网运行逻辑。 +browser/staging为当前手动落子与难度确认流程;其余旧浏览器脚本中依赖定时下落或直接开局的场景需要更新,不列入上述建议命令。本次通过CUA实际操作验证界面,未运行CLI浏览器脚本。浏览器测试目前默认使用 macOS 已安装的 Google Chrome,路径见 `tests/browser.mjs`。构建要求 Python 3,以及官方 [minitool-zip-builder 1.8.0 Skill](https://fe-static.xhscdn.com/minitool/20261015161653/minitool-zip-builder-1.8.0.skill)。克隆后需将 Skill 解压到本地 `.codex/skills/minitool-zip-builder/`,该目录应直接包含 `SKILL.md`、`references/` 和 `scripts/`。本地工具、依赖、构建输出和报告均已忽略,不推送到代码库。所有运行依赖与地图随最终 ZIP 提供,无联网运行逻辑。 -上传产物:`artifacts/shanhe-puzzle-xhs.zip`。根目录直接包含 `index.html`,不是项目源码压缩包。源代码在 `src/`,静态构建在 `dist/`。 +上传产物:`artifacts/shanhe-puzzle-xhs.zip`。根目录直接包含 `index.html`,不是项目源码压缩包。源代码在 `src/`,静态构建在 `dist/`。发行包共186个文件:173个同省双关县区脚本和13个基础文件,保留全部364关。预检和打包器均强制限制文件数不超过200,不包含node_modules、.git、原始素材或测试报告。 **必须在创服平台模拟器、Android 真机扫码、iOS 真机扫码验证同一 ZIP。** 本地浏览器仅用于开发回归和视觉检查,不能替代小红书容器验收。Chrome 61 / Android 8.1 兼容性、CSS 兼容性及真机性能均未实测;原生发笔记、相册授权和保存需要真机验证。 -本机预览服务监听 `127.0.0.1:4173`,可以在这台Mac的系统浏览器打开 `http://localhost:4173/`;与Codex内置浏览器使用同一个服务。当前已有服务时无需重复启动。 +本机预览默认提供dist中的构建产物;修改源码后需先重新运行npm run build。服务监听 `127.0.0.1:4173`,可以在这台Mac的系统浏览器打开 `http://localhost:4173/`;与Codex内置浏览器使用同一个服务。当前已有服务时无需重复启动。 ## 版本范围 - 省级版:全国 34 个省级行政区,各出现一次,合并为一个整体即通关。 -- 地级版:选择省或自治区,提供 27 个关卡、333 个地级行政区,包含地级市、自治州、地区、盟。 -- 排除县、区、县级市,以及济源、仙桃等省直辖县级单位。数据源会把部分县级单位标为 `city`,构建时进一步用行政区代码排除。 -- 北京、天津、上海、重庆、香港、澳门不设地级关卡;数据源暂缺台湾省地级边界,未生成对应地级关卡。 -- 本机县级原始边界位于 `data/raw/`,共 335 组、2840 个县级单元;预处理素材位于 `data/county-materials/`,另附独立素材 ZIP。这些开发素材全部保留本地,不进入 Git 或发布包。 +- 地级版:选择省或自治区,提供27个省内关卡、333个地级行政区及30个省直辖县级地区,合计363块,包含地级市、自治州、地区、盟和省直辖地区。 +- 省内关卡保留省级源素材的全部直接子区域,补回湖北仙桃、潜江、天门、神农架(13→17块),海南15个省直辖地区(4→19块),河南济源(17→18块),新疆素材中的10个直属市(14→24块)。这四关标为“省域拼图”,说明包括省直辖县级地区;不向下展开普通地级市所属县区。范围以2026-10-16下载的源素材快照为准,不声称当前最新区划完备性。 +- 北京、天津、上海各16区,重庆38个区县:显示“县区拼图”。香港18个分区、澳门8个源素材分区:显示“分区拼图”,不冒称县级行政区。 +- 台湾省20个县市:显示“县市拼图”,不与市内各区混级。来源为国土测绘中心COUNTY_MOI_1090820开放快照,2026-10-17下载,遵循政府资料开放授权条款第1版。金门、连江属福建,不重复列入台湾关卡;所有源外环保留,远海岛屿移位示意在准备页明确标注。 +- 全国入口不显示返回按钮,只有进入细分地图后才显示“全国地图”;导航行保留固定高度,出现或隐藏按钮不改变地图主体、开始按钮位置。 +- 本机县级原始边界位于 `data/raw/`,共 335 组、2840 个县级单元;预处理素材位于 `data/county-materials/`,另附独立素材 ZIP。原始数据与备用素材均保留本地,不进入Git;正式包和Git仅包含已开放关卡所需的简化轮廓。 ## 玩法与得分 -进入页选择省级 / 地级版、地区、四档下落速度和三档弹性,点击“开启这局旅程”后开局。在容器内快速轻划并松手,给容器一次惯性晃动;划过位置附近的地块反应更强。每次轻划只在松手时触发一次,地块获得带少量方向、力度差异的冲量后自由运动,手指只能决定大致方向。慢拖、按住、取消触摸或暂停不会持续施力,也不会抓取、牵引或瞬移单块碎片。底部只有一个无文字的圆形暂停图标,统一查看本局旅程、继续、结束或重开;电脑保留方向键辅助。弹跳、倾斜和速度有上限。 +进入页以中国地图为主体,点击“开启旅程”并确认难度后开始全国34块省级拼图;点击地图上的省区即可钻入对应地级、县区、县市或分区拼图准备页;省域地图上的地级市可再进入该市县区拼图,依次返回省域和全国。地图上的名称也能点击,支持键盘聚焦后按 Enter / 空格。原先未开放的7个地区现已按县区、县市或分区层级开放;34个省级地区均可进入细分关卡。 -只有真实相邻关系、正确地理位置接近时才自动吸合。全部落下后仍可晃动,直到通关、稳定堆过红线超过 2.4 秒,或主动结束。底部圆形暂停图标打开旅程菜单,可继续、结束旅程、重新开局。结束旅程会保留成绩,即使零分或未通关也会生成图片;通关和判负自动生成。 +“这次要拼 N 块山河”、目的地和本地最佳与地图放在同一个场景里。地图场景、开局栏按可见视口确定固定尺寸,选省、返回、打开或关闭设置均不重新分配高度。首页难度仅作展示,吸附难度和碰撞弹性仅在点击“开启旅程”后的确认弹窗内修改,确认出发后生效,取消不修改。每次开启、重新开局或再来一局,都必须确认难度;确认前不启动或重置游戏,取消重开返回原局暂停页。所有对局固定为随心落子,不再提供下落速度选择。吸附默认“轻松拼”,弹性保留四档。 -省级海岛使用明确标注的“跨海连接”;地级版中因海域、未纳入本关的省直辖县等产生的间隔,使用明确标注的“隔区连接”。这两种连接都是游戏规则,不能当作陆地邻接关系。入口地图保留相对地理位置。 +进入游戏后,首块及后续每一块先在红线上方准备,尚未进入物理世界,不计入落下数、合并或堆顶判断。按住上方待落区左右拖动可调整下一块横向落点,按真实轮廓限制左右边界;预览按预备区空间显示,小地区有最小可见尺寸。释放后按当前游戏比例进入物理世界。 -| 档位 | 出片间隔 | 重力参数 | 得分倍率 | +所有关卡均为“随心落子”:等待不会自动释放,在红线上方左右调整并松手时才落一块,得分倍率×1。取消触摸、暂停、切后台、横竖屏变化不视为松手落块;暂停冻结游戏计时。旧手势不能继续拖动已落图块或误放下一块。电脑聚焦画布后可按Enter辅助释放待落块。 + +在红线下方快速轻划并松手,给容器一次惯性晃动;划过位置附近的地块反应更强。每次轻划只在松手时触发一次,地块获得带少量方向、力度差异的冲量后自由运动,手指只能决定大致方向。慢拖、按住、取消触摸或暂停不会持续施力,也不会抓取、牵引或瞬移单块碎片。底部只有一个无文字的圆形暂停图标,统一查看本局旅程、继续、结束或重开;电脑保留方向键辅助。弹跳高度、平移速度和旋转速度有上限,旋转角度不受限制。 + +全国版中,同一组合包含一个玩法地区的全部省级地块时,触发一次“地区拼合完成”庆祝:金色轮廓、短暂提示卡和少量彩屑。七组为华北、东北、华东、华中、华南、西南、西北,互不重复覆盖34块;华东含台湾,华南含香港、澳门。仅为玩法分组,完整名单见src/game.js。一个地区可以属于更大的组合,只落齐而未合并不触发。每组每局仅一次,连续达成依次展示。细分关卡按最大组合达到25%、50%、75%提示“初见山河 / 半程相逢 / 山河渐全”;少于两块或已经相当于全关的门槛略过,一次跨多个门槛只展示最高新阶段。阶段提示不额外加分。 + +全部拼完后播放2.6秒“山河,完整了”庆祝,再进入成绩页;物理、得分和游玩计时冻结,切后台暂停演出、返回继续。游戏内演出及阶段反馈使用同一Canvas绘制器进入完整游玩视频,视频保留通关演出时长,成绩图的游玩时长不增加。尊重减少动态效果设置,保留静态达成提示。 + +只有真实相邻关系、正确地理位置接近时才自动吸合。全部落下后仍可晃动,直到通关、同一组地块稳定堆过红线超过 2.4 秒(出生保护 5 秒,须经实际接触连到底部;短暂弹起、贴侧墙或悬空不计),或主动结束。底部圆形暂停图标打开旅程菜单,可继续、结束旅程、重新开局。结束旅程会保留成绩,即使零分或未通关也会生成图片;通关和判负自动生成。 + +省级海岛使用明确标注的“跨海连接”;地级版中因海域、源素材中不相接地区等产生的间隔,使用明确标注的“隔区连接”。这两种连接都是游戏规则,不能当作陆地邻接关系。入口地图保留相对地理位置。 + +| 吸附难度 | 合并位置容差 | 开始靠拢范围 | 相对角度容差 | | --- | ---: | ---: | ---: | -| 佛系看山 | 8.5 秒 | 0.32 | ×1 | -| 说走就走 | 6 秒 | 0.48 | ×1.5 | -| 一路狂飙 | 4 秒 | 0.7 | ×2 | -| 山河起飞 | 2.5 秒 | 1 | ×3 | +| 轻松拼(默认) | 84px | 148px | 约57° | +| 刚刚好 | 52px | 98px | 约38° | +| 严丝合缝(原规则) | 26px | 45px | 约16° | -每次合并分数 = `(100 + 40 × (合并后块数 − 2)) × 连合系数 × 速度倍率 × 特殊连接系数`,四舍五入到整数。8.5 秒内再次合并视为连合,系数每次增加 0.25,从 1 起、最高 2;跨海和隔区连接额外乘 0.8。通关再奖 `1000 × 速度倍率`。轻划不限次数、不扣分。弹性不改变得分倍率。 +距离为游戏Canvas逻辑像素。轻松和普通档围绕真实邻接的地区中心中点比较正确位置,避免地图原点影响角度容差;困难档保留此前的平移/角度判定。远距靠拢仍只施加双向力,不旋转回正,不直接拖动已落地块。所有档位都保留合并试放、长大阻挡和防穿透检查。 -弹性三档为“轻轻弹 / 蹦蹦跳 / 弹力全开”,碰撞恢复系数分别为 0.65 / 0.82 / 0.96,同时调整空气阻力、横向冲量和上抛上限。现在最低档对应上一版最高档;默认推荐“蹦蹦跳”,便于腾挪,“弹力全开”需要更好地控制节奏。省级、地级碎片均在上一版基础上线性再缩小 10%;地级仍比相同地图基准额外小 30%;组合过大时仍会全局等比缩放。 +每次合并分数 = `(100 + 40 × (合并后块数 − 2)) × 连合系数 × 特殊连接系数`,四舍五入到整数。8.5 秒内再次合并视为连合,系数每次增加 0.25,从 1 起、最高 2;跨海和隔区连接额外乘 0.8。通关再奖 `1000` 分。轻划不限次数、不扣分。吸附难度和弹性不改变得分倍率。 -最佳纪录按“关卡 + 下落速度 + 弹性”分别保存,旧版纪录对应最低弹性。客户端 9.46.0+ 优先使用官方 Storage;含同步启动信息、异步回退、编译序号剥离及旧纪录迁移。旧环境回退到带异常处理的浏览器存储。 +弹性四档为“轻轻弹 / 蹦蹦跳 / 元气弹跳 / 弹力全开”,碰撞恢复系数分别为 0.65 / 0.82 / 0.90 / 0.96,同时调整空气阻力、横向冲量和上抛上限。新档“元气弹跳”的上抛、冲量和速度上限介于正常与全开之间;保留旧三档参数和纪录身份;默认推荐“蹦蹦跳”,便于腾挪,“弹力全开”需要更好地控制节奏。省级、地级碎片均在上一版基础上线性再缩小 10%;地级仍比相同地图基准额外小 30%;组合过大时仍会全局等比缩放。 -成绩页展示可分享的 750×1400 图片:本局得分、结束时实际容器画面、关卡、速度和弹性、用时、最大拼合 / 最佳连合,以及得分随分钟变化的曲线。曲线从零开始,记录实际得分时刻和结束时间,包含通关奖励,暂停不计时。不会用完整地图冒充未完成的结局。 +最佳纪录按“关卡 + 吸附难度 + 弹性”分别保存;旧版随心落子纪录只归入“严丝合缝”及其原弹性档位,不混入较易难度;旧版定时纪录仍保留但不混入当前模式的入口最佳;战绩簿按难度汇总历史最高分,旧版无吸附档位的分数归入原难度。客户端 9.46.0+ 优先使用官方 Storage;含同步启动信息、异步回退、编译序号剥离及旧纪录迁移。旧环境回退到带异常处理的浏览器存储。 + +成绩页展示可分享的 750×1400 图片:本局得分、结束时实际容器画面、关卡、吸附难度和弹性、用时、最大拼合 / 最佳连合,以及得分随分钟变化的曲线。曲线从零开始,记录实际得分时刻和结束时间,包含通关奖励,暂停不计时。不会用完整地图冒充未完成的结局。 “发小红书”在玩家点击后调用 `writeTempFile` + `postNote`,携带图片和成绩文案打开图文发布页,玩家可编辑、取消、确认发布;不会自动发布或声称审核成功。“保存成绩图”调用 `writeTempFile` + `saveImageToPhotosAlbum`。无 SDK、接口缺失、授权拒绝、取消或调用失败都有提示,不丢失成绩图;临时路径即用即弃。 -当前[官方文档](https://miniapp-sandbox.xiaohongshu.com/minitool/doc#s3-3)支持分享已有视频,但未提供公开录屏 API;屏幕共享被禁用。因此本包不含自动录屏,可用手机系统录屏后自行分享。未使用未公开原生 bridge 或网页屏幕采集。 +成绩页以斜线分隔的统一发布入口提供“发图文 / 发视频”。首次点击“发视频”会生成视频并继续打开发布编辑页,已有视频则直接复用;生成期间右侧变为“取消生成”。发布时用 `writeTempFile` 写入 MP4 与成绩图封面,再通过 `postNote({pageType: "video_publish"})` 打开视频笔记编辑页。玩家确认后发布;失败或取消保留生成的视频,重试时使用新临时路径。当前设备不支持 MP4 编码时提示并保留成绩图分享。 -构建使用已随源码提供的 `src/maps.js`;`research/china.json` 是构建时地图完整性核对必需的源快照。其余 `research/` 文件和整个 `data/` 目录均不入库。下载与预处理脚本仅用于另行更新地图;重生成前需要准备 `research/areas.json` 等原始输入。 +视频来自整局游戏的轻量渲染状态:从开局到结束按30帧/秒采样图块位置、旋转、合并缩放、待落图块、碰撞效果与得分,暂停和后台不计入旅程时间;共享离线地图几何,不截取或压缩JPEG。结束后直接用同一套地图绘制器在720×1280画布重绘,以30帧/秒、目标3Mbps编码无声H.264 MP4,尾部附2秒真实成绩图。时间线不再限制为最后60秒。状态存储按32MiB估算预算控制,超预算时均匀降低整条时间线的运动采样率,始终保留开头与结尾,界面提示实际采样率;输出仍为30帧/秒,低采样率时重复最近状态,不伪称新增运动细节。输出48MiB安全上限是应用自身的内存保护,非平台配额;超限明确报错,不截断过程。仅在发布时短暂转换为原生接口要求的base64。不记录相机、麦克风、手机屏幕或通知,不调用屏幕共享。没有本地视频播放预览或网页下载,避免容器禁止的blob/data视频媒体源。 + +优先检测 `VideoEncoder.isConfigSupported` 的H.264能力,使用WebCodecs与随包离线编译的mp4-muxer 5.2.2生成标准MP4;检测失败或编码失败时,仅在 `MediaRecorder.isTypeSupported` 明确支持MP4时采用画布流备用编码。备用路径约需与整局时长相同的生成时间;超时预算随整局时长延长;不把WebM改后缀伪装为MP4。两条路径均可取消,切后台或离开成绩页会中止并释放编码器、视频轨道及画面引用。新开局或返回入口清除上一局素材。WebCodecs及MP4录制是可选增强,旧WebView保留游戏与成绩图,不承诺视频可用。 + +`npm run test:video` 生成两条路径的真实MP4并用ffprobe/ffmpeg核对H.264、尺寸、时长及完整解码,验证原生接口参数(模拟SDK)、发布失败重试、无SDK/无编码能力降级、取消/后台/新开局清理、60秒/6MiB采样边界与小屏布局。现代Chrome结果不能证明小红书容器可用;Android/iOS的实际编码权限、速度、内存和`video_publish`全链路均待扫码验证。 + +构建使用已随源码提供的 `src/maps.js`;`research/china.json` 是构建时全国地图完整性核对必需的源快照;`research/detail-map-index.json` 是7个细分关卡的源代码/名称/内外环数量及来源摘要,供构建审计使用。其余 `research/` 文件和整个 `data/` 目录均不入库。下载与预处理脚本仅用于另行更新地图;重生成前需要准备 `research/areas.json` 等原始输入。 ## 代码与数据 - `src/core.js`:相邻关系、地理位置与角度吸合判断、计分、纪录清洗。 - `src/game.js`:Matter.js 刚体、出片、组合、胜负、速度、弹性、容器滑动与上晃、得分时间点和尺寸变化。 -- `src/app.js`:入口 / 游戏 / 成绩页切换、Canvas 绘制、容器手势与键盘输入、暂停与结束、原生 Storage、发笔记和相册导出。 +- `src/app.js`:入口 / 游戏 / 成绩页切换、Canvas 游戏绘制、SVG 地图选关、难度弹窗、容器手势与键盘输入、暂停与结束、原生 Storage、发笔记和相册导出。 - `src/result.js`:真实结局快照与得分曲线的成绩图绘制。 +- `src/video.js`:有界游戏画面采样、MP4编码能力检测、两条本地编码路径、取消及资源清理。 - `src/index.html`、`src/style.css`:单入口、响应式布局、安全区和 Chrome 61 样式基线。 -- `src/maps.js`:构建期简化的省级 / 地级真实轮廓与预计算连接图。 +- `src/maps.js`:省级、地级、指定县区/县市/分区真实轮廓与连接图;有内环的区域包含构建期三角剖分碰撞网格。 - `scripts/download-maps.py`、`scripts/download-provinces.py`:仅开发期下载公开地图;后者有台湾省 404 的如实记录。 -- `scripts/prepare-maps.py`:简化轮廓、区分行政级别、预计算邻接,输出正式数据和独立县级素材。 +- `scripts/prepare-maps.py`、`scripts/map_geometry.py`:共享投影、简化、邻接和标签布局,输出省级/地级数据及备用县级素材。 +- `scripts/prepare-taiwan.py`、`scripts/prepare-detail-maps.py`、`scripts/triangulate-holes.mjs`:将本地官方SHP素材转为县市输入,增加7个指定细分关卡;保留内部空洞,生成不填满内嵌城区的碰撞几何。Earcut 2.2.4仅作为构建依赖,不在游戏运行时加载。 - `scripts/check.mjs`、`scripts/build.mjs`、`scripts/package.py`:ES2017 / 离线静态检查、官方 Skill 体积审计、ZIP 结构及完整性验证。 - `tests/`:真实地图可通关性、错误边拒合、朝向一致性、计分、警戒线、整框惯性及入口 / 开局浏览器回归。 -地图来源:阿里云 [DataV.GeoAtlas](https://datav.aliyun.com/portal/school/atlas/area_selector),2026-10-16 下载。数据可能落后于最新行政区划,已做游戏用轮廓简化,不能用于导航、测绘或行政区划查询。原始数据提供方条款继续适用,公开可下载不等于获得额外授权。视觉保留岛屿轮廓;物理碰撞对极小区域、退化或相交轮廓采用简化代理。 +全国、地级及四直辖市/港澳地图来源:阿里云 [DataV.GeoAtlas](https://datav.aliyun.com/portal/school/atlas/area_selector),2026-10-16 下载。数据可能落后于最新行政区划,已做游戏用轮廓简化,不能用于导航、测绘或行政区划查询。台湾县市补充来源:[国土测绘中心开放县市边界](https://data.gov.tw/dataset/7442),原始ZIP为COUNTY_MOI_1090820快照,[政府资料开放授权条款第1版](https://data.gov.tw/license)。原始数据提供方条款继续适用。视觉保留岛屿轮廓;物理碰撞对极小区域、退化或相交轮廓采用简化代理。 -物理引擎 Matter.js 0.20.0、凹多边形分解 poly-decomp 0.3.0 随包本地提供,许可证见发布包 `licenses.json`。不用 AI、外部 SDK、远程字体、WASM、Worker、网络请求、剪贴板或文件下载能力。 +物理引擎 Matter.js 0.20.0、凹多边形分解 poly-decomp 0.3.0 随包本地提供,MP4封装依赖mp4-muxer 5.2.2一并编译随包提供,许可证见发布包 `licenses.json`。不用 AI、外部 SDK、远程字体、WASM、Worker、网络请求、剪贴板或文件下载能力。 ## 检查记录 @@ -87,7 +110,7 @@ npm run test:swipes ## 容器晃动与碎片比例更新 -棋盘改为较窄的开口实体容器,侧壁和底边清晰可见,红色警戒线位于顶部 78px。以 320×435 逻辑尺寸为例,全国开局缩放约 0.4995,相对最初约 0.215 的版本仍明显更大,本轮比上一版的0.555再缩小10%。保持各省之间真实比例,微小地区保持真实相对比例,同样通过框体晃动参与拼接。 +棋盘采用较窄的开口实体容器,侧壁和底边清晰可见,红色警戒线随容器高度在顶部62~120px适配。以320×435逻辑尺寸为例,全国开局缩放由0.4995调整到约0.4246,图块宽高再缩小15%。保持各省之间真实比例,微小地区保持真实相对比例,同样通过框体晃动参与拼接。 晃动采用阻尼弹簧模型:容器位移和施加给所有碎片的惯性来自同一状态,并有 14px 的视觉位移限制。在容器内滑动可朝任意方向施加冲量,力度随滑速增加,按与手指的距离平滑衰减;所有组合都受影响,近处更强。移动时只采集手势,在松手时识别一次轻划;使用最近约180ms轨迹,位移至少18px、平均速度至少0.16px/ms,慢拖和按住不触发。触发间隔至少240ms,系统取消或暂停清理尚未触发的手势。键盘左右键仍支持长按。无需加速度计或设备运动 API。 @@ -95,26 +118,161 @@ npm run test:swipes ## 碰撞与晃动手感 -碰撞采用160ms轻微压缩回弹、淡轮廓与180ms小接触点,明显弱于合并时的1600ms反馈。渲染形变不修改真实碰撞几何。左右晃动缓存300ms颠起请求,每个物理步在实际接触时处理,避免150ms输入采样错过55ms接触窗口;每组仍有500ms颠起间隔,过期请求不在空中反复加速。暂停/离开页面清理待处理请求。上晃对框内全部组合施加一次向上冲量,420ms 冷却限制快速连点。颠起目标与上抛速度随弹性档位变化,但各档均有上限。最大倾角约 ±9.2°,水平和下落速度也受限,避免无限加速或飞出框。 +碰撞采用160ms轻微压缩回弹、淡轮廓与180ms小接触点,明显弱于合并时的1600ms反馈。渲染形变不修改真实碰撞几何。左右晃动缓存300ms颠起请求,每个物理步在实际接触时处理,避免150ms输入采样错过55ms接触窗口;每组仍有500ms颠起间隔,过期请求不在空中反复加速。暂停/离开页面清理待处理请求。上晃对框内全部组合施加一次向上冲量,420ms 冷却限制快速连点。颠起目标与上抛速度随弹性档位变化,但各档均有上限。地块自由旋转,不限制绝对角度、不自动回正;角速度上限为0.025弧度/物理步,水平和下落速度仍受限,避免无限加速或飞出框。 `tests/shake-preview.mjs` 用真实左右操作和虚拟时钟采集碰撞反馈、速度与截图;`tests/results.mjs` 检查上晃、暂停主动结束、曲线和图片生成、模拟 SDK 参数和失败降级、自然判负及小型关卡真实通关的结算流程。均为本地开发回归,不能替代平台模拟器或真机验收。 `artifacts/bounce-probe.json`记录320×590逻辑尺寸下的实际物理峰值:单块正方形、一次上晃,四种速度分别测得轻弹33~37px、正常97~110px、强弹236~270px。真实地图组合、容器尺寸和接触情况会改变结果。 -省级/地级有滑块过渡及水平滑动手势;弹性选项压缩回弹,普通按钮轻按,目的地和弹窗渐入。减少动态效果设置会关闭装饰动画与碰撞形变,保留游戏物理。`npm run test:interactions`覆盖滑动切换、推荐默认档、按钮动画和真实碰撞反馈。 +全国/省区地图切换有轻微渐入,地图区域尺寸固定;弹性选项压缩回弹,普通按钮轻按,弹窗渐入。减少动态效果设置会关闭装饰动画与碰撞形变,保留游戏物理。`npm run test:interactions`覆盖地图钻入/返回、难度弹窗、推荐默认档、按钮动画和真实碰撞反馈。 ## 手机布局与地图标签修正 顶部在状态栏安全区之外额外预留56px平台操作区。玩法说明移到入口页脚,游戏的旅程设置和暂停/结束移到底部,成绩页返回移入底部操作组;弹窗也避开平台顶部区域。 -手机入口保留地图预览,并按设置面板剩余高度分配地图区域;省级展示全国、地级展示所选省区。短屏收紧间距,横屏地图与双栏设置并排,避免地图、面板和页脚互相挤压。 +手机入口以可点击的SVG地图为主体,保留所有省级轮廓、离岛和海域线,省区准备页展示真实地级轮廓。片数与地图组成同一场景;不再使用可变高度的版本滑块、省区表单或独立选择卡片。全国与省区场景、难度入口和开局按钮位置固定,横屏时地图与信息并排。 -入口和游戏页均按可见视口及安全区排版:在320×568、375×667、390×844以及740×390横屏检查一屏显示;小屏会缩减装饰地图和冗余文案,保留所有主要选择与开局按钮。省区选择采用27项网格,不再使用原生长下拉框,弹窗注明无地级数据的范围。 +入口和游戏页均按可见视口及安全区排版:320×568、375×667、390×844以及740×390横屏同屏显示。吸附难度和弹性移入同一弹窗,短屏按媒体查询收紧弹窗间距;设置不改变底层地图或开局栏的位置。 -四档名称为“佛系看山 / 说走就走 / 一路狂飙 / 山河起飞”,速度与倍率参数保持原值。底部仅保留无文字的圆形暂停图标,合并全部旅程操作,容器顶部说明标签已移除,成绩页同样一屏显示。游戏地图先绘制全部形状,再统一绘制标签;名称采用独立布局、边距约束、避让,以及小地区标签底色 / 引线,防止名称贴底被裁或被其他省份覆盖。 +已移除定时速度选择,当前所有关卡均固定为随心落子。底部仅保留无文字的圆形暂停图标,合并全部旅程操作,容器顶部说明标签已移除,成绩页同样一屏显示。游戏地图先绘制全部形状,再统一绘制标签;名称采用独立布局、边距约束、避让,以及小地区标签底色 / 引线,防止名称贴底被裁或被其他省份覆盖。 构建补回源数据的小离岛外环及独立海域线层,34省级代码、名称及外环数量均与保存的原始数据对比。台湾省14个源外环、香港9个、澳门2个、海南133个全部保留。详见`artifacts/MAP_AUDIT.md`,这不是标准地图审图结论。 `npm run test:container`在现代浏览器模拟平台顶部按钮与四组手机尺寸/安全区,逐页点击并检查布局,不替代小红书真机验证。 -`tests/swipes.mjs` 使用真实触摸事件验证单次轻划松手触发、移动中不施力、慢拖和按住过滤、松手后的惯性运动、系统取消、滑动中暂停和恢复、圆形无文字菜单;物理单测另检查附近力度更强、远处仍动、快速更有力和三档边界限制。 +`tests/swipes.mjs` 使用真实触摸事件验证单次轻划松手触发、移动中不施力、慢拖和按住过滤、松手后的惯性运动、系统取消、滑动中暂停和恢复、圆形无文字菜单;物理单测另检查附近力度更强、远处仍动、快速更有力和四档边界限制。 + +`npm run test:atlas`逐一从全国地图钻入34个省区并返回,检查34个细分关卡可玩并按层级标注、全国直接开局、省区11块真实开局和难度生效;严格比较地图场景、开局栏及按钮的位置/尺寸,确保各次选择不改变高度。`tests/helpers.mjs`封装通过可见地图与弹窗选择关卡/难度,供浏览器回归复用。 + +`npm run test:staging`使用真实CDP触摸检查:首块预备、上方横向调整、∞等待/松手、取消/暂停、定时到点强制释放、提前松手不加速、旧手势隔离、倒计时冻结,以及五个速度选项/四个弹性选项顺序和成绩难度字段。物理测试另验证四档时限、预备块不入物理世界及轮廓边界。 + +## 图块比例与吸附微调(2026-10-17) + +游戏内省级、地级图块在前版基础上统一缩小15%,待落区和下一块预览同步缩小。地块名称同比缩小,最小保留8px,描边随字体收细;入口封面SVG地图与其名称保持原尺寸。正确相邻组合的位置误差允许从22px放宽到26px,相对角度误差从约13.8°放宽到16°,仍检查真实邻接和正确方位,过远、贴错边或非邻接不会合并。 + +## 细分地图素材更新 + +原始素材保存在忽略的`data/provinces-raw/`和`data/taiwan-raw/`中,正式构建直接使用已生成的`src/maps.js`与紧凑审计索引,不需要联网下载。需要重新生成地图时,先准备原始输入并运行`python3 scripts/prepare-maps.py`;从[官方图资下载页](https://maps.nlsc.gov.tw/pro/download.jsp)下载县市SHP ZIP至`data/taiwan-raw/counties.zip`,再依次运行`python3 scripts/prepare-taiwan.py`、`python3 scripts/prepare-detail-maps.py`,最后`npm run build`。两个县市内嵌案例和天津两处内环都用静态三角网格保留空洞,SVG/Canvas使用偶奇填充,内嵌城市的源边界记为陆地邻接。 + +`test:atlas`检查34地区钻入/返回与固定几何尺寸,并在新增7关真实开局、暂停结束;`test:container`在手机/横屏/安全区下覆盖县区、县市、港澳分区。物理测试覆盖35个关卡529块及全部关卡可合并为整体,同时验证新北/台北、嘉义县/市的空洞碰撞。实际低端手机性能仍待扫码验证。 + +侧墙在 Matter 创建静态刚体后单独设为零摩擦,底部及地块间摩擦保持原值,避免不规则轮廓挂墙休眠。每100ms按位置和角度变化检查是否稳定,并用凸分片向下1.5px探测真实支撑链,保留地图空洞,不以复合包围盒充当支撑;没有底部支撑的休眠体会恢复下落。合并的边界修正只移动该组合,全局缩放仍统一作用于全部地块。`tests/overflow.test.cjs`覆盖真实江西90种贴墙姿态、窗口变化、悬空唤醒、多层休眠支撑、侧贴与空洞、无关地块位置;`shanheDebug.state()`含支撑/休眠/堆顶计时信息供偶发问题排查。 + +主动靠拢:已落地块在正确拼合位置的平移误差大于26px、不超过45px,且真实邻接、相对角度不超过约16°时,最近的不冲突配对受到轻微中心力,越近越强;不修改地块位置,不施加旋转,双向等大反向力按质量分配运动,限制沿拼合方向的助推速度,保留玩家惯性与物理碰撞。进入26px仍用原合并规则。预备块、暂停、远处、错向及非相邻地块不参与牵引。 + +地图块比例再次调整:PIECE_SIZE由0.85降至0.60,游戏内宽高为前版约70.6%、面积约49.8%;全国320px宽容器中的完整地图初始宽度从424.6px降至299.7px,内蒙古从199.1px降至140.6px。地级/县区/县市/分区关卡及待落、下一块轮廓同比缩小,地级相对全国的0.7比例保留;字体随比例调整但不低于8px。入口封面SVG保持原状。 + +大省与合并成长:全国关卡中,新疆、内蒙古、西藏、青海单独存在时再缩小8%,其他省区和细分关卡单块保持原比例。拼合判断使用统一比例的中心坐标,显示和碰撞共同使用每组实际比例;合并后按组合块数恢复统一比例并轻微长大(2块+2%、4块+4%、8块及以上最多+6%),320ms缓出动画逐步同步放大实际碰撞体与轮廓,角度保持自然状态。累计增长按块数计算,不逐次倍乘;先按最终大小检查容器边界,暂停冻结动画,缩放/横竖屏保留中间比例,通关截图直接使用最终尺寸。封面、源地图、计分及26/45px规则不变。 + +省域素材完整性由research/prefecture-map-index.json保留27组源子区域的代码、名称、类型及内外环计数,构建时逐一核对,防止省直辖地区再次被过滤。原始地图和对比截图仍保留在本地忽略目录。test:province-direct覆盖四个修复关卡的地图显示、新增地区真实释放、成绩片数及手机/横屏固定布局。 + +海南省域关卡:本岛放大,三沙诸岛全部源外环作为统一缩放、平移的示意插图保留;地图框及说明明确标注“缩放移位示意”,游戏碰撞与轮廓采用同一变换。全国海南轮廓、海域线和原始素材坐标保持原状。 + +合并、长大和入口防穿插:合并前试放候选碰撞体,检查边界适配后是否挤入无关地块;被占用时保留原块和得分,短暂延后重试。长大被挡时暂停,空间腾出后续播。入口被弹起的地块占住时,新块从其上方进入。连续碰撞用同一步的共同安全时间点限制深穿透;横竖屏变化采用统一缩放和平移,保留组合间距。吸附26px、磁吸45px和自由旋转规则不变。tests/overlap.test.cjs验证阻挡后的合并重试、增长暂停恢复、入口防重叠、高速接触、视口压缩及8组湖北45秒随机压力回归,并检查碎片仍持续运动。 + + +## 难度确认更新(2026-10-17) + +开启旅程、暂停重开和成绩页再玩统一先进入确认弹窗。弹窗使用草稿选项,确认后才创建新对局;取消不会丢失原局、成绩或视频。成绩卡、暂停说明、完整游玩视频标题与分享文案均携带实际对局的吸附难度和弹性。`tests/difficulty.test.cjs`覆盖三档位置/角度、真实合并、地图原点不影响宽松判定、非邻接过滤、防占用合并、远距力、12种吸附/弹性组合手动释放和湖北压力场景。 + +本次页面验证通过CUA在独立浏览器页操作并保存于本地artifacts:全国/省域开局确认、取消草稿、暂停重开取消保留、结果页再玩确认、三档实际生效,以及手机与横屏弹窗。npm test包含物理回归;此前tests/*.mjs中的定时界面场景属于旧流程,不作为当前手动模式的验收结果。平台模拟器、Android/iOS与Chrome61实际兼容性仍需同包验证。 + + +## 留洞补位、回正开关与开局动效(2026-10-17) + +轻松拼的位置/牵引范围从68/120px增强为84/148px,相对角度从约49°放宽到57°;刚刚好从42/78px增强为52/98px、约32°放宽到38°。两档牵引力及助推速度上限分别提高25%和12%;严丝合缝保持26/45px、约16°与此前牵引强度。 + +留洞补位按源地图轮廓的栅格补集洪泛判断封闭区域,包含源内环中的内嵌地区,避免把开口海湾或外侧省份当成缺口。合并组合会显示缺失轮廓;已落下的正确缺块靠近包围它的外圈、相对角度符合当前吸附难度且有真实陆地邻接时,允许跨越封口补入,不以全局进度放宽所有地块。靠近范围按距外圈轮廓的距离判断,为当前牵引范围的1.2倍加小幅轮廓半径补偿;目标仍经过第三方占位检查,被占用时保留原块和分数。480ms淡入和移动效果进入共享视频绘制器,得分与普通合并相同,成绩卡标记实际补位次数。 + +游戏底部暂停按钮旁提供“自动回正”滑动开关:每局默认关闭,可点击、左右滑动或用空格切换;不会触发游戏暂停或容器晃动。开启会唤醒所有现有组合,受控地朝地图正向转动,后续倾斜也会被纠正;关闭后不再施加回正控制。控制保留旋转速度上限和防穿透修正,拥挤时仍受实际碰撞限制,不强制瞬移角度。暂停冻结、横竖屏保留开关;新局重新关闭。成绩图标记本局是否用过回正辅助,视频按画面实际时刻显示开关状态。 + +开局、再玩或暂停重开的确认弹窗,根据发起按钮的真实位置和尺寸展开,时长380ms;设置弹窗保留普通进入方式。减少动态效果时不播放此展开动效或补位移动效果。 + +新增tests/pockets.test.cjs验证封闭/开口、内嵌城市、实际补位、距离/方向/邻接限制、第三块阻挡与真实湖北六邻省封口;tests/upright.test.cjs验证默认自由旋转、开启后多角度平滑回正、开关/暂停/缩放/结束边界,以及真实湖北连续晃动和反复切换的防穿透。独立预置测试页面位于本地忽略的artifacts/assist-fixture,只用于视觉复现,不进入正式ZIP或Git。 + + +难度确认弹窗在外框展开结束后,仍保持内容区与操作区无独立入场动画,避免清理外框动画class时再次触发screen-in。全部地区出场后的提示统一改为“山河已到齐,继续拼合”,下一块预览与视频文案同步调整。 + + +## v2.1.0 + +首页标题旁新增红色v2.1.0,package.json与锁文件版本同步。成绩页移除独立视频生成按钮,将“发图文 / 发视频”合并为一个绿色主操作区,中间以斜线分隔;原进度行继续显示视频状态,不增加页面高度。右侧首次点击完成生成后自动进入视频发布编辑页,需用户确认才发布;再次点击复用已有视频。取消、生成失败、SDK缺失、发布取消和失败均保留原有降级及重试逻辑;生成期间离开原局或打开重开确认时,不自动拉起旧局发布页。 + +自动回正恢复老版轻量控制:转速按0.84阻尼衰减、按倾角0.022回拉,采用Git 465fee1的原有物理解算后控制:超出±0.16弧度(9°)直接限角、转速乘0.2,接近正向时归零,不改平移速度;正常碰撞和防穿透先完成;限角单独只读检查当前空间,受阻时暂缓,不撤销已发生的平移或牵连其他块。开启时唤醒一次,后续不在每帧清零休眠计数,静止块可正常休眠;晃动/碰撞会按原物理规则唤醒。关闭保留自然转动。tests/upright.test.cjs覆盖默认关闭、多角度回正、老版摇摆与转速上限、休眠计数/落地休眠/晃动唤醒、暂停/缩放、真实江西/新疆落地及湖北堆叠防穿透和持续运动。tests/publish.test.cjs用实际发布函数和模拟SDK验证一次点击生成并打开编辑页、取消、旧局隔离、无SDK降级和发布失败复用,未向平台发布真实笔记。 + +自动回正切换仅提示“自动回正 · 开启/关闭”,120ms淡入、短暂停留后180ms淡出,总时长800ms;连续切换重启动效,其他错误或发布提示保留原有阅读时间。系统减少动态效果时不播放淡入淡出。 + + +## 本地战绩簿 + +地图导航行的“旅程战绩”进入完整战绩簿,包含全国1关、省内27关、县市区7关;按类别筛选,每页6关,列表内部滚动,首页主体与开局栏高度不变。每关展示历史最高分及三种吸附难度各自最高分,跨弹性档位取最高,零分已挑战与未挑战分开显示。每关每个吸附难度完整通关点亮一枚奖杯,共105枚;弹性、回正辅助不限,不重复发杯。主动结束和失败只保存分数。旧纪录没有通关标记,保留分数,不推断或补发旧奖杯。 + +新key shanhe-progress-v2将分数与通关状态放在同一JSON原子写入;首次读取合并原生/浏览器旧shanhe-records-v1与新进度,分数取高、奖杯取并集,保留旧key。加载期间的新成绩也并入,避免迟到数据覆盖。符合9.46版本及能力条件时使用官方Storage,否则兼容浏览器存储;读取失败时不覆盖未读缓存,保存失败提示当前页面暂存。本机缓存清理后可能丢失,不提供跨设备排行榜。tests/records.test.cjs覆盖35关105杯、迁移、隔离、失败与异步加载竞争。 + + +自动回正性能修正(v2.2.0):旋转弹簧曾在每帧调用Sleeping.set(false),导致复杂地块无法累积休眠时间,拥挤堆叠持续参与碰撞;现已回到老版阻尼回拉和小幅摇摆。开关、短提示、视频/成绩辅助标记保持原样。Node物理对比与浏览器仅用于开发定位,不代表真机性能验收。 + +## 地级行政区下辖县区 GIS 素材 + +运行 `python3 scripts/fetch-city-county-gis.py --snapshot 2026-10-18` 获取并校验现有333个地级行政区对应的素材,输出到忽略的 `data/city-county-gis/2026-10-18/`,不改写正式 `src/maps.js`。支持 `--only 330100,441900` 小范围核验;同一快照目录内可复用已校验下载,更新快照使用新的日期目录。 + +2026-10-18重新获取结果为329组县区细分、2728块,另有东莞/中山/儋州/嘉峪关4份整市轮廓;这些城市的DataV整市属性为childrenNum=0、区县子级接口404,不能伪造县区,镇街边界需另行获取。原始GeoJSON保存于raw/及unsplit/,每市简化拼图坐标保存于levels/,manifest.json记录父级、名称代码、源URL、原始及简化文件SHA256、全部外环/内环数量与例外。坐标基准未由源接口声明,原始坐标原样保留;levels/使用游戏平面坐标,不作为经纬度GIS数据。 + +素材ZIP为 `artifacts/city-county-gis-20261018.zip`,包含664个文件、约8.6MiB,与可上传小工具ZIP分开。来源4389个外环、3个内环全部保留,父子关系、重复ID、坐标有限值、闭环/非零面积及ZIP CRC和逐文件字节一致性检查通过;这不代替权威最新区划、拓扑和关卡可玩性核验。该ZIP是原始/预处理素材,不是小工具游戏包;正式游戏接入情况见下一节。原始素材、简化预备数据、ZIP与报告均由现有.gitignore排除。 + + +## 地级市县区关卡接入 + +已开放329个地级行政区的县区拼图(2728块),与原35关合计364关。进入省域地图后,点地级市进入县区准备页,也可直接从省域地图开启原省域拼图;县区页返回省域,再返回全国,导航栏和地图/开局栏高度保持不变。东莞、中山、儋州、嘉峪关的地图点击会说明没有县区子级,不虚构镇街边界。省直辖县级地区和已有直辖市/港澳台细分关卡保持原层级。县区密集地名采用避让与引线标注。 + +新增src/county-index.js仅保存目录和块数;src/atlas.js通过经典script按需加载包内county/下的静态文件,不调用网页网络API,不引用外部资源。源文件仍为329份单关素材,构建时按同省每两关合成173个脚本,发行目录同步重映射加载路径。首次进入不解析329份图形;同文件并发合并请求,最多缓存最近3个县区关卡,失败可重试,快速切换/返回使旧请求失效。成绩图、视频、暂停与重开使用当前城市关卡及省区名。战绩簿收录全部364关,按省区筛选和原分类分页,最多1092枚通关奖杯,分数与奖杯使用现有独立关卡ID存储。 + +发布数据已做保持拓扑的简化和坐标精度选择,保留独立岛屿与内环;13处源多边形自交由GEOS修复,来源和修复后的外环/内环数量记录在research/county-map-index.json。8个含内环的地区预置三角碰撞片,额外1个会使动态凸分解达到递归上限的地区预置静态碰撞片;不通过把非凸边界改成凸包覆盖邻区。 + +329份src/county/*.js是运行/编译需要的地图素材,连同小型目录与构建核对用来源索引进入代码库;原始GeoJSON、完整素材ZIP、工具环境和报告仍忽略。npm run build直接使用保存好的素材,新增审计核对全部333个地级入口的329可玩+4例外覆盖、父级和名称、文件SHA256、简单边界、内环碰撞与关卡连通性,不需下载GIS或安装Shapely。 + +重新准备素材时可执行(仅准备步骤需要Shapely): + +```sh +python3 -m venv .cache/gis-runtime +.cache/gis-runtime/bin/python -m pip install -r scripts/requirements-gis.txt +.cache/gis-runtime/bin/python scripts/prepare-county-levels.py --snapshot 2026-10-18 +node scripts/triangulate-county-holes.mjs +npm run build +``` + +新增tests/county-levels.test.cjs覆盖329关全部图块物理生成及正确拼合通关、县区/省域纪录隔离、三级导航与异步竞争、并发加载/失败重试/缓存淘汰,及杭州/楚雄/内嵌地区的持续晃动物理回归。普通浏览器仅开发核验;平台模拟器、Android/iOS同ZIP、Chrome61和低端机性能仍需实际验证。 + + +## v2.2.0 回正与物理热点优化 + +回正开关保留465fee1的阻尼/回拉/约9度摇摆手感,正常碰撞及防穿透先完成,再单独尝试本块限角/近零归零。空间被邻块或容器挡住时暂缓限角,继续保留平移和转速;腾出空间后再限角。仅对正在运动的地块应用,开启只唤醒一次。关闭时保留自由旋转。 + +防穿透二分回放改用只读刚体变换和凸片SAT投影,与Matter的2px穿透阈值一致,不生成接触点、不在每次试探中改写整堆顶点;只在最后提交一次安全姿态。保守扫掠包围框覆盖整个平移/转动路径,可能相遇的组仍共享同一个安全时刻,远处自由运动的地块不陪同回放。静止接触结果按位置/角度/缩放/包围框缓存,几何变化立即重新检查;WeakMap不保留已移除图块。 + +吸附缓存不可变组成员的邻接边,三档难度计算复用该边,合并扫描每组只算一次姿态;非邻接对不再重复扫边、检查缺口。组变化或边表替换后重新核对。吸附/磁吸的距离、角度、强度、得分和补位规则不变。 + +新增tests/physics-hotpaths.test.cjs用1200个插值位置与真实Matter碰撞对照,验证只读回放、最终一次提交、远处块不回退、静止缓存失效和吸附三档结果一致。scripts/profile-physics.cjs可复现全国/湖北/晋城县区在回正开关和晃动下的12个Node物理场景,输出平均/p95耗时、方法耗时、几何变更数与碰撞次数。计时含插桩开销,不含渲染/视频,不作为手机帧率或平台兼容性验收。 + + +回正锁堆修正:此前把强制限角和普通物理运动一起送入防穿透回放,转正位置被邻块占据时,平移也被整帧退回。现将可选回正姿态检查移到防穿透之后,使用只读凸片SAT核对本块目标与容器/邻块,不安全就保留当前位置/倾角,只通过后续物理转速逐渐回正。新增固定复现:倾斜长条旁有障碍,原控制把2px横移退回到约0.46px;修正后横移大于1.8px,阻挡期间不硬改角度,障碍移开后可正常回正。保留全部防穿透阈值,不通过允许重叠或冻结图块规避问题。 + + +## 动画停止的诊断与保护 + +物理受阻和整个画面停止是两个问题,尚未复现用户成都19/20块时的整画面停止,不能用物理回放优化作为已解决整页卡死的证据。成都12组80秒随机物理对局均未抛出异常,不包含浏览器渲染/视频开销。 + +动画帧分阶段记录物理/绘制/视频/界面,board的data-loop-health每500ms写一次紧凑本地诊断(帧数、耗时、关卡、回正状态与异常栈),不联网、不读取个人存储。下一帧统一在finally中按游戏状态调度;物理/绘制/UI报错会保留本局并显示可重试暂停界面,不再无提示终止RAF链。可选视频采样报错时停用该局视频并释放资源,主游戏继续;无视频会话的结算不再一直显示整理中。tests/frame-loop.test.cjs注入四个阶段的故障验证对应行为。 + + +## v2.2.0 单次回正(当前行为) + +已移除自动回正滑动开关、持续控制器及其每帧调用,替换为暂停旁的“回正一次”胶囊按钮。一次点击只快照处理现有活动组合,直接设置正向0度并清除该次旋转速度,保留平移速度;没有落块、暂停或结束时不可执行。回正后即可自由翻转,后续新块/合并组不继承辅助,没有队列、后台重试或常驻限角。 + +按用户要求,按钮不提前试算碰撞、不避让、不挪位置、不因邻块阻挡而跳过,直接把所有当前组合角度设为0。后续由正常物理引擎继续处理接触。按钮图标有短促回摆动效。每次有效点击记录uprightCount,暂停页、成绩图和视频显示“回正N次”;已有uprightUsed辅助标记继续兼容,分数/奖杯规则不变。 + +测试覆盖直接全量正向、保持位置/平移速度、不调用碰撞试算、新块与之后自由转动、无后台重试、贴地不挪动、暂停/结束/尺寸变化以及真实湖北/成都多轮晃动的物理推进。历史章节中的自动模式仅为先前版本记录,以本节和当前源码为准。 + +## 远程源码同步检查 + +Gitea 的 `verify.yml` 在已确认的 `ces-control` 上通过 Docker 执行单元测试、离线构建、地图完整性及打包审计。官方 1.8.0 审计器由 CI 从官方地址读取并核对固定 SHA-256;本机 `.codex`、缓存和旧构建产物不进入镜像。依赖未变时复用安装层,检查镜像清理保留父层缓存。浏览器、创服模拟器与真机验证不由这项 CI 代替。 diff --git a/package-lock.json b/package-lock.json index 8ce293a..99cf208 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,20 @@ { "name": "shanhe-puzzle", - "version": "1.0.0", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "shanhe-puzzle", - "version": "1.0.0", + "version": "2.2.0", "dependencies": { "matter-js": "0.20.0", + "mp4-muxer": "5.2.2", "poly-decomp": "0.3.0" }, "devDependencies": { "acorn": "8.15.0", + "earcut": "2.2.4", "esbuild": "0.25.12", "playwright": "1.56.1" } @@ -459,6 +461,18 @@ "node": ">=18" } }, + "node_modules/@types/dom-webcodecs": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.19.tgz", + "integrity": "sha512-+yFUIDUaASFz0vQpWBErPxun/Lb+F0TdrlTsj50gm7K797YzEx2TmV6fEiwciHyFNghlZYPgQXH5qRcwMHcJFQ==", + "license": "MIT" + }, + "node_modules/@types/wicg-file-system-access": { + "version": "2020.9.8", + "resolved": "https://registry.npmjs.org/@types/wicg-file-system-access/-/wicg-file-system-access-2020.9.8.tgz", + "integrity": "sha512-ggMz8nOygG7d/stpH40WVaNvBwuyYLnrg5Mbyf6bmsj/8+gb6Ei4ZZ9/4PNpcPNTT8th9Q8sM8wYmWGjMWLX/A==", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -472,6 +486,13 @@ "node": ">=0.4.0" } }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "dev": true, + "license": "ISC" + }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -535,6 +556,17 @@ "integrity": "sha512-iC9fYR7zVT3HppNnsFsp9XOoQdQN2tUyfaKg4CHLH8bN+j6GT4Gw7IH2rP0tflAebrHFw730RR3DkVSZRX8hwA==", "license": "MIT" }, + "node_modules/mp4-muxer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/mp4-muxer/-/mp4-muxer-5.2.2.tgz", + "integrity": "sha512-dhozjTywI0h2qFzeShagt8YYw811fh1XlwiDCE2f6Aeqf6xG2CyuShoSa5E0AZDO8pPF0JOZ3wOmWBNWIGdSpQ==", + "deprecated": "This library is superseded by Mediabunny. Please migrate to it.", + "license": "MIT", + "dependencies": { + "@types/dom-webcodecs": "^0.1.6", + "@types/wicg-file-system-access": "^2020.9.5" + } + }, "node_modules/playwright": { "version": "1.56.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", diff --git a/package.json b/package.json index ac50889..40fad00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shanhe-puzzle", - "version": "1.0.0", + "version": "2.2.0", "private": true, "description": "山河拼图 · 离线中国行政区下落合并小游戏", "scripts": { @@ -12,15 +12,22 @@ "test:results": "node tests/results.mjs", "test:interactions": "node tests/interactions.mjs", "test:container": "node tests/container-layout.mjs", - "test:swipes": "node tests/swipes.mjs" + "test:swipes": "node tests/swipes.mjs", + "test:atlas": "node tests/atlas.mjs", + "test:staging": "node tests/staging.mjs", + "test:video": "node tests/video.mjs", + "test:celebrations": "node tests/celebrations.mjs", + "test:province-direct": "node tests/province-direct.mjs" }, "dependencies": { "matter-js": "0.20.0", + "mp4-muxer": "5.2.2", "poly-decomp": "0.3.0" }, "devDependencies": { - "esbuild": "0.25.12", "acorn": "8.15.0", + "earcut": "2.2.4", + "esbuild": "0.25.12", "playwright": "1.56.1" } } diff --git a/research/county-map-index.json b/research/county-map-index.json new file mode 100644 index 0000000..0fd89d2 --- /dev/null +++ b/research/county-map-index.json @@ -0,0 +1 @@ +{"source":"DataV.GeoAtlas","snapshot":"2026-10-18","levels":[{"id":"130100","name":"石家庄市","province":"130000","provinceName":"河北省","sha256":"556b51cd1f2b058e6e0b3f62939f68891f6f45c6284e6d3bb5fbf87ca4212e7b","regions":[{"id":"130102","name":"长安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130104","name":"桥西区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130105","name":"新华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130107","name":"井陉矿区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130108","name":"裕华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130109","name":"藁城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130110","name":"鹿泉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130111","name":"栾城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130121","name":"井陉县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130123","name":"正定县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"130125","name":"行唐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130126","name":"灵寿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130127","name":"高邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130128","name":"深泽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130129","name":"赞皇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130130","name":"无极县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130131","name":"平山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130132","name":"元氏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130133","name":"赵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130181","name":"辛集市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130183","name":"晋州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130184","name":"新乐市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e9abc6167436ac4a85dafe1635b7ffd673d39790b4748d5021da89c41e138a5e","collisionFallbacks":[]},{"id":"130200","name":"唐山市","province":"130000","provinceName":"河北省","sha256":"f2daf09abac73ea65c502e645d3571354ef10753d3d3493a99d82ed581489686","regions":[{"id":"130202","name":"路南区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130203","name":"路北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130204","name":"古冶区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130205","name":"开平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130207","name":"丰南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130208","name":"丰润区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130209","name":"曹妃甸区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"130224","name":"滦南县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"130225","name":"乐亭县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"130227","name":"迁西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130229","name":"玉田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130281","name":"遵化市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130283","name":"迁安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130284","name":"滦州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"96c0ca33ed97b493b9b8fa3bf40ef32c771a350c6556a64f9a5957da75f8d359","collisionFallbacks":[]},{"id":"130300","name":"秦皇岛市","province":"130000","provinceName":"河北省","sha256":"9d735cfb18f580e7322574882fd80ec8c90fd80f1ab6a345b4d7f06d596d5028","regions":[{"id":"130302","name":"海港区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130303","name":"山海关区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130304","name":"北戴河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130306","name":"抚宁区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130321","name":"青龙满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130322","name":"昌黎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130324","name":"卢龙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5f19cb391f4bec049d730d475c143db674685482234fc5a9e96b65003b4975b6","collisionFallbacks":[]},{"id":"130400","name":"邯郸市","province":"130000","provinceName":"河北省","sha256":"08d516a709c49656f085c88562b5adffdf5bcc9d1617c26abd81e70dd86d725f","regions":[{"id":"130402","name":"邯山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130403","name":"丛台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130404","name":"复兴区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130406","name":"峰峰矿区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130407","name":"肥乡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130408","name":"永年区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130423","name":"临漳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130424","name":"成安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130425","name":"大名县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130426","name":"涉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130427","name":"磁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130430","name":"邱县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130431","name":"鸡泽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130432","name":"广平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130433","name":"馆陶县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130434","name":"魏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130435","name":"曲周县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130481","name":"武安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"13e724aaa3fb7bd1c53e8418b4abf69ca50356578b533c5024df44d6ea6a1a74","collisionFallbacks":[]},{"id":"130500","name":"邢台市","province":"130000","provinceName":"河北省","sha256":"93910c6d3b8b2a5ce359862ae6de81b929916630430a24d0ab27adeea3b803a7","regions":[{"id":"130502","name":"襄都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130503","name":"信都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130505","name":"任泽区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130506","name":"南和区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130522","name":"临城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130523","name":"内丘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130524","name":"柏乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130525","name":"隆尧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130528","name":"宁晋县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130529","name":"巨鹿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130530","name":"新河县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130531","name":"广宗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130532","name":"平乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130533","name":"威县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130534","name":"清河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130535","name":"临西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130581","name":"南宫市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130582","name":"沙河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"61e34a6800f15a6455f7e56cb97aef5da2af579432259eb2f80448ba7a9937b8","collisionFallbacks":[]},{"id":"130600","name":"保定市","province":"130000","provinceName":"河北省","sha256":"2a3b23b39ca2691064f88f3cb5c2aa8c3c97d157dae4cf6725900703132aeac9","regions":[{"id":"130602","name":"竞秀区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130606","name":"莲池区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130607","name":"满城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130608","name":"清苑区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130609","name":"徐水区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130623","name":"涞水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130624","name":"阜平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130626","name":"定兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130627","name":"唐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130628","name":"高阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130629","name":"容城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130630","name":"涞源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130631","name":"望都县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130632","name":"安新县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130633","name":"易县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130634","name":"曲阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130635","name":"蠡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130636","name":"顺平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130637","name":"博野县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130638","name":"雄县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130681","name":"涿州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130682","name":"定州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130683","name":"安国市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130684","name":"高碑店市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"49032aac45feba1213361641850b4f11b666ca5ff72612af4c3ab8e8d66e1911","collisionFallbacks":[]},{"id":"130700","name":"张家口市","province":"130000","provinceName":"河北省","sha256":"757ca6fa935733f9f397dedf5ac9b58ebf4dded6cb3741c524c00916b090a12b","regions":[{"id":"130702","name":"桥东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130703","name":"桥西区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130705","name":"宣化区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130706","name":"下花园区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130708","name":"万全区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130709","name":"崇礼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130722","name":"张北县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130723","name":"康保县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130724","name":"沽源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130725","name":"尚义县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130726","name":"蔚县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130727","name":"阳原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130728","name":"怀安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130730","name":"怀来县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130731","name":"涿鹿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130732","name":"赤城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"eae99cabf22207dc9cc3326a0e548b6fdf573e17c5164826940b5a52d105febf","collisionFallbacks":[]},{"id":"130800","name":"承德市","province":"130000","provinceName":"河北省","sha256":"7a3b61fdadf81c5d318280ddd7dc684b58c6f790e198fe219efa5be99cb67f66","regions":[{"id":"130802","name":"双桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130803","name":"双滦区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130804","name":"鹰手营子矿区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130821","name":"承德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130822","name":"兴隆县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"130824","name":"滦平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130825","name":"隆化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130826","name":"丰宁满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130827","name":"宽城满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130828","name":"围场满族蒙古族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130881","name":"平泉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"20ae6fc46db5ad43f4d92cb17ff20b101aa06cf4fc84160916acfd9bfde80e5d","collisionFallbacks":[]},{"id":"130900","name":"沧州市","province":"130000","provinceName":"河北省","sha256":"7a641ec8328bc40df33a4487033757e71c3157a0706bb723675e5c2a846767b5","regions":[{"id":"130902","name":"新华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130903","name":"运河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130921","name":"沧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130922","name":"青县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130923","name":"东光县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130924","name":"海兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130925","name":"盐山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130926","name":"肃宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130927","name":"南皮县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130928","name":"吴桥县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130929","name":"献县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130930","name":"孟村回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130981","name":"泊头市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130982","name":"任丘市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130983","name":"黄骅市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"130984","name":"河间市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9f53f56f5b2838846ea71a39dc11647e96e1eb5a9215e4d9ea7604f6d3dfe986","collisionFallbacks":[]},{"id":"131000","name":"廊坊市","province":"130000","provinceName":"河北省","sha256":"7d2f6a083b44c98e4b3834f2ea3e08588a48cdf38b3158f91055f584376588bc","regions":[{"id":"131002","name":"安次区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131003","name":"广阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131022","name":"固安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131023","name":"永清县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131024","name":"香河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131025","name":"大城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131026","name":"文安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131028","name":"大厂回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131081","name":"霸州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131082","name":"三河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"35008a57cada693753d1276c2a02ed18af52e7893656712a910745c383e0a9a7","collisionFallbacks":[]},{"id":"131100","name":"衡水市","province":"130000","provinceName":"河北省","sha256":"3582aa5b7385db9988610adbdc9f83637c42ec834d65e783cc11154a232c012f","regions":[{"id":"131102","name":"桃城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131103","name":"冀州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131121","name":"枣强县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131122","name":"武邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131123","name":"武强县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131124","name":"饶阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131125","name":"安平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131126","name":"故城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131127","name":"景县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131128","name":"阜城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"131182","name":"深州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ff77a66691770d1a97c49f9d121d74236fdff9ce634fb934751fe56bcece7c21","collisionFallbacks":[]},{"id":"140100","name":"太原市","province":"140000","provinceName":"山西省","sha256":"805882eee96aa527a2b6e18af2ea6050d6625dc4615e3a8ff84aa60d06ad936e","regions":[{"id":"140105","name":"小店区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140106","name":"迎泽区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140107","name":"杏花岭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140108","name":"尖草坪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140109","name":"万柏林区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140110","name":"晋源区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140121","name":"清徐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140122","name":"阳曲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140123","name":"娄烦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140181","name":"古交市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5bc488a113641fad2e0c7eb33dc4b74780c27200b79525d351169c49cf842a64","collisionFallbacks":[]},{"id":"140200","name":"大同市","province":"140000","provinceName":"山西省","sha256":"cf8e9cd2dc9f42c00779df700a0fb97577af4975637ff8dc805c1b6eae02814c","regions":[{"id":"140212","name":"新荣区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140213","name":"平城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140214","name":"云冈区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140215","name":"云州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140221","name":"阳高县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140222","name":"天镇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140223","name":"广灵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140224","name":"灵丘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140225","name":"浑源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140226","name":"左云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6436108e3e90effdc0e863db654a8a64a83cad2123130ae376d218e34afebaaa","collisionFallbacks":[]},{"id":"140300","name":"阳泉市","province":"140000","provinceName":"山西省","sha256":"4da833f8187ff96c105adba8e6be321376a5edb7a8fd5a6cb77957eb6ac69ab2","regions":[{"id":"140302","name":"城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140303","name":"矿区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140311","name":"郊区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"140321","name":"平定县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140322","name":"盂县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7c92bff2199b5f8cfb39b6bc854b42cd9c6b0b28473d4d729e5585ac1dda2354","collisionFallbacks":[]},{"id":"140400","name":"长治市","province":"140000","provinceName":"山西省","sha256":"8e83ab9976bd85aeee37b828ca2b1149517bb87cd0b1009f003e8335dbf4149e","regions":[{"id":"140403","name":"潞州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140404","name":"上党区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140405","name":"屯留区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140406","name":"潞城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140423","name":"襄垣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140425","name":"平顺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140426","name":"黎城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140427","name":"壶关县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140428","name":"长子县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140429","name":"武乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140430","name":"沁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140431","name":"沁源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"337d3c47a9dbc0bfe7b34c4559380aef703fac21311bb555a9801d927328f0bb","collisionFallbacks":[]},{"id":"140500","name":"晋城市","province":"140000","provinceName":"山西省","sha256":"124c7e950979f76e390999b8259cddbea51fd8a738fb166aad13bf7ddd9a41a8","regions":[{"id":"140502","name":"城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140521","name":"沁水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140522","name":"阳城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140524","name":"陵川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140525","name":"泽州县","sourceRings":1,"sourceHoles":1,"rings":1,"holes":1,"repairedSourcePolygons":0},{"id":"140581","name":"高平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"def8f924b5dee3f625fe33dfe336fd75dd30332531b131abcb58f3749b0c74ee","collisionFallbacks":[]},{"id":"140600","name":"朔州市","province":"140000","provinceName":"山西省","sha256":"0c4dce9d473594cfb9c22428faf19e43f7de088c99aaf22cbe365e57c4b51f44","regions":[{"id":"140602","name":"朔城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140603","name":"平鲁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140621","name":"山阴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140622","name":"应县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140623","name":"右玉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140681","name":"怀仁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0b97aeace2c211affd2d414a2ac6deacb0add1a31a50dd68cdd64aca3e6094cb","collisionFallbacks":[]},{"id":"140700","name":"晋中市","province":"140000","provinceName":"山西省","sha256":"3c35cd60fff8723fab73335ce757b21073c5774791186cd18c7e3ef262605a49","regions":[{"id":"140702","name":"榆次区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140703","name":"太谷区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140721","name":"榆社县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140722","name":"左权县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140723","name":"和顺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140724","name":"昔阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140725","name":"寿阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140727","name":"祁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140728","name":"平遥县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140729","name":"灵石县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140781","name":"介休市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c4aa87015cc4cdbe641df96d09d37c3226ad061985f7d6d36206647be76638b7","collisionFallbacks":[]},{"id":"140800","name":"运城市","province":"140000","provinceName":"山西省","sha256":"7d751564ce9c6263c9e4417fb031150867d8b74a07fb4fc457fad8b7dc68c520","regions":[{"id":"140802","name":"盐湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140821","name":"临猗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140822","name":"万荣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140823","name":"闻喜县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140824","name":"稷山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140825","name":"新绛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140826","name":"绛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140827","name":"垣曲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140828","name":"夏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140829","name":"平陆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140830","name":"芮城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140881","name":"永济市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140882","name":"河津市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c8511ca239bf0c33f3397635a27476b51521d27f8a69bfe49aaee52dfd859b49","collisionFallbacks":[]},{"id":"140900","name":"忻州市","province":"140000","provinceName":"山西省","sha256":"89703a4890b0a7d14438cb818648128eeac35be2309f060f0e2103abef7e7965","regions":[{"id":"140902","name":"忻府区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140921","name":"定襄县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140922","name":"五台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140923","name":"代县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140924","name":"繁峙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140925","name":"宁武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140926","name":"静乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140927","name":"神池县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140928","name":"五寨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140929","name":"岢岚县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140930","name":"河曲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140931","name":"保德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140932","name":"偏关县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"140981","name":"原平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"909cdc82848a27ff00b711721dff06b1b9c9d2f15dd1cce81f5331788373c09c","collisionFallbacks":[]},{"id":"141000","name":"临汾市","province":"140000","provinceName":"山西省","sha256":"eab420a3764f876ddcd5023b08ff317e13a13fe8e3b19ad5bf68932379d3a19d","regions":[{"id":"141002","name":"尧都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141021","name":"曲沃县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141022","name":"翼城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141023","name":"襄汾县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141024","name":"洪洞县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141025","name":"古县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141026","name":"安泽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141027","name":"浮山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141028","name":"吉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141029","name":"乡宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141030","name":"大宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141031","name":"隰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141032","name":"永和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141033","name":"蒲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141034","name":"汾西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141081","name":"侯马市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141082","name":"霍州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d3e7c2a7bb5988a522666f1f9c49afe0eeaf8822821c04d851f1586679fbe445","collisionFallbacks":[]},{"id":"141100","name":"吕梁市","province":"140000","provinceName":"山西省","sha256":"ab99967d4b45088afbe6de0ce60621afa32a7d4dbe6510bdaa8f83730e1a3574","regions":[{"id":"141102","name":"离石区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141121","name":"文水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141122","name":"交城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141123","name":"兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141124","name":"临县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141125","name":"柳林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141126","name":"石楼县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141127","name":"岚县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141128","name":"方山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141129","name":"中阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141130","name":"交口县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141181","name":"孝义市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"141182","name":"汾阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b2e7f8a0b3f1100c5b40fe38e6c9118e39c461d2cf68dfd42c48e4979009efeb","collisionFallbacks":[]},{"id":"150100","name":"呼和浩特市","province":"150000","provinceName":"内蒙古自治区","sha256":"ed6151081fe2c6191b5caf9bc4a93def606fc5095378d707c49c7d6d914ac38c","regions":[{"id":"150102","name":"新城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150103","name":"回民区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150104","name":"玉泉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150105","name":"赛罕区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150121","name":"土默特左旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150122","name":"托克托县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150123","name":"和林格尔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150124","name":"清水河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150125","name":"武川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"be80d38e63e0ac928c41896734e57ddc0a3b8276a9c9dfb9e46dad0420f08cb1","collisionFallbacks":[]},{"id":"150200","name":"包头市","province":"150000","provinceName":"内蒙古自治区","sha256":"691428ae66c77eeb3ca6b06607c7174e09f0f9ef0af985d987bbc155660e9050","regions":[{"id":"150202","name":"东河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150203","name":"昆都仑区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150204","name":"青山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150205","name":"石拐区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150206","name":"白云鄂博矿区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150207","name":"九原区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150221","name":"土默特右旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150222","name":"固阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150223","name":"达尔罕茂明安联合旗","sourceRings":1,"sourceHoles":1,"rings":1,"holes":1,"repairedSourcePolygons":0}],"assetSha256":"34c9ad0d88912b489b535b5ef1759e9591052609df81223c6a8c8b393e099c39","collisionFallbacks":[]},{"id":"150300","name":"乌海市","province":"150000","provinceName":"内蒙古自治区","sha256":"4aa09c49b3963ed07c571fdc8c9e490d4118be2f8e7dac4a30d5183f375974ca","regions":[{"id":"150302","name":"海勃湾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150303","name":"海南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150304","name":"乌达区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"259bbaade8b615de3a272a6002f3da011389a3d5b647d323312434d3b2c219f1","collisionFallbacks":[]},{"id":"150400","name":"赤峰市","province":"150000","provinceName":"内蒙古自治区","sha256":"f8dea9f4b14803577b9ac9fce6f7ae88e6567d4054a66d73c034427be92b315d","regions":[{"id":"150402","name":"红山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150403","name":"元宝山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150404","name":"松山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150421","name":"阿鲁科尔沁旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150422","name":"巴林左旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150423","name":"巴林右旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150424","name":"林西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150425","name":"克什克腾旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150426","name":"翁牛特旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150428","name":"喀喇沁旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150429","name":"宁城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150430","name":"敖汉旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"99378043e5e81d2cc2647c4291605f2108db4e084a0919ee3fec7f228cebd58c","collisionFallbacks":[]},{"id":"150500","name":"通辽市","province":"150000","provinceName":"内蒙古自治区","sha256":"947ac06c8f7279c7a5d148995bed82e7555284e240797266feaac00471d3339b","regions":[{"id":"150502","name":"科尔沁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150521","name":"科尔沁左翼中旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150522","name":"科尔沁左翼后旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150523","name":"开鲁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150524","name":"库伦旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150525","name":"奈曼旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150526","name":"扎鲁特旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150581","name":"霍林郭勒市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c33f50c38fd019cf695b6174b2ae2874a387038186acc1d7e363079d63715e78","collisionFallbacks":[]},{"id":"150600","name":"鄂尔多斯市","province":"150000","provinceName":"内蒙古自治区","sha256":"6d8f6e0013618cb2917b5eab92e86f234f96f7cb3404dd76742c8c97d4b2c981","regions":[{"id":"150602","name":"东胜区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150603","name":"康巴什区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150621","name":"达拉特旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150622","name":"准格尔旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150623","name":"鄂托克前旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150624","name":"鄂托克旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150625","name":"杭锦旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150626","name":"乌审旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150627","name":"伊金霍洛旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9b7ab11e6ed22cd1054ea0daa54998b10cc1f1c3c727b5a4f45f127530c3faaf","collisionFallbacks":[]},{"id":"150700","name":"呼伦贝尔市","province":"150000","provinceName":"内蒙古自治区","sha256":"8b547b87a552c280e09a18304574224a1563a051010cdf1f51489f0c9c2db30b","regions":[{"id":"150702","name":"海拉尔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150703","name":"扎赉诺尔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150721","name":"阿荣旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150722","name":"莫力达瓦达斡尔族自治旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150723","name":"鄂伦春自治旗","sourceRings":1,"sourceHoles":1,"rings":1,"holes":1,"repairedSourcePolygons":0},{"id":"150724","name":"鄂温克族自治旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150725","name":"陈巴尔虎旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150726","name":"新巴尔虎左旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150727","name":"新巴尔虎右旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150781","name":"满洲里市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150782","name":"牙克石市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150783","name":"扎兰屯市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150784","name":"额尔古纳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150785","name":"根河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7b4548723063f5f00ddb0ac23585f2fa8158ce0b2e15f9a3232288d80d5897f8","collisionFallbacks":[]},{"id":"150800","name":"巴彦淖尔市","province":"150000","provinceName":"内蒙古自治区","sha256":"521bc71bc492118f72190063424e007b91e74b664c32fcc857c8017f3ed48d98","regions":[{"id":"150802","name":"临河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150821","name":"五原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150822","name":"磴口县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150823","name":"乌拉特前旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150824","name":"乌拉特中旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150825","name":"乌拉特后旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150826","name":"杭锦后旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"72c0cbb192c58f29019e8b3f2a8da551a939ebce006e4573251023502d267939","collisionFallbacks":[]},{"id":"150900","name":"乌兰察布市","province":"150000","provinceName":"内蒙古自治区","sha256":"79d0aa67951072c10732f1e62d8ec8b2a77ffe20afe77ffec82ff42727dc5dad","regions":[{"id":"150902","name":"集宁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150921","name":"卓资县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150922","name":"化德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150923","name":"商都县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150924","name":"兴和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150925","name":"凉城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150926","name":"察哈尔右翼前旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150927","name":"察哈尔右翼中旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150928","name":"察哈尔右翼后旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150929","name":"四子王旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"150981","name":"丰镇市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e966dac17554b87e77822218c5228ddab4213b9e718c7fa298c7e9f5683beea8","collisionFallbacks":[]},{"id":"152200","name":"兴安盟","province":"150000","provinceName":"内蒙古自治区","sha256":"ea87ce01084354d807dedaa5896f6f6b1954c1390caa9c77687c6f7acf079e4b","regions":[{"id":"152201","name":"乌兰浩特市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152202","name":"阿尔山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152221","name":"科尔沁右翼前旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152222","name":"科尔沁右翼中旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152223","name":"扎赉特旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152224","name":"突泉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"064eba42e738c96208f1a0f320fb079209654b54df2a8acb9b58ee702586dab1","collisionFallbacks":[]},{"id":"152500","name":"锡林郭勒盟","province":"150000","provinceName":"内蒙古自治区","sha256":"94c24bcb750b4749cbc4e2c41fb269562c5147b023c8f64eb3ac0ba0ce8b9847","regions":[{"id":"152501","name":"二连浩特市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152502","name":"锡林浩特市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152522","name":"阿巴嘎旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152523","name":"苏尼特左旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152524","name":"苏尼特右旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152525","name":"东乌珠穆沁旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152526","name":"西乌珠穆沁旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152527","name":"太仆寺旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152528","name":"镶黄旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152529","name":"正镶白旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152530","name":"正蓝旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152531","name":"多伦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4934a27c7510a39f24e87080b7c713a2eee618358d1d7e4147cb4e92c5623c8f","collisionFallbacks":[]},{"id":"152900","name":"阿拉善盟","province":"150000","provinceName":"内蒙古自治区","sha256":"5a39cd1199c790a27dd9d64cd48d0a1ec25dbecf477f54365f18574fa3434975","regions":[{"id":"152921","name":"阿拉善左旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152922","name":"阿拉善右旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"152923","name":"额济纳旗","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8ce2b06f38980fdac97594f2241612a8e5f9678bed11d897224e249e05106aaa","collisionFallbacks":[]},{"id":"210100","name":"沈阳市","province":"210000","provinceName":"辽宁省","sha256":"bc80ff7db3fa6c1032ac3a7d267a3c71c8f3ea77514f8306b22f0af2a508cc9a","regions":[{"id":"210102","name":"和平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210103","name":"沈河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210104","name":"大东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210105","name":"皇姑区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210106","name":"铁西区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210111","name":"苏家屯区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210112","name":"浑南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210113","name":"沈北新区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210114","name":"于洪区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"210115","name":"辽中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210123","name":"康平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210124","name":"法库县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210181","name":"新民市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"87dd88a42c09f06430fc80e4798247b12413de067381544f69c1aec557f78a84","collisionFallbacks":[]},{"id":"210200","name":"大连市","province":"210000","provinceName":"辽宁省","sha256":"25c543cdd88366d2d7df19fe4b067f5d1aac93b6a4baab5284caa7dc4df4a1e2","regions":[{"id":"210202","name":"中山区","sourceRings":7,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":0},{"id":"210203","name":"西岗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210204","name":"沙河口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210211","name":"甘井子区","sourceRings":11,"sourceHoles":0,"rings":11,"holes":0,"repairedSourcePolygons":0},{"id":"210212","name":"旅顺口区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"210213","name":"金州区","sourceRings":11,"sourceHoles":0,"rings":11,"holes":0,"repairedSourcePolygons":0},{"id":"210214","name":"普兰店区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"210224","name":"长海县","sourceRings":41,"sourceHoles":0,"rings":41,"holes":0,"repairedSourcePolygons":0},{"id":"210281","name":"瓦房店市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"210283","name":"庄河市","sourceRings":17,"sourceHoles":0,"rings":17,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0300a8efc7accea13abd65435e94d25c2c0afad5d34233b7a85209f2b58ebb10","collisionFallbacks":[]},{"id":"210300","name":"鞍山市","province":"210000","provinceName":"辽宁省","sha256":"f2a1d795365daa0c40c0be122456f4650b6b870cb38db2d296394be2feaaee4e","regions":[{"id":"210302","name":"铁东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210303","name":"铁西区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210304","name":"立山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210311","name":"千山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210321","name":"台安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210323","name":"岫岩满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210381","name":"海城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8d73e0b6146925f62f85db6cf40612e6fce4cfc1f9d6332198e764eb1fa7ff35","collisionFallbacks":[]},{"id":"210400","name":"抚顺市","province":"210000","provinceName":"辽宁省","sha256":"033924ae0a06a74f64bb821a420917a15048962c04bc9fdb9aa0e8d8242af5b0","regions":[{"id":"210402","name":"新抚区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210403","name":"东洲区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210404","name":"望花区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210411","name":"顺城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210421","name":"抚顺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210422","name":"新宾满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210423","name":"清原满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"67b1fbe5801473a8239671a60121104f25d32bc818c33daf15f7149cabc930f9","collisionFallbacks":[]},{"id":"210500","name":"本溪市","province":"210000","provinceName":"辽宁省","sha256":"48a50c3a825969bfebd8d5d977dc1ca11ec6345a9fa00d9d177c74e532adbcec","regions":[{"id":"210502","name":"平山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210503","name":"溪湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210504","name":"明山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210505","name":"南芬区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210521","name":"本溪满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210522","name":"桓仁满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"39bd7b40e9aabc48e8e4cb99deadbc4e1e0aff1982cf9e4b8c8d65db70658d4c","collisionFallbacks":[]},{"id":"210600","name":"丹东市","province":"210000","provinceName":"辽宁省","sha256":"a9b6b256978c58752b542b8ba0409e5bc562905d84b326f29eb60932ed5f1714","regions":[{"id":"210602","name":"元宝区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210603","name":"振兴区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"210604","name":"振安区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"210624","name":"宽甸满族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"210681","name":"东港市","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"210682","name":"凤城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"534def7a484d064bcc0ac75e055cbe69c1ffcdd69bb65a706fd41cb359c2bf10","collisionFallbacks":[]},{"id":"210700","name":"锦州市","province":"210000","provinceName":"辽宁省","sha256":"2ab1c3de0cfbb8e77946717f0cdb267786299dc3416b5ed9641420b6e6f4842f","regions":[{"id":"210702","name":"古塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210703","name":"凌河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210711","name":"太和区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"210726","name":"黑山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210727","name":"义县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210781","name":"凌海市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"210782","name":"北镇市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a5d7eb5671b4f0506fdea6286488c23c392dec2047b7e4c7dfc2166a26fe323c","collisionFallbacks":[]},{"id":"210800","name":"营口市","province":"210000","provinceName":"辽宁省","sha256":"c104040aeb71c159cf5fc9d92b153bc4e537b8af4664cc5cf927102d1fffbd31","regions":[{"id":"210802","name":"站前区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210803","name":"西市区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210804","name":"鲅鱼圈区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210811","name":"老边区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210881","name":"盖州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210882","name":"大石桥市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ef8b6935e2955d22b63d9ed2c57524de3475de7b8709d0cd4497b756023ae0ad","collisionFallbacks":[]},{"id":"210900","name":"阜新市","province":"210000","provinceName":"辽宁省","sha256":"6b9fc855add175d4bb0eefc4eed3aaa4e0167ab6d24afb5282259f4242da7eff","regions":[{"id":"210902","name":"海州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210903","name":"新邱区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210904","name":"太平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210905","name":"清河门区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210911","name":"细河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"210921","name":"阜新蒙古族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"210922","name":"彰武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"754d2a5c23c758ca415e6fe366094f13cfab5f25beb2affa90d3d728677f32f2","collisionFallbacks":[]},{"id":"211000","name":"辽阳市","province":"210000","provinceName":"辽宁省","sha256":"e5bad656d7e4b8958c68ae5d326db23e6f5b197844df8ca64ea86e5b0289d103","regions":[{"id":"211002","name":"白塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211003","name":"文圣区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211004","name":"宏伟区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211005","name":"弓长岭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211011","name":"太子河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211021","name":"辽阳县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"211081","name":"灯塔市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b04c833e90b121c7fdccc697a221cfdda343860b89c152f1e4bcc89ede6a4196","collisionFallbacks":[]},{"id":"211100","name":"盘锦市","province":"210000","provinceName":"辽宁省","sha256":"c0007b2578f2d7b9471b2e77c25c2a07fbba85305922c0b69d657a117d07642c","regions":[{"id":"211102","name":"双台子区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211103","name":"兴隆台区","sourceRings":19,"sourceHoles":0,"rings":19,"holes":0,"repairedSourcePolygons":0},{"id":"211104","name":"大洼区","sourceRings":4,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":1},{"id":"211122","name":"盘山县","sourceRings":7,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"36af72a4db59e63e3f03cc360f19769c9657f889373b56b058fd2d1b82702828","collisionFallbacks":[]},{"id":"211200","name":"铁岭市","province":"210000","provinceName":"辽宁省","sha256":"26ba45fef6ea457b8f7e15c3eeec610e5f5b0c841bb9ee018da6bded98215e0c","regions":[{"id":"211202","name":"银州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211204","name":"清河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211221","name":"铁岭县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"211223","name":"西丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211224","name":"昌图县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211281","name":"调兵山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211282","name":"开原市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"728bfbba1728d0d17978a3d80fad6e1b8e849cfaf2cf00b80c0b8f7cec793100","collisionFallbacks":[]},{"id":"211300","name":"朝阳市","province":"210000","provinceName":"辽宁省","sha256":"5840c8567fcee8cf20d1b55a987b30eb145dd2e8c9839463c623aca7feb6bc6e","regions":[{"id":"211302","name":"双塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211303","name":"龙城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211321","name":"朝阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211322","name":"建平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211324","name":"喀喇沁左翼蒙古族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211381","name":"北票市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211382","name":"凌源市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2ddee403330720d540d84ab312b67d757b4af0b1f2cde9bbd240eb0f84afd91f","collisionFallbacks":[]},{"id":"211400","name":"葫芦岛市","province":"210000","provinceName":"辽宁省","sha256":"bf63cc5760c989eb5c79886feb99ea0aeeafe8a098dd9c62ed282e97aa6aa8e7","regions":[{"id":"211402","name":"连山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211403","name":"龙港区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"211404","name":"南票区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211421","name":"绥中县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211422","name":"建昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"211481","name":"兴城市","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cb79984163d10bb4e8682f032bc3955d1e36f386e045fdad1e2dc2f55971e7f7","collisionFallbacks":[]},{"id":"220100","name":"长春市","province":"220000","provinceName":"吉林省","sha256":"686a6acd71a215ac4a3cbd08147f79e07f7cbad424a16bddc0b5476a1325f290","regions":[{"id":"220102","name":"南关区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220103","name":"宽城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220104","name":"朝阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220105","name":"二道区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220106","name":"绿园区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220112","name":"双阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220113","name":"九台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220122","name":"农安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220182","name":"榆树市","sourceRings":4,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":1},{"id":"220183","name":"德惠市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"220184","name":"公主岭市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"44301797aec8360401dfe08836a0923a1898ce259045512c40ac8ea72330f2cc","collisionFallbacks":[]},{"id":"220200","name":"吉林市","province":"220000","provinceName":"吉林省","sha256":"9901ee7d96a7f434d0b47f61bbfbc5329edc5afa0b786898736184b9f743955b","regions":[{"id":"220202","name":"昌邑区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220203","name":"龙潭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220204","name":"船营区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220211","name":"丰满区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220221","name":"永吉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220281","name":"蛟河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220282","name":"桦甸市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220283","name":"舒兰市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"220284","name":"磐石市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"100b27b819002a032b770b5967f298d211bedb50b66a0126bb5900a77cef0439","collisionFallbacks":[]},{"id":"220300","name":"四平市","province":"220000","provinceName":"吉林省","sha256":"13a77abb9f6924b2328a4385920a6134bd5732d75e6b99b3290818f1a3acf85d","regions":[{"id":"220302","name":"铁西区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"220303","name":"铁东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220322","name":"梨树县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220323","name":"伊通满族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220382","name":"双辽市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ca6f502883be7c3160c5139c64572f811a54a8140033bf38bb3e3c7fbd9a5545","collisionFallbacks":[]},{"id":"220400","name":"辽源市","province":"220000","provinceName":"吉林省","sha256":"b11325f73fe71236c1c12d5e75b705845bfc0a0a53538f7f03ed1c16e28b2e27","regions":[{"id":"220402","name":"龙山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220403","name":"西安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220421","name":"东丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220422","name":"东辽县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5ba9253890c729083ab946389ccaa3b0380bbf049e3a5eda7c79a8ded98214a9","collisionFallbacks":[]},{"id":"220500","name":"通化市","province":"220000","provinceName":"吉林省","sha256":"0a3171ff7445f26b2ade73f9fb9eb9fddbda94ef7d75bbbcde99649b5e52b9c3","regions":[{"id":"220502","name":"东昌区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220503","name":"二道江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220521","name":"通化县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"220523","name":"辉南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220524","name":"柳河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220581","name":"梅河口市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220582","name":"集安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4787bc2a8d65f367c2881938ecacc59c5fef484f48a8b34faee5698d0c01d3a0","collisionFallbacks":[]},{"id":"220600","name":"白山市","province":"220000","provinceName":"吉林省","sha256":"e822d22a9054986e29d33e48103db4dd3b4408b7ffe95d81cda70b4b29deb90c","regions":[{"id":"220602","name":"浑江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220605","name":"江源区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220621","name":"抚松县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220622","name":"靖宇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220623","name":"长白朝鲜族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220681","name":"临江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6bcb5d2a26115825fed7f8cacec3316d497bb0a3067db7eb50cf9dadd9e7c397","collisionFallbacks":[]},{"id":"220700","name":"松原市","province":"220000","provinceName":"吉林省","sha256":"962156e941d3c17f5a8b8ec93043b0393555a9aba1150ac2d3797a5901c60f44","regions":[{"id":"220702","name":"宁江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220721","name":"前郭尔罗斯蒙古族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220722","name":"长岭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220723","name":"乾安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220781","name":"扶余市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5f2a4a22ef38ddb363ca34d6bf8a4e8ba52c3c2572427c78684c51e51ec4eb2b","collisionFallbacks":[]},{"id":"220800","name":"白城市","province":"220000","provinceName":"吉林省","sha256":"2182ee8a7f6b5d6020c2389f36b0adb3952a054213f7e80c7013dbaf3aaa637e","regions":[{"id":"220802","name":"洮北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220821","name":"镇赉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220822","name":"通榆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220881","name":"洮南市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"220882","name":"大安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5f65a2464c2c719437080dab3a3daf6f56fe4cd38c7b2cb61a6244066419179e","collisionFallbacks":[]},{"id":"222400","name":"延边朝鲜族自治州","province":"220000","provinceName":"吉林省","sha256":"3c8faadf85ff555be960f86077dfd411fa9da494dc57d564d3429cc44b2e33a7","regions":[{"id":"222401","name":"延吉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222402","name":"图们市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222403","name":"敦化市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222404","name":"珲春市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222405","name":"龙井市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222406","name":"和龙市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222424","name":"汪清县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"222426","name":"安图县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5896ad58ca39c79eab8c70fb3c26b3632a8188277044b8f8bd7fbe7bd47ce350","collisionFallbacks":[]},{"id":"230100","name":"哈尔滨市","province":"230000","provinceName":"黑龙江省","sha256":"c2df24cde9176569814ce9f0d890b6a6d062fdae90ed3b7c1ce7052658748d60","regions":[{"id":"230102","name":"道里区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230103","name":"南岗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230104","name":"道外区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230108","name":"平房区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230109","name":"松北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230110","name":"香坊区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230111","name":"呼兰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230112","name":"阿城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230113","name":"双城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230123","name":"依兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230124","name":"方正县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230125","name":"宾县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230126","name":"巴彦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230127","name":"木兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230128","name":"通河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230129","name":"延寿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230183","name":"尚志市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230184","name":"五常市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ac87ef2f272dbef3b6d84bfe3ad17c3d92ea42c3ba3761d92bd4a5b7832cd58f","collisionFallbacks":[]},{"id":"230200","name":"齐齐哈尔市","province":"230000","provinceName":"黑龙江省","sha256":"b4192712fa3309e013d18be36abd9fa59f22de326ee7e73ebb1cbc2815d3abe4","regions":[{"id":"230202","name":"龙沙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230203","name":"建华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230204","name":"铁锋区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230205","name":"昂昂溪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230206","name":"富拉尔基区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230207","name":"碾子山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230208","name":"梅里斯达斡尔族区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230221","name":"龙江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230223","name":"依安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230224","name":"泰来县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230225","name":"甘南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230227","name":"富裕县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230229","name":"克山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230230","name":"克东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230231","name":"拜泉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230281","name":"讷河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"854a1f95927c09a648ece5d6c3d80c482a9c49553806cb44dd8aaa91fcd13cee","collisionFallbacks":[]},{"id":"230300","name":"鸡西市","province":"230000","provinceName":"黑龙江省","sha256":"67be3ae4326c292b2529510ebe97418f2ca2453be9231104e74a8120f112d693","regions":[{"id":"230302","name":"鸡冠区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230303","name":"恒山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230304","name":"滴道区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230305","name":"梨树区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230306","name":"城子河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230307","name":"麻山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230321","name":"鸡东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230381","name":"虎林市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230382","name":"密山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"888dc2f237e5ee031ae2bf7c8c5aa364de4853c0b0e3bb91d6543627cc581a04","collisionFallbacks":[]},{"id":"230400","name":"鹤岗市","province":"230000","provinceName":"黑龙江省","sha256":"f143b67a036ff634f0c73ff65de4193cafcddc68a9f8d88fdbfc0a1620f7c1ab","regions":[{"id":"230402","name":"向阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230403","name":"工农区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230404","name":"南山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230405","name":"兴安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230406","name":"东山区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"230407","name":"兴山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230421","name":"萝北县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230422","name":"绥滨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d5a1a076166356ad2143e3911f07d038aa039b2dad7b50efa9e834f637e410a8","collisionFallbacks":[]},{"id":"230500","name":"双鸭山市","province":"230000","provinceName":"黑龙江省","sha256":"113e3a24efb2c4118144a1fb7e412f09e93d7c3512b037560c5850f4caa412a8","regions":[{"id":"230502","name":"尖山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230503","name":"岭东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230505","name":"四方台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230506","name":"宝山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230521","name":"集贤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230522","name":"友谊县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230523","name":"宝清县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230524","name":"饶河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cd16757f2804e06537c59cf4170214416b11155f6ff0c02f74201d560fdc736e","collisionFallbacks":[]},{"id":"230600","name":"大庆市","province":"230000","provinceName":"黑龙江省","sha256":"b2a6411e0759d370ba089a8770735014044d62959fcd9043e09ce4abeb881ef5","regions":[{"id":"230602","name":"萨尔图区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230603","name":"龙凤区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230604","name":"让胡路区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230605","name":"红岗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230606","name":"大同区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230621","name":"肇州县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230622","name":"肇源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230623","name":"林甸县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230624","name":"杜尔伯特蒙古族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c661f6cdf44a9b19c78a57f6b0d7df7bb5881ac0b456cccf3465a15938379bcb","collisionFallbacks":[]},{"id":"230700","name":"伊春市","province":"230000","provinceName":"黑龙江省","sha256":"039909225ec103a6bdaee0ce739418bbc777dcc2bfa9f22ac6e03295fc6afd8e","regions":[{"id":"230717","name":"伊美区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230718","name":"乌翠区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230719","name":"友好区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230722","name":"嘉荫县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230723","name":"汤旺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230724","name":"丰林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230725","name":"大箐山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230726","name":"南岔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230751","name":"金林区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230781","name":"铁力市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4a2e7eeb6c568d639a9cbaf8f5cc4e4a60c662fe325d6605dfdde21940fd847c","collisionFallbacks":[]},{"id":"230800","name":"佳木斯市","province":"230000","provinceName":"黑龙江省","sha256":"32100b64a697662e91d3bac459b7ceb51f1f088dc6dc4ec52faa762ad8acb17d","regions":[{"id":"230803","name":"向阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230804","name":"前进区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230805","name":"东风区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230811","name":"郊区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230822","name":"桦南县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"230826","name":"桦川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230828","name":"汤原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230881","name":"同江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230882","name":"富锦市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230883","name":"抚远市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f7c92d1a3bace4367d7591d05dcafa1a5f08230b885da2805d740da0841b9b04","collisionFallbacks":[]},{"id":"230900","name":"七台河市","province":"230000","provinceName":"黑龙江省","sha256":"7707e87210cf7a0da0a60ae26150932c100702096e312769b782b922e9bac620","regions":[{"id":"230902","name":"新兴区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230903","name":"桃山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230904","name":"茄子河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"230921","name":"勃利县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b851aef6283a985aebce7faf0bb753ed578100aa1362d6fe3ca208b6bc33b87f","collisionFallbacks":[]},{"id":"231000","name":"牡丹江市","province":"230000","provinceName":"黑龙江省","sha256":"e325f71828446a3659cadd82af31fff56116dfa41bb7d986ca84b9384b3dc0f0","regions":[{"id":"231002","name":"东安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231003","name":"阳明区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231004","name":"爱民区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231005","name":"西安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231025","name":"林口县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231081","name":"绥芬河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231083","name":"海林市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231084","name":"宁安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231085","name":"穆棱市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231086","name":"东宁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4af7f24a6a63ba2129ee84d62a14d94b9a90f16616bbc408080ca0008dba6cf5","collisionFallbacks":[]},{"id":"231100","name":"黑河市","province":"230000","provinceName":"黑龙江省","sha256":"085edcdf23d66e2a49b91f3d464cde32101235396960b20be5acf8a59e3137f1","regions":[{"id":"231102","name":"爱辉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231123","name":"逊克县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231124","name":"孙吴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231181","name":"北安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231182","name":"五大连池市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231183","name":"嫩江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"eaa0ce88a10eb625342df29396351d2a83c4b95b9e7ac0ddd6259f1ca119ac33","collisionFallbacks":[]},{"id":"231200","name":"绥化市","province":"230000","provinceName":"黑龙江省","sha256":"51cf7ab8da17003731b7d903fc118a76085601734fe0f2e520f18174e19c2c98","regions":[{"id":"231202","name":"北林区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231221","name":"望奎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231222","name":"兰西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231223","name":"青冈县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231224","name":"庆安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231225","name":"明水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231226","name":"绥棱县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231281","name":"安达市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231282","name":"肇东市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"231283","name":"海伦市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4f0748d575d395cc8d85cd622da6bda9c7ddd6a3c28c55c5b5ca0b5cf15b0bfb","collisionFallbacks":[]},{"id":"232700","name":"大兴安岭地区","province":"230000","provinceName":"黑龙江省","sha256":"ab979113def3d93225ef3ab39a621598bdcf6ff8318ee01e9d68fdf409e7f87f","regions":[{"id":"232701","name":"漠河市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"232718","name":"加格达奇区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"232721","name":"呼玛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"232722","name":"塔河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a676321b076a65cb6477c97d5e2078146ee148605e4b079bcee11e63c8525eeb","collisionFallbacks":[]},{"id":"320100","name":"南京市","province":"320000","provinceName":"江苏省","sha256":"14871d1526fb14cc967a33aa06df20f157ad7b0759b7d9281be377f2e1adac6d","regions":[{"id":"320102","name":"玄武区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320104","name":"秦淮区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320105","name":"建邺区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320106","name":"鼓楼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320111","name":"浦口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320113","name":"栖霞区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320114","name":"雨花台区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320115","name":"江宁区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320116","name":"六合区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320117","name":"溧水区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"320118","name":"高淳区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"dcce0f18cec0946be233b89b71c78516834ed798122d657cf97dd723ab1c4cb2","collisionFallbacks":[]},{"id":"320200","name":"无锡市","province":"320000","provinceName":"江苏省","sha256":"e80d4da545916413c6a71a2bf3a24fcacddf13738bddc99403e2c52a6d8c90e7","regions":[{"id":"320205","name":"锡山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320206","name":"惠山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320211","name":"滨湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320213","name":"梁溪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320214","name":"新吴区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320281","name":"江阴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320282","name":"宜兴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"64e5604d2ee634022646c1d6225da78ff83d048fa808a3ea8480de4c9c005f49","collisionFallbacks":[]},{"id":"320300","name":"徐州市","province":"320000","provinceName":"江苏省","sha256":"f1c696a1fed93c883a31dc60c6c608ffad6f6c99d1def14667983e8c47356f05","regions":[{"id":"320302","name":"鼓楼区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320303","name":"云龙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320305","name":"贾汪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320311","name":"泉山区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"320312","name":"铜山区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"320321","name":"丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320322","name":"沛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320324","name":"睢宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320381","name":"新沂市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320382","name":"邳州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"1a2cd1869938a31916b16b1394083b7b48c7d58aae2df62ac5331060e3364bfe","collisionFallbacks":[]},{"id":"320400","name":"常州市","province":"320000","provinceName":"江苏省","sha256":"2a5952c2469f1cdf93e8b075a822146f771f56cc9a3312a673fcfbff00ed0215","regions":[{"id":"320402","name":"天宁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320404","name":"钟楼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320411","name":"新北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320412","name":"武进区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320413","name":"金坛区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320481","name":"溧阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8620722a781f01e9405cc34b90a494931ae2fce694ee8d8e16a9709f6518d667","collisionFallbacks":[]},{"id":"320500","name":"苏州市","province":"320000","provinceName":"江苏省","sha256":"37dddced21487e8983b1f3e8ce2ad6fe116dbe4cd938952b4aec02d355939955","regions":[{"id":"320505","name":"虎丘区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320506","name":"吴中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320507","name":"相城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320508","name":"姑苏区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320509","name":"吴江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320581","name":"常熟市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320582","name":"张家港市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320583","name":"昆山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320585","name":"太仓市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4f9aa63e8ee92e655cb003316d559fca0047f8137cfed0e35d990aa5c17175d0","collisionFallbacks":[]},{"id":"320600","name":"南通市","province":"320000","provinceName":"江苏省","sha256":"c2d3d9fc1628d431cb4d0d9d3f36f3677427c93def1d049a7c618e7ddec83920","regions":[{"id":"320602","name":"崇川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320612","name":"通州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320623","name":"如东县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320681","name":"启东市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320682","name":"如皋市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320684","name":"海门区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320685","name":"海安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2f3bb244b9f3da05a1000fe13138a2622f1a6e1372840a99283fe13af5301d39","collisionFallbacks":[]},{"id":"320700","name":"连云港市","province":"320000","provinceName":"江苏省","sha256":"b2943831f48b4e0e17f94b7613499cabf4c56b26a5ffb695c7e067182ed8a1c8","regions":[{"id":"320703","name":"连云区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320706","name":"海州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320707","name":"赣榆区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320722","name":"东海县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320723","name":"灌云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320724","name":"灌南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6cf2f5d46914a2ea3e3607a4861781dc8cc5c1edd4d969445c52ce37f020e638","collisionFallbacks":[]},{"id":"320800","name":"淮安市","province":"320000","provinceName":"江苏省","sha256":"586767bb407260bc075530f6a077af5faa653e865b446e73d8cb24d5c2243115","regions":[{"id":"320803","name":"淮安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320804","name":"淮阴区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320812","name":"清江浦区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320813","name":"洪泽区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320826","name":"涟水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320830","name":"盱眙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320831","name":"金湖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ad7e0367c2eb090f616addf4e49bfefa8e4d2cd93d3d940de620b21780a79f7e","collisionFallbacks":[]},{"id":"320900","name":"盐城市","province":"320000","provinceName":"江苏省","sha256":"088725cb2df16ed12c36a6d340621675e95edee73a9ae5d999ba841edc1f9514","regions":[{"id":"320902","name":"亭湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320903","name":"盐都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320904","name":"大丰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320921","name":"响水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320922","name":"滨海县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320923","name":"阜宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320924","name":"射阳县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"320925","name":"建湖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"320981","name":"东台市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"759d5bf94d604b698b4029d02e92d54eb2bad5411b8657776b1f426d66971f74","collisionFallbacks":[]},{"id":"321000","name":"扬州市","province":"320000","provinceName":"江苏省","sha256":"9c53022297baf0ff41560aede394b0d37e738ea81c696b40a73574567d431c67","regions":[{"id":"321002","name":"广陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321003","name":"邗江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321012","name":"江都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321023","name":"宝应县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321081","name":"仪征市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321084","name":"高邮市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ee8a6c6c395f0e1a1777322c0275f5fcdfb7533b3e831ca03bfff3be56907844","collisionFallbacks":[]},{"id":"321100","name":"镇江市","province":"320000","provinceName":"江苏省","sha256":"49584acec7e40ed576f05e4df32613ce34c6f929ba112cba997a4b0ff703db6d","regions":[{"id":"321102","name":"京口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321111","name":"润州区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"321112","name":"丹徒区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"321181","name":"丹阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321182","name":"扬中市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321183","name":"句容市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f87f041d5e56bbd3c05a0450c4f16ede852dd44315bcb5080d5bf726853c7570","collisionFallbacks":[]},{"id":"321200","name":"泰州市","province":"320000","provinceName":"江苏省","sha256":"4977e0b19712d91c4d461700c99c920ad7d18345b99fea049cfa31d666c45a3b","regions":[{"id":"321202","name":"海陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321203","name":"高港区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321204","name":"姜堰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321281","name":"兴化市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321282","name":"靖江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321283","name":"泰兴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"23fca98c01320fd629bf9acff5c2b270cbcdc6348fa1cb608695173b0d23725b","collisionFallbacks":[]},{"id":"321300","name":"宿迁市","province":"320000","provinceName":"江苏省","sha256":"e12baf5500b9dcd3716b6cb1b97c65d396c9c3227bfcf0f393cae92362c8b639","regions":[{"id":"321302","name":"宿城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321311","name":"宿豫区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321322","name":"沭阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321323","name":"泗阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"321324","name":"泗洪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"224533f54a79dc1de19a3378e5ac116c2aedd233397ff635fbaf43073c3bd5ad","collisionFallbacks":[]},{"id":"330100","name":"杭州市","province":"330000","provinceName":"浙江省","sha256":"1bfa48db925fb3e91450e860331151e85b49e3113822b5cabc60a799bb04c903","regions":[{"id":"330102","name":"上城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330105","name":"拱墅区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330106","name":"西湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330108","name":"滨江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330109","name":"萧山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330110","name":"余杭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330111","name":"富阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330112","name":"临安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330114","name":"钱塘区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330113","name":"临平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330122","name":"桐庐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330127","name":"淳安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330182","name":"建德市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"554ccd4b576695a592ab7d8e086835e9dc195ef131aa168f96f86e7fcf33267b","collisionFallbacks":[]},{"id":"330200","name":"宁波市","province":"330000","provinceName":"浙江省","sha256":"c6358c107be40715aac44a681258d49c8dad9698c9504c7c970a6b96e1cf2169","regions":[{"id":"330203","name":"海曙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330205","name":"江北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330206","name":"北仑区","sourceRings":7,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":0},{"id":"330211","name":"镇海区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330212","name":"鄞州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330213","name":"奉化区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330225","name":"象山县","sourceRings":52,"sourceHoles":0,"rings":52,"holes":0,"repairedSourcePolygons":0},{"id":"330226","name":"宁海县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330281","name":"余姚市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330282","name":"慈溪市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8f36d0855478d8aeeffd27903142f7055f466c56ed4092c0216e45fcb4f8cfa9","collisionFallbacks":[]},{"id":"330300","name":"温州市","province":"330000","provinceName":"浙江省","sha256":"665c78ff06cfeed19f8caca879388d66746e0d4d5631eebeb9aa8a7e3b15a6e3","regions":[{"id":"330302","name":"鹿城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330303","name":"龙湾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330304","name":"瓯海区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330305","name":"洞头区","sourceRings":36,"sourceHoles":0,"rings":36,"holes":0,"repairedSourcePolygons":0},{"id":"330324","name":"永嘉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330326","name":"平阳县","sourceRings":9,"sourceHoles":0,"rings":9,"holes":0,"repairedSourcePolygons":0},{"id":"330327","name":"苍南县","sourceRings":7,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":0},{"id":"330328","name":"文成县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330329","name":"泰顺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330381","name":"瑞安市","sourceRings":22,"sourceHoles":0,"rings":22,"holes":0,"repairedSourcePolygons":0},{"id":"330382","name":"乐清市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330383","name":"龙港市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"39214dcf23163de3cf2ff8d2a4d15f755d62c7e5370b879ff9c7a8b195ba740b","collisionFallbacks":[]},{"id":"330400","name":"嘉兴市","province":"330000","provinceName":"浙江省","sha256":"013ae0513f66db8132b6e38dfbfac9427541ca5effe3a11b7f7e491a80695587","regions":[{"id":"330402","name":"南湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330411","name":"秀洲区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330421","name":"嘉善县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330424","name":"海盐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330481","name":"海宁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330482","name":"平湖市","sourceRings":7,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":0},{"id":"330483","name":"桐乡市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ab25f4f393313921cf52a6b1901d8e0a853e49fba32649cf91076482528ca4ff","collisionFallbacks":[]},{"id":"330500","name":"湖州市","province":"330000","provinceName":"浙江省","sha256":"e9e47004725a3674b967f7d97703b6e1caff3a7c94071d20e2dc0f5f84e965dc","regions":[{"id":"330502","name":"吴兴区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330503","name":"南浔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330521","name":"德清县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330522","name":"长兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330523","name":"安吉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"982843e9236e9953a515ee805318971d878572b4e42dca9f131049a33c823cf7","collisionFallbacks":[]},{"id":"330600","name":"绍兴市","province":"330000","provinceName":"浙江省","sha256":"dfe21c45375180ce10d88e22621ff089f1eb0d604cc89f624ead12ceeaa462ee","regions":[{"id":"330602","name":"越城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330603","name":"柯桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330604","name":"上虞区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330624","name":"新昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330681","name":"诸暨市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330683","name":"嵊州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c3fec8abb3bd751bdf93ccd99010dc0cd247c65b257ff6d9656dd5bde9dd8b73","collisionFallbacks":[]},{"id":"330700","name":"金华市","province":"330000","provinceName":"浙江省","sha256":"8ec1c3c1b5425644e82c9b41e65bff72fccd7929eb0e850b483e6150ba30cb3e","regions":[{"id":"330702","name":"婺城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330703","name":"金东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330723","name":"武义县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330726","name":"浦江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330727","name":"磐安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330781","name":"兰溪市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330782","name":"义乌市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330783","name":"东阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330784","name":"永康市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"fece45528e1a5bae01cf26ac89d9b7cc1057d64508d93df7326ad55195827c26","collisionFallbacks":[]},{"id":"330800","name":"衢州市","province":"330000","provinceName":"浙江省","sha256":"2feb7747d799f7097f51017a6e69f40b67a0fbf2cbcb2c0c5a4c257fa3e9c246","regions":[{"id":"330802","name":"柯城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330803","name":"衢江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330822","name":"常山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330824","name":"开化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330825","name":"龙游县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"330881","name":"江山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"597869a1d1337769bab5a16d26c208e9049fd7c152e8945bd706b48dd8c7de06","collisionFallbacks":[]},{"id":"330900","name":"舟山市","province":"330000","provinceName":"浙江省","sha256":"b63b02ea6af4ef49606be19ce18750be6c6cbaf53e172648c839c74098b3545a","regions":[{"id":"330902","name":"定海区","sourceRings":47,"sourceHoles":0,"rings":47,"holes":0,"repairedSourcePolygons":0},{"id":"330903","name":"普陀区","sourceRings":64,"sourceHoles":0,"rings":64,"holes":0,"repairedSourcePolygons":0},{"id":"330921","name":"岱山县","sourceRings":61,"sourceHoles":0,"rings":61,"holes":0,"repairedSourcePolygons":0},{"id":"330922","name":"嵊泗县","sourceRings":45,"sourceHoles":0,"rings":45,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ae988ffb066bf283da645de19f0586430a207fdbe8a3bb2c6fdcc47b4eb2f436","collisionFallbacks":[]},{"id":"331000","name":"台州市","province":"330000","provinceName":"浙江省","sha256":"546ebf6f0dc8575fffb00e8c47826d0d75c78feba5634fcd34f552bf6bd72d06","regions":[{"id":"331002","name":"椒江区","sourceRings":14,"sourceHoles":0,"rings":14,"holes":0,"repairedSourcePolygons":0},{"id":"331003","name":"黄岩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331004","name":"路桥区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"331022","name":"三门县","sourceRings":14,"sourceHoles":0,"rings":14,"holes":0,"repairedSourcePolygons":0},{"id":"331023","name":"天台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331024","name":"仙居县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331081","name":"温岭市","sourceRings":23,"sourceHoles":0,"rings":23,"holes":0,"repairedSourcePolygons":0},{"id":"331082","name":"临海市","sourceRings":18,"sourceHoles":0,"rings":18,"holes":0,"repairedSourcePolygons":0},{"id":"331083","name":"玉环市","sourceRings":16,"sourceHoles":0,"rings":16,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"915d83ad1914f48b712ff5d39d0006785327da40f1829d1bf4506747b175116e","collisionFallbacks":[]},{"id":"331100","name":"丽水市","province":"330000","provinceName":"浙江省","sha256":"63d5278bf9fd1fd2701b4191ff884b02aa59bc81c61b64b2c8e6faa31fa3bf89","regions":[{"id":"331102","name":"莲都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331121","name":"青田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331122","name":"缙云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331123","name":"遂昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331124","name":"松阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331125","name":"云和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331126","name":"庆元县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331127","name":"景宁畲族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"331181","name":"龙泉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"1d9d24e21283b5d47df9ff4ca093f31113910d9687e4af749f38be5498b7e1b5","collisionFallbacks":[]},{"id":"340100","name":"合肥市","province":"340000","provinceName":"安徽省","sha256":"fde3f8762510ada0ee00366d9bb162543db1c1f8951aa44c01e27c97e4117b72","regions":[{"id":"340102","name":"瑶海区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340103","name":"庐阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340104","name":"蜀山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340111","name":"包河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340121","name":"长丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340122","name":"肥东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340123","name":"肥西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340124","name":"庐江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340181","name":"巢湖市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0eb87f5ef09988c927978440a1c731a713cf4a82a4f5fd3064a009dbf4648806","collisionFallbacks":[]},{"id":"340200","name":"芜湖市","province":"340000","provinceName":"安徽省","sha256":"e9b76a3e6ba85b07d2ff0d04a8475a35e567bdafc2e7d632de86853416a537dc","regions":[{"id":"340202","name":"镜湖区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"340207","name":"鸠江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340209","name":"弋江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340210","name":"湾沚区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340211","name":"繁昌区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340223","name":"南陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340281","name":"无为市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9beb9f630def135444c5eab3d4c8a8365095cea6257363417d2953cb969965ff","collisionFallbacks":[]},{"id":"340300","name":"蚌埠市","province":"340000","provinceName":"安徽省","sha256":"48c150191e626069afb6c58a1a360ebf63ef2ecfca877442784be1530f7bde27","regions":[{"id":"340302","name":"龙子湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340303","name":"蚌山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340304","name":"禹会区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340311","name":"淮上区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340321","name":"怀远县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340322","name":"五河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340323","name":"固镇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7d563d0b74f3cff2b907df4c044d32945d7b4a5689331f9ddb34e95a0b6cc3d8","collisionFallbacks":[]},{"id":"340400","name":"淮南市","province":"340000","provinceName":"安徽省","sha256":"77717987f7578b96e0df52f649fed5d18ac5879e367a8ce3cb7d625736b8bccf","regions":[{"id":"340402","name":"大通区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340403","name":"田家庵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340404","name":"谢家集区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340405","name":"八公山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340406","name":"潘集区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340421","name":"凤台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340422","name":"寿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a921c3aa64ecddfb48334dbbaf1b6819cf87550a842a1de64c03181538920f22","collisionFallbacks":[]},{"id":"340500","name":"马鞍山市","province":"340000","provinceName":"安徽省","sha256":"3bdff6561c3b52aa1b2d37321deeee01993b17f83a099d221892a99220c42b5f","regions":[{"id":"340503","name":"花山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340504","name":"雨山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340506","name":"博望区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340521","name":"当涂县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340522","name":"含山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340523","name":"和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9dcb35c41878e50ca1d2c435a75dfbde47f393de3e06bac92d49198f59df5799","collisionFallbacks":[]},{"id":"340600","name":"淮北市","province":"340000","provinceName":"安徽省","sha256":"1096c580a27ac973119f8c59ad64ad3f9e2a766349e50588f52c1979814c751f","regions":[{"id":"340602","name":"杜集区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"340603","name":"相山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340604","name":"烈山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340621","name":"濉溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"35f1a1485f6e812c68a41d9a7f436dee49e1fc286e73c1c7ef43b15aee4eb142","collisionFallbacks":[]},{"id":"340700","name":"铜陵市","province":"340000","provinceName":"安徽省","sha256":"47864627e4a4fa9970f5ac21a2f34b89cb7355586089d2e89927972c8639d839","regions":[{"id":"340705","name":"铜官区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"340706","name":"义安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340711","name":"郊区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"340722","name":"枞阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"fe7869ab121daa0efac90a2e2d27b13444c63fd6508bce165c466817d0bd4039","collisionFallbacks":[]},{"id":"340800","name":"安庆市","province":"340000","provinceName":"安徽省","sha256":"14ce449f3b757d6824cbadd08ca2628179c29faf47cd4fa1b02a92f08c1c8368","regions":[{"id":"340802","name":"迎江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340803","name":"大观区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340811","name":"宜秀区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340822","name":"怀宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340825","name":"太湖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340826","name":"宿松县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340827","name":"望江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340828","name":"岳西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"340881","name":"桐城市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"340882","name":"潜山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"614362b411e291da6248c5106eb76b79bba8ed8a00281b53a24052a7f0f9810f","collisionFallbacks":[]},{"id":"341000","name":"黄山市","province":"340000","provinceName":"安徽省","sha256":"675efd65e70d2709f1922f9b90bf847258a0e9fa8d272f83ed5b5f85fe0b7efc","regions":[{"id":"341002","name":"屯溪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341003","name":"黄山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341004","name":"徽州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341021","name":"歙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341022","name":"休宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341023","name":"黟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341024","name":"祁门县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"232981f372dba41603c758ce43f75d32c62776be0585aa64cab0d834c7a08fb2","collisionFallbacks":[]},{"id":"341100","name":"滁州市","province":"340000","provinceName":"安徽省","sha256":"863377ccda2a0e880b3ba0921bc6ddd46f2b1bd5b4b9fc016e4f17a094dd2d13","regions":[{"id":"341102","name":"琅琊区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341103","name":"南谯区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341122","name":"来安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341124","name":"全椒县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341125","name":"定远县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341126","name":"凤阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341181","name":"天长市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341182","name":"明光市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b807ccbf51dc23fd34e0fc45def0f369f66cdc64da354a70b0f64d8080db522c","collisionFallbacks":[]},{"id":"341200","name":"阜阳市","province":"340000","provinceName":"安徽省","sha256":"7ede922f279fe8ff95a955b03beb31338135d3f0eada2e8949fd000c07ad966f","regions":[{"id":"341202","name":"颍州区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"341203","name":"颍东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341204","name":"颍泉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341221","name":"临泉县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"341222","name":"太和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341225","name":"阜南县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"341226","name":"颍上县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341282","name":"界首市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"be4d21ba12adcb5b5e40f3d4c48708064a69813887aeb7bad88f2d6fee95f3d0","collisionFallbacks":[]},{"id":"341300","name":"宿州市","province":"340000","provinceName":"安徽省","sha256":"f2f531a2cbc03f703a73bf36db182013cc4f0ab7daaac69a16eede1b7841eaec","regions":[{"id":"341302","name":"埇桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341321","name":"砀山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341322","name":"萧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341323","name":"灵璧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341324","name":"泗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bb2931b44307db26fbaf09cb5de08e99eae1e4d58eca5918af19bc65c5a8fae9","collisionFallbacks":[]},{"id":"341500","name":"六安市","province":"340000","provinceName":"安徽省","sha256":"a483a0f3103600986b4d2c2e066c00c6a1e5f46b81387d007cb3a97f53840259","regions":[{"id":"341502","name":"金安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341503","name":"裕安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341504","name":"叶集区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341522","name":"霍邱县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341523","name":"舒城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341524","name":"金寨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341525","name":"霍山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ab8470559b8d9b43c77acf63290d48c92340a25beb3edf2c943c0cb4ad355a99","collisionFallbacks":[]},{"id":"341600","name":"亳州市","province":"340000","provinceName":"安徽省","sha256":"ec9a8ef1277dc6ed0d915e797730b677e14526810ca9105aeea2dd2c17917466","regions":[{"id":"341602","name":"谯城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341621","name":"涡阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341622","name":"蒙城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341623","name":"利辛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"35d7779a4d52097b0d73e60cb0319ae7cba7dc3767c48f6dff0a3b00077ae576","collisionFallbacks":[]},{"id":"341700","name":"池州市","province":"340000","provinceName":"安徽省","sha256":"4020c3d6d3f107fef00a9f955caac1388ba00fdcd13ca6eb1970c7685e7016a6","regions":[{"id":"341702","name":"贵池区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"341721","name":"东至县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"341722","name":"石台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341723","name":"青阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f9306b98cffbd1bee6244066a60171c427dff325464df5d8c895e3c6deb8c927","collisionFallbacks":[]},{"id":"341800","name":"宣城市","province":"340000","provinceName":"安徽省","sha256":"3e8452d1990cadbf72863a416b1a66d95e51325c05bf697f198bfdc78c309ca4","regions":[{"id":"341802","name":"宣州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341821","name":"郎溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341823","name":"泾县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341824","name":"绩溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341825","name":"旌德县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"341881","name":"宁国市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"341882","name":"广德市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3e4e8743af75d9974b0209c07de0998b52782b4c0efac5619f3bc052e1b712a2","collisionFallbacks":[]},{"id":"350100","name":"福州市","province":"350000","provinceName":"福建省","sha256":"35da7612b7436c54ffce8745bcbb9850b980f23041698680985a78dbb6d2b7a1","regions":[{"id":"350102","name":"鼓楼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350103","name":"台江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350104","name":"仓山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350105","name":"马尾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350111","name":"晋安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350112","name":"长乐区","sourceRings":13,"sourceHoles":0,"rings":13,"holes":0,"repairedSourcePolygons":0},{"id":"350121","name":"闽侯县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350122","name":"连江县","sourceRings":33,"sourceHoles":0,"rings":35,"holes":0,"repairedSourcePolygons":1},{"id":"350123","name":"罗源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":2,"repairedSourcePolygons":1},{"id":"350124","name":"闽清县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"350125","name":"永泰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350128","name":"平潭县","sourceRings":50,"sourceHoles":0,"rings":50,"holes":0,"repairedSourcePolygons":0},{"id":"350181","name":"福清市","sourceRings":21,"sourceHoles":0,"rings":21,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"73cf7567b47ae8e6bc3ca2fab19ae97cca2219d6d57770af7b3ed7ddcbd1737c","collisionFallbacks":[]},{"id":"350200","name":"厦门市","province":"350000","provinceName":"福建省","sha256":"18ffd9136117c80f3ecb7d45aa199298ba02199ee2c9fb353bfc2f07ec7bac32","regions":[{"id":"350203","name":"思明区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"350205","name":"海沧区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350206","name":"湖里区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"350211","name":"集美区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350212","name":"同安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350213","name":"翔安区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5e87d57b19c5ed6d92d05c829da9302064fc10a27fdf1327b0bfc7a5f778f315","collisionFallbacks":[]},{"id":"350300","name":"莆田市","province":"350000","provinceName":"福建省","sha256":"d9aae6ffd736add9b9f0df6cde5e5cd481bfe4c59d6e4a6c50a438c26b8ee9d1","regions":[{"id":"350302","name":"城厢区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350303","name":"涵江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350304","name":"荔城区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"350305","name":"秀屿区","sourceRings":28,"sourceHoles":0,"rings":28,"holes":0,"repairedSourcePolygons":0},{"id":"350322","name":"仙游县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8c4e798be9d832b111b57710685823a2a3eb0255c2baf8c8e1ae953f425b99ee","collisionFallbacks":[]},{"id":"350400","name":"三明市","province":"350000","provinceName":"福建省","sha256":"8eecca2e42d4718ad09b0e102071ff95cff8a40e4dba92da4c27493dc3a41929","regions":[{"id":"350403","name":"三元区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350421","name":"明溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350423","name":"清流县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350424","name":"宁化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350425","name":"大田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350426","name":"尤溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350427","name":"沙县区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350428","name":"将乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350429","name":"泰宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350430","name":"建宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350481","name":"永安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c13cff1eeedffac5c93074d2338758595f726920b6b32696d1237c9633895093","collisionFallbacks":[]},{"id":"350500","name":"泉州市","province":"350000","provinceName":"福建省","sha256":"60671d99f346c67541042d410a5d645b115d3bb78c1102b110d5fe87d37c71ba","regions":[{"id":"350502","name":"鲤城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":2,"repairedSourcePolygons":1},{"id":"350503","name":"丰泽区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350504","name":"洛江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350505","name":"泉港区","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"350521","name":"惠安县","sourceRings":17,"sourceHoles":0,"rings":17,"holes":0,"repairedSourcePolygons":0},{"id":"350524","name":"安溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350525","name":"永春县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350526","name":"德化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350527","name":"金门县","sourceRings":15,"sourceHoles":0,"rings":15,"holes":0,"repairedSourcePolygons":0},{"id":"350581","name":"石狮市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"350582","name":"晋江市","sourceRings":3,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":1},{"id":"350583","name":"南安市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3a2e4c36bebada71ce13fd5fcdf2e294c06e9dfdaaa667ee0221d04fe30607fc","collisionFallbacks":[]},{"id":"350600","name":"漳州市","province":"350000","provinceName":"福建省","sha256":"429c229dd68838413e6c58e3a03c3c42858a1b241f4c0906a12cc51b980523fa","regions":[{"id":"350602","name":"芗城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350603","name":"龙文区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350622","name":"云霄县","sourceRings":1,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":1},{"id":"350623","name":"漳浦县","sourceRings":12,"sourceHoles":0,"rings":12,"holes":0,"repairedSourcePolygons":0},{"id":"350624","name":"诏安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350625","name":"长泰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350626","name":"东山县","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"350627","name":"南靖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350628","name":"平和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":2,"repairedSourcePolygons":1},{"id":"350629","name":"华安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350681","name":"龙海区","sourceRings":8,"sourceHoles":0,"rings":8,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0318c572c1aed088204dd537c0e782b1c69988cb2c770bd57172f901d46df01b","collisionFallbacks":[]},{"id":"350700","name":"南平市","province":"350000","provinceName":"福建省","sha256":"9595bcd0e4007388c668e0a7351e0d0ecdbac0540eb7d79cb97fa78b65ebc2ab","regions":[{"id":"350702","name":"延平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350703","name":"建阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350721","name":"顺昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350722","name":"浦城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350723","name":"光泽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350724","name":"松溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350725","name":"政和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350781","name":"邵武市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350782","name":"武夷山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350783","name":"建瓯市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"429ac68688c117430f2976c21ec7d45ced1adb155816e450a334b30f5726b0e0","collisionFallbacks":[]},{"id":"350800","name":"龙岩市","province":"350000","provinceName":"福建省","sha256":"65adce7f2718a9771b5001a35b615fa17354f53d26eba3f314d477e051ca7ad9","regions":[{"id":"350802","name":"新罗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350803","name":"永定区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350821","name":"长汀县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350823","name":"上杭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350824","name":"武平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350825","name":"连城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350881","name":"漳平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"010af21dc759af966b6cc9fa74b1881c7d9eacc550a0bc16125d854c7fcdc7eb","collisionFallbacks":[]},{"id":"350900","name":"宁德市","province":"350000","provinceName":"福建省","sha256":"7bee392496cd4b6282020aa9a518981e1050a2213e1063348bd2fa8b2b677212","regions":[{"id":"350902","name":"蕉城区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"350921","name":"霞浦县","sourceRings":24,"sourceHoles":0,"rings":24,"holes":0,"repairedSourcePolygons":0},{"id":"350922","name":"古田县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"350923","name":"屏南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350924","name":"寿宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350925","name":"周宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350926","name":"柘荣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350981","name":"福安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"350982","name":"福鼎市","sourceRings":11,"sourceHoles":0,"rings":11,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"784f7fc9aa71faf9158ab7c3d5b6b5351ca3550f5ef69a318c7b0cf0ea60a2bd","collisionFallbacks":[]},{"id":"360100","name":"南昌市","province":"360000","provinceName":"江西省","sha256":"f4120c84b01dbafab71405a5559c8dd617813c52e0a51ef654ce789855d0c75a","regions":[{"id":"360102","name":"东湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360103","name":"西湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360104","name":"青云谱区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360111","name":"青山湖区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"360112","name":"新建区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360113","name":"红谷滩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360121","name":"南昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360123","name":"安义县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360124","name":"进贤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a3a0cfa7fdf38a0a4dc59321a0cf0ce40be14b09802be3e3632a4b384f32d79e","collisionFallbacks":[]},{"id":"360200","name":"景德镇市","province":"360000","provinceName":"江西省","sha256":"01e7db1012cbc851b8675f1a3453d7ca1333cb04d20f80c89c522185022e894b","regions":[{"id":"360202","name":"昌江区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"360203","name":"珠山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360222","name":"浮梁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360281","name":"乐平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4a1b7de1bc66e47f868c6760cc089b4fa63f8ee7d910ab76a778e62bed609a68","collisionFallbacks":[]},{"id":"360300","name":"萍乡市","province":"360000","provinceName":"江西省","sha256":"440851b6fe49c377942d822320949d9ceb7a8046bd9228429f47249521a48d14","regions":[{"id":"360302","name":"安源区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360313","name":"湘东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360321","name":"莲花县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360322","name":"上栗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360323","name":"芦溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8c65186bdf5d1644ef5f6a468ea6af5f5b560bf60da4ec424f4e432125b039ec","collisionFallbacks":[]},{"id":"360400","name":"九江市","province":"360000","provinceName":"江西省","sha256":"a1f4bdd4f3933b455e752dc530a631720feaee92f189847dbd1e78ccb303b812","regions":[{"id":"360402","name":"濂溪区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"360403","name":"浔阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360404","name":"柴桑区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"360423","name":"武宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360424","name":"修水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360425","name":"永修县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360426","name":"德安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360428","name":"都昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360429","name":"湖口县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360430","name":"彭泽县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"360481","name":"瑞昌市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360482","name":"共青城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360483","name":"庐山市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6deb53596520478715bb2c21dee25304abcf25b1aadf2654c8037237003b72c6","collisionFallbacks":[]},{"id":"360500","name":"新余市","province":"360000","provinceName":"江西省","sha256":"d9a0faf73d9a3b050f1ec26c0cdc62aca24c7b50001e5ef4fa1d12549de19ea7","regions":[{"id":"360502","name":"渝水区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360521","name":"分宜县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5f7fad51174d4bd73d3723b30673a6496a8329a1217be44f4236a40d2cce878a","collisionFallbacks":[]},{"id":"360600","name":"鹰潭市","province":"360000","provinceName":"江西省","sha256":"be968e936b03d80635a32489446dd03c8f69243666070d626143900ae9782eb1","regions":[{"id":"360602","name":"月湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360603","name":"余江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360681","name":"贵溪市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b36d80c1ef18760aec01f9c0a8f3d73db79da158803174f10f45f69214c4a1ea","collisionFallbacks":[]},{"id":"360700","name":"赣州市","province":"360000","provinceName":"江西省","sha256":"3b2064fef69db9392c263122980961d04cf45a715f1a8d6ddecfb1591aab0b4e","regions":[{"id":"360702","name":"章贡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360703","name":"南康区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360704","name":"赣县区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360722","name":"信丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360723","name":"大余县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360724","name":"上犹县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360725","name":"崇义县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360726","name":"安远县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360728","name":"定南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360729","name":"全南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360730","name":"宁都县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360731","name":"于都县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360732","name":"兴国县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360733","name":"会昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360734","name":"寻乌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360735","name":"石城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360781","name":"瑞金市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360783","name":"龙南市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"45b8c6f1e906ed63d15157756b2e86c6c8c6c2a193ea108a105a10dc05cb6d8f","collisionFallbacks":[]},{"id":"360800","name":"吉安市","province":"360000","provinceName":"江西省","sha256":"7a22500fdc36ff4054fc88838b5f22ffc4b12728b4fd4b440164a14bc9fe3fb9","regions":[{"id":"360802","name":"吉州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360803","name":"青原区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360821","name":"吉安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360822","name":"吉水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360823","name":"峡江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360824","name":"新干县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360825","name":"永丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360826","name":"泰和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360827","name":"遂川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360828","name":"万安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360829","name":"安福县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360830","name":"永新县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360881","name":"井冈山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6f7f93ad0a7c2e21643f020241fb1517c02ba3393024fabc30673bd7fe3b5897","collisionFallbacks":[]},{"id":"360900","name":"宜春市","province":"360000","provinceName":"江西省","sha256":"722d942d8f07d3aa1f646699998c8b5b85d9ee76e05d33398f138763d6f23b5e","regions":[{"id":"360902","name":"袁州区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"360921","name":"奉新县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360922","name":"万载县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"360923","name":"上高县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360924","name":"宜丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360925","name":"靖安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360926","name":"铜鼓县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360981","name":"丰城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360982","name":"樟树市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"360983","name":"高安市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b38ff817378508d3f9c40286176c021c7e2a37cfc8a0165aec0c4d9a67121ada","collisionFallbacks":[]},{"id":"361000","name":"抚州市","province":"360000","provinceName":"江西省","sha256":"f61505bcf4bef083f9c7040719717a1975b30564d8fbeb2bac1c38994a7eb2c8","regions":[{"id":"361002","name":"临川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361003","name":"东乡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361021","name":"南城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361022","name":"黎川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361023","name":"南丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361024","name":"崇仁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361025","name":"乐安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361026","name":"宜黄县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361027","name":"金溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361028","name":"资溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361030","name":"广昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d61fc9bfe330bb48347701afb8ec4d5e2c04d3e09a0001ea43029426bb8b0aa1","collisionFallbacks":[]},{"id":"361100","name":"上饶市","province":"360000","provinceName":"江西省","sha256":"ddf4aeba72fc2544bc83d4819403ef760d7c9f232fd4d578f152c0c78efc6ace","regions":[{"id":"361102","name":"信州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361103","name":"广丰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361104","name":"广信区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361123","name":"玉山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361124","name":"铅山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361125","name":"横峰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361126","name":"弋阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361127","name":"余干县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361128","name":"鄱阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361129","name":"万年县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361130","name":"婺源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"361181","name":"德兴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6c243f96769a2f77e669f25e84a14094c3a8f8a944ce680f50ddb1c6e5f99a54","collisionFallbacks":[]},{"id":"370100","name":"济南市","province":"370000","provinceName":"山东省","sha256":"4c6c88c50fae09eca5c376a4c1aea313694a908f844e4817d7cf69b83c67fbc5","regions":[{"id":"370102","name":"历下区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370103","name":"市中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370104","name":"槐荫区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370105","name":"天桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370112","name":"历城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370113","name":"长清区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370114","name":"章丘区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370115","name":"济阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370116","name":"莱芜区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370117","name":"钢城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370124","name":"平阴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370126","name":"商河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"35efc9822cb5b080ad75a54c9b6fbdc7e56d6af682a9cdb779bf988e49ce763c","collisionFallbacks":[]},{"id":"370200","name":"青岛市","province":"370000","provinceName":"山东省","sha256":"006e71f5ec468279c9ff039e2bfe67a8c9eb804e8589425b1a49dee90d3585ff","regions":[{"id":"370202","name":"市南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370203","name":"市北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370211","name":"黄岛区","sourceRings":8,"sourceHoles":0,"rings":8,"holes":0,"repairedSourcePolygons":0},{"id":"370212","name":"崂山区","sourceRings":9,"sourceHoles":0,"rings":9,"holes":0,"repairedSourcePolygons":0},{"id":"370213","name":"李沧区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370214","name":"城阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370215","name":"即墨区","sourceRings":8,"sourceHoles":0,"rings":8,"holes":0,"repairedSourcePolygons":0},{"id":"370281","name":"胶州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370283","name":"平度市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370285","name":"莱西市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"fdb3614847427904f9fee8d63a0271a19bbabef3d86f51ace6edb1ceef03a9a0","collisionFallbacks":[]},{"id":"370300","name":"淄博市","province":"370000","provinceName":"山东省","sha256":"9f90a62f6c8502b2019a0a6a24b8a58ef8112052adbdc8d9d97589119333f4b8","regions":[{"id":"370302","name":"淄川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370303","name":"张店区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370304","name":"博山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370305","name":"临淄区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370306","name":"周村区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370321","name":"桓台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370322","name":"高青县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370323","name":"沂源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"18df47bded6c3b2292e9f62afebc9d2462006ca6c6c4b471e6d5eb0ec7937393","collisionFallbacks":[]},{"id":"370400","name":"枣庄市","province":"370000","provinceName":"山东省","sha256":"116c2c407e295846f97e7197e8a1db5cfb56d8cb5185cf7df873f97a86e62de1","regions":[{"id":"370402","name":"市中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370403","name":"薛城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370404","name":"峄城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370405","name":"台儿庄区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370406","name":"山亭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370481","name":"滕州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"98afc3883480a695e2f2d5da9f2e95e723b924247645bd3c9d06a769a921de8e","collisionFallbacks":[]},{"id":"370500","name":"东营市","province":"370000","provinceName":"山东省","sha256":"b8335f3214928f15b2191931c9e2bcba335a916479a053c210d2d5179c9ed8fa","regions":[{"id":"370502","name":"东营区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370503","name":"河口区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"370505","name":"垦利区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370522","name":"利津县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"370523","name":"广饶县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7c8e331501ca7188d18f61102f8ad8c5931a3bba47f4a4934d677de91ec98a0e","collisionFallbacks":[]},{"id":"370600","name":"烟台市","province":"370000","provinceName":"山东省","sha256":"263bd82c991adac7bd75678db6a71e506f39f5dc6dfa3918ce5cf684f230eb3b","regions":[{"id":"370602","name":"芝罘区","sourceRings":6,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":1},{"id":"370611","name":"福山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370612","name":"牟平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370613","name":"莱山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370614","name":"蓬莱区","sourceRings":18,"sourceHoles":0,"rings":18,"holes":0,"repairedSourcePolygons":0},{"id":"370681","name":"龙口市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"370682","name":"莱阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370683","name":"莱州市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"370685","name":"招远市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370686","name":"栖霞市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370687","name":"海阳市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8ba53dce92067410ec294010f282f4ddd42ef93585fdd106ef9def418a14ce22","collisionFallbacks":[]},{"id":"370700","name":"潍坊市","province":"370000","provinceName":"山东省","sha256":"8a5a569f41b0ffb564a30da40d5fd5491f24b27a1999cc8b28d904b3273acbd0","regions":[{"id":"370702","name":"潍城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370703","name":"寒亭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370704","name":"坊子区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370705","name":"奎文区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370724","name":"临朐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370725","name":"昌乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370781","name":"青州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370782","name":"诸城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370783","name":"寿光市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370784","name":"安丘市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370785","name":"高密市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370786","name":"昌邑市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b084a7d02d50adb3a3a046a5b0b14edfd6e95b866c2e6d7fb07ad9e484b02304","collisionFallbacks":[]},{"id":"370800","name":"济宁市","province":"370000","provinceName":"山东省","sha256":"475ed4e90eb1abcf24a57fb94e22aa5cffc0b6a84097091342e3068716f28752","regions":[{"id":"370811","name":"任城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370812","name":"兖州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370826","name":"微山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370827","name":"鱼台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370828","name":"金乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370829","name":"嘉祥县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370830","name":"汶上县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370831","name":"泗水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370832","name":"梁山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370881","name":"曲阜市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370883","name":"邹城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d0372d84b84c87ea28fefaad88b9431753f1ac0d535657c31896d0370751db4f","collisionFallbacks":[]},{"id":"370900","name":"泰安市","province":"370000","provinceName":"山东省","sha256":"8359a3f0fb0c3fa5b3bbebdf1c24eac67f6a00b21e64f8a498f8ef63dd2834db","regions":[{"id":"370902","name":"泰山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370911","name":"岱岳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370921","name":"宁阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370923","name":"东平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370982","name":"新泰市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"370983","name":"肥城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cf0ae28403e8beccda6140d551417f7986956affb02a2eee30ead0132d300157","collisionFallbacks":[]},{"id":"371000","name":"威海市","province":"370000","provinceName":"山东省","sha256":"3e28da9e44fa47f72f95cfae030d788ad4dc33742620e732c2cbde345ab5acf6","regions":[{"id":"371002","name":"环翠区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"371003","name":"文登区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"371082","name":"荣成市","sourceRings":9,"sourceHoles":0,"rings":9,"holes":0,"repairedSourcePolygons":0},{"id":"371083","name":"乳山市","sourceRings":8,"sourceHoles":0,"rings":8,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e265db11eeff10b21170a5dc56528454315142d321230b3f4b12f4b612c06b75","collisionFallbacks":[]},{"id":"371100","name":"日照市","province":"370000","provinceName":"山东省","sha256":"aa17d2b40ebd5aeebad8c9c393114edd0023bb1a346375904a3ae049c7a39d76","regions":[{"id":"371102","name":"东港区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371103","name":"岚山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371121","name":"五莲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371122","name":"莒县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8fbc67901c1a821a5796c20328343b34c36d09176e66d6191e013189658961f6","collisionFallbacks":[]},{"id":"371300","name":"临沂市","province":"370000","provinceName":"山东省","sha256":"ebccc7e1d86a781d33ba2cb5a0de0589c6265a4d382f021a6e14c4e06b157c5d","regions":[{"id":"371302","name":"兰山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371311","name":"罗庄区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371312","name":"河东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371321","name":"沂南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371322","name":"郯城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371323","name":"沂水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371324","name":"兰陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371325","name":"费县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371326","name":"平邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371327","name":"莒南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371328","name":"蒙阴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371329","name":"临沭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f3e84c90b3ef6087d25faf251bd3a2430dc0a7b62cd0ffdb3ec4a4163e5ab1c4","collisionFallbacks":[]},{"id":"371400","name":"德州市","province":"370000","provinceName":"山东省","sha256":"20683dff367694ff24f40ae9fa5134af321e9b8600789996e8ce500ae3e8751f","regions":[{"id":"371402","name":"德城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371403","name":"陵城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371422","name":"宁津县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"371423","name":"庆云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371424","name":"临邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371425","name":"齐河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371426","name":"平原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371427","name":"夏津县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371428","name":"武城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371481","name":"乐陵市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371482","name":"禹城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"edc6fc8ac363dfd347e57237ed132605400aa40dc5f7534de47b8bb192b3119e","collisionFallbacks":[]},{"id":"371500","name":"聊城市","province":"370000","provinceName":"山东省","sha256":"7b06897be339ac6465f18ed624c6689e8bd6bc3a4867f9540df8138324ff10f6","regions":[{"id":"371502","name":"东昌府区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371503","name":"茌平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371521","name":"阳谷县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371522","name":"莘县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"371524","name":"东阿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371525","name":"冠县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371526","name":"高唐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371581","name":"临清市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cdcd443e5f4ad7b91851a131854455604475fb70964694946e322f38723432ed","collisionFallbacks":[]},{"id":"371600","name":"滨州市","province":"370000","provinceName":"山东省","sha256":"5ff51f4259a223972fe6edff2e877047af0b46768943b28e8e2a15347e6467de","regions":[{"id":"371602","name":"滨城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371603","name":"沾化区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"371621","name":"惠民县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371622","name":"阳信县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371623","name":"无棣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371625","name":"博兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371681","name":"邹平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"aa277390dd39d9bec77282a1cf08dcb8fa06d04ac81ed74306cccc360b91a28f","collisionFallbacks":[]},{"id":"371700","name":"菏泽市","province":"370000","provinceName":"山东省","sha256":"65a017f4eefc79fdf0e165986afc8cec5d490e09c092de4802fdd759027c8cb5","regions":[{"id":"371702","name":"牡丹区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371703","name":"定陶区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371721","name":"曹县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371722","name":"单县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371723","name":"成武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371724","name":"巨野县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371725","name":"郓城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371726","name":"鄄城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"371728","name":"东明县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"eebb292b25a836778b63972d3311a1b1c5aae74353d8b51f877d26ba39b82a58","collisionFallbacks":[]},{"id":"410100","name":"郑州市","province":"410000","provinceName":"河南省","sha256":"2a3f630fb63d4bb465610919d31b3bd2f0bebf83f03a21707ab1caaa2e2ceb2f","regions":[{"id":"410102","name":"中原区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410103","name":"二七区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410104","name":"管城回族区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410105","name":"金水区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410106","name":"上街区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410108","name":"惠济区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410122","name":"中牟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410181","name":"巩义市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410182","name":"荥阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410183","name":"新密市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410184","name":"新郑市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410185","name":"登封市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f9dff3e8b2674930d6d7e79af262ae7fa154a94d88c7940d04fcb6a42be7c071","collisionFallbacks":[]},{"id":"410200","name":"开封市","province":"410000","provinceName":"河南省","sha256":"62f6793030f3682b85f0b8408a6434e9b3736a6a92cffe6caa234f109d504822","regions":[{"id":"410202","name":"龙亭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410203","name":"顺河回族区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410204","name":"鼓楼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410205","name":"禹王台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410212","name":"祥符区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410221","name":"杞县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410222","name":"通许县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410223","name":"尉氏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410225","name":"兰考县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b5af6fdcc11116082987c9bc1af0b0c12623f2b54bc5cc6025e16470ef8e4f3f","collisionFallbacks":[]},{"id":"410300","name":"洛阳市","province":"410000","provinceName":"河南省","sha256":"8fd2a44d4f43595e543ca9d0ae6c187386080b6b2d733d38d8944cc3665bc635","regions":[{"id":"410302","name":"老城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410303","name":"西工区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410304","name":"瀍河回族区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410305","name":"涧西区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410306","name":"孟津区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410311","name":"洛龙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410323","name":"新安县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"410324","name":"栾川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410325","name":"嵩县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410326","name":"汝阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410327","name":"宜阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410328","name":"洛宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410329","name":"伊川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410381","name":"偃师区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"972279763c091ed5273542179948521ce4f730b22381f5ec7f5cf3752756100b","collisionFallbacks":[]},{"id":"410400","name":"平顶山市","province":"410000","provinceName":"河南省","sha256":"150bda432dfe422ddb6987d11c9daf929408ae4018d0db1dd1b1f495c45f17a3","regions":[{"id":"410402","name":"新华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410403","name":"卫东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410404","name":"石龙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410411","name":"湛河区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"410421","name":"宝丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410422","name":"叶县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410423","name":"鲁山县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"410425","name":"郏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410481","name":"舞钢市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410482","name":"汝州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9f10d0d262cab68e1f2a027a9379e74b83df7162cea18417cb37b8793db53925","collisionFallbacks":[]},{"id":"410500","name":"安阳市","province":"410000","provinceName":"河南省","sha256":"79b0df6f2a4c08e8637a7ceb63ae16b0dbf0acdafce0d9f38a6493e3209fcfda","regions":[{"id":"410502","name":"文峰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410503","name":"北关区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410505","name":"殷都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410506","name":"龙安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410522","name":"安阳县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"410523","name":"汤阴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410526","name":"滑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410527","name":"内黄县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410581","name":"林州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"64cce6378502c53c65072b2a484a5a9a8bbb01abef294d2be71350536dc55f4a","collisionFallbacks":[]},{"id":"410600","name":"鹤壁市","province":"410000","provinceName":"河南省","sha256":"847b577fc3ff1a7f86056fa880bf3236e626574ba3a845e4c9135fbb0ca5969e","regions":[{"id":"410602","name":"鹤山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410603","name":"山城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410611","name":"淇滨区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410621","name":"浚县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410622","name":"淇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d8dc32309d2bab5b1b7a234e08d3c9ea450c9daa256eae96a8e23ec6ae6c7063","collisionFallbacks":[]},{"id":"410700","name":"新乡市","province":"410000","provinceName":"河南省","sha256":"2808bffb328a94c4c39055989b11f6318073135d9ee5fad4feb71d8708492f6b","regions":[{"id":"410702","name":"红旗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410703","name":"卫滨区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410704","name":"凤泉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410711","name":"牧野区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410721","name":"新乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410724","name":"获嘉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410725","name":"原阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410726","name":"延津县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410727","name":"封丘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410781","name":"卫辉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410782","name":"辉县市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410783","name":"长垣市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e3a6ee65a4e3ccaa342267f36bca447983cfb80b831fee4150b2c8aa8a1c62d4","collisionFallbacks":[]},{"id":"410800","name":"焦作市","province":"410000","provinceName":"河南省","sha256":"583277a6b83121e877b8cc79273ed388007702c9bd3e10a1e7e45efb59cc96b8","regions":[{"id":"410802","name":"解放区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410803","name":"中站区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410804","name":"马村区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410811","name":"山阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410821","name":"修武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410822","name":"博爱县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410823","name":"武陟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410825","name":"温县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410882","name":"沁阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410883","name":"孟州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d60e08df32e31639c0ebca5f0c5a285f8a2fecd285efe76293d836683ceee36f","collisionFallbacks":[]},{"id":"410900","name":"濮阳市","province":"410000","provinceName":"河南省","sha256":"462a148707ec12d275debfca8751d7547e74fe7210143f1ad263a64fce415b80","regions":[{"id":"410902","name":"华龙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410922","name":"清丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410923","name":"南乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410926","name":"范县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"410927","name":"台前县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"410928","name":"濮阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"77a5c98527cc82f1956e129602ea722f41bc6b33469872109e6c6b21b4d57540","collisionFallbacks":[]},{"id":"411000","name":"许昌市","province":"410000","provinceName":"河南省","sha256":"61cf4f2f77614734046969aceb07012067e72eb4a8b66740afd14fc80cbba1ac","regions":[{"id":"411002","name":"魏都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411003","name":"建安区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"411024","name":"鄢陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411025","name":"襄城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411081","name":"禹州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411082","name":"长葛市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3f8bd3cef953afb4a0376ecac8f2517b0e0e8958a1c46563cf5d813934f932b1","collisionFallbacks":[]},{"id":"411100","name":"漯河市","province":"410000","provinceName":"河南省","sha256":"73e5da53e5ab10413c63c03bccc760cc37c77bdc8c48c86c7bb0c6f0bb9158af","regions":[{"id":"411102","name":"源汇区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411103","name":"郾城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411104","name":"召陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411121","name":"舞阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411122","name":"临颍县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"28a425df3c707eb6e8c21784db335a958716f75227047895a73d4b23aa90b7d3","collisionFallbacks":[]},{"id":"411200","name":"三门峡市","province":"410000","provinceName":"河南省","sha256":"8d2a883a54e0838bf044bd7c85ab1888ab7e6fe69e5c15efa30f497df04c85a5","regions":[{"id":"411202","name":"湖滨区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411203","name":"陕州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411221","name":"渑池县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"411224","name":"卢氏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411281","name":"义马市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411282","name":"灵宝市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5994b5735bd761df873fbc16935dc5d07f0a543549cacad1c5d9bc9a3724d5d1","collisionFallbacks":[]},{"id":"411300","name":"南阳市","province":"410000","provinceName":"河南省","sha256":"eebb624a11d6fca61a1fc47041be56d76ccdf08b4a34e0c75263fe723462f661","regions":[{"id":"411302","name":"宛城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411303","name":"卧龙区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"411321","name":"南召县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":2,"repairedSourcePolygons":1},{"id":"411322","name":"方城县","sourceRings":1,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":1},{"id":"411323","name":"西峡县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"411324","name":"镇平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411325","name":"内乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411326","name":"淅川县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"411327","name":"社旗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411328","name":"唐河县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"411329","name":"新野县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411330","name":"桐柏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411381","name":"邓州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f1b3884f4b140725c775b67486df2c3971b9a25e0659df46b44626a6d439ae39","collisionFallbacks":[]},{"id":"411400","name":"商丘市","province":"410000","provinceName":"河南省","sha256":"8805e34231099ccf9c8a69247eb8014b2aae61030027894ca8a66b39e5ffcf39","regions":[{"id":"411402","name":"梁园区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411403","name":"睢阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411421","name":"民权县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411422","name":"睢县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411423","name":"宁陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411424","name":"柘城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411425","name":"虞城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411426","name":"夏邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411481","name":"永城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"1888f0ca7ea9479ea285e4c9f4dcce439ac94b62e4789b144d9bb6b3284290eb","collisionFallbacks":[]},{"id":"411500","name":"信阳市","province":"410000","provinceName":"河南省","sha256":"35f0a08ad2c2d908af1364348d5f45eb4c17bb73918d46c376001ec617efe8f5","regions":[{"id":"411502","name":"浉河区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"411503","name":"平桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411521","name":"罗山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411522","name":"光山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411523","name":"新县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411524","name":"商城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411525","name":"固始县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411526","name":"潢川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411527","name":"淮滨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411528","name":"息县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"46260264e69e23fda80868369e33023c466c159ea0a3b6366f48f59073839d3b","collisionFallbacks":[]},{"id":"411600","name":"周口市","province":"410000","provinceName":"河南省","sha256":"c266d9147f7e219e48c567e7e67612c6432f7eab3817492916847a64a5c1de31","regions":[{"id":"411602","name":"川汇区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411603","name":"淮阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411621","name":"扶沟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411622","name":"西华县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411623","name":"商水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411624","name":"沈丘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411625","name":"郸城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411627","name":"太康县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411628","name":"鹿邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411681","name":"项城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f1e15ad0f0c7d1a4c19b34188ff6db2d109d5d31ee3241421a295e9247bea051","collisionFallbacks":[]},{"id":"411700","name":"驻马店市","province":"410000","provinceName":"河南省","sha256":"3c95701a0cb72e5feff6274ad55a7652b999772abe8d2f8601105991e3f2bd33","regions":[{"id":"411702","name":"驿城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411721","name":"西平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411722","name":"上蔡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411723","name":"平舆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411724","name":"正阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411725","name":"确山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411726","name":"泌阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411727","name":"汝南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411728","name":"遂平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"411729","name":"新蔡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"91080edeef324157fc36a1e7fa24c4d8756845dc4f046c3f47d27d16a53b373e","collisionFallbacks":[]},{"id":"420100","name":"武汉市","province":"420000","provinceName":"湖北省","sha256":"f03865cc55cf8d4e3b6cb581fdb199ef0405bbad817c8a652e2b72414dcc5aeb","regions":[{"id":"420102","name":"江岸区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420103","name":"江汉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420104","name":"硚口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420105","name":"汉阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420106","name":"武昌区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420107","name":"青山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420111","name":"洪山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420112","name":"东西湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420113","name":"汉南区","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"420114","name":"蔡甸区","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"420115","name":"江夏区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420116","name":"黄陂区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420117","name":"新洲区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"db6871f828e011d07ede409b90e2783d9db4c3e2ae7ef3cb4b16babe2e38de75","collisionFallbacks":[]},{"id":"420200","name":"黄石市","province":"420000","provinceName":"湖北省","sha256":"3cfed569e337294b8999152bfc7012768f17ec51ef483bc43d33733cdfd79c4a","regions":[{"id":"420202","name":"黄石港区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"420203","name":"西塞山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420204","name":"下陆区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420205","name":"铁山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420222","name":"阳新县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420281","name":"大冶市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"1fadb0e362ad497dc24eb05d5321d7ef4a3048a71a0a491e9e85b970c3a21045","collisionFallbacks":[]},{"id":"420300","name":"十堰市","province":"420000","provinceName":"湖北省","sha256":"d330d91790da5a6c0422ae34794118994d806836c2c9d1ab814e1400d6c01631","regions":[{"id":"420302","name":"茅箭区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420303","name":"张湾区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420304","name":"郧阳区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420322","name":"郧西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420323","name":"竹山县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"420324","name":"竹溪县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"420325","name":"房县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"420381","name":"丹江口市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"729f63d3ddcac08f43ed4832d4741b9f4d4b4c77a03d00034775adb7647030ed","collisionFallbacks":[]},{"id":"420500","name":"宜昌市","province":"420000","provinceName":"湖北省","sha256":"9a93b662424ca54b59bc909896a6b2e8b379b3c43057f0eaead10840ed82b404","regions":[{"id":"420502","name":"西陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420503","name":"伍家岗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420504","name":"点军区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420505","name":"猇亭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420506","name":"夷陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420525","name":"远安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420526","name":"兴山县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420527","name":"秭归县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420528","name":"长阳土家族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420529","name":"五峰土家族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420581","name":"宜都市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420582","name":"当阳市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420583","name":"枝江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"654344e3c2366f0fe593a9ded4ed471d6bf1272585dd3cd6bfc27ceb2e1fdef9","collisionFallbacks":[]},{"id":"420600","name":"襄阳市","province":"420000","provinceName":"湖北省","sha256":"a29ce069390a080a8e21f4e1744d8cd64d6d4df2eb0e9aa1f37621d62ea4e042","regions":[{"id":"420602","name":"襄城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420606","name":"樊城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420607","name":"襄州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420624","name":"南漳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420625","name":"谷城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420626","name":"保康县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"420682","name":"老河口市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420683","name":"枣阳市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420684","name":"宜城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"28a7ebe4e28c5f88f2ea27aef9b3dace58dac8ac5fe0c5d21bd093ec47f30484","collisionFallbacks":[]},{"id":"420700","name":"鄂州市","province":"420000","provinceName":"湖北省","sha256":"73498e2f0e11b99dd4879d25d38dbe6f027edd4b8a5257e25d7b1bcc41b85363","regions":[{"id":"420702","name":"梁子湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420703","name":"华容区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420704","name":"鄂城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ba9cef69e289aa2e033c2b6dcd8ec2478631df0ef42a01ebb5a7d38613889530","collisionFallbacks":[]},{"id":"420800","name":"荆门市","province":"420000","provinceName":"湖北省","sha256":"9d8f414f41b5c17e35a4398c9d1c56e1a554e8f05520fd5adb2b0cb2a3a67102","regions":[{"id":"420802","name":"东宝区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420804","name":"掇刀区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420822","name":"沙洋县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"420881","name":"钟祥市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420882","name":"京山市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e2a52252ac3bf6a2a211456e2bc64139aa4b90f3aeb9871ad28fa305610a82a8","collisionFallbacks":[]},{"id":"420900","name":"孝感市","province":"420000","provinceName":"湖北省","sha256":"1392461a476a47071a4241fc34773caeb08bd3d71bc397126083090e82ae7e56","regions":[{"id":"420902","name":"孝南区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"420921","name":"孝昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420922","name":"大悟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420923","name":"云梦县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"420981","name":"应城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420982","name":"安陆市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"420984","name":"汉川市","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"22e87c497895f4f517d186923f39843a69b0ed8fb72a611ab120c00b4fe69c7d","collisionFallbacks":[]},{"id":"421000","name":"荆州市","province":"420000","provinceName":"湖北省","sha256":"1a256dd43d7d38c9eb27d3f2ebcc9a134f460cafc6148b4a0a706cce00e87100","regions":[{"id":"421002","name":"沙市区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"421003","name":"荆州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421022","name":"公安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421023","name":"监利市","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"421024","name":"江陵县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"421081","name":"石首市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"421083","name":"洪湖市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"421087","name":"松滋市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f3d8c10210761d906096d738001e0d7b1a3bf701042375d4de0c7e44feb91efd","collisionFallbacks":[]},{"id":"421100","name":"黄冈市","province":"420000","provinceName":"湖北省","sha256":"48714a53487b81869474a30ef20ecd68bde7095472711c56ad63d6a190d4bdb7","regions":[{"id":"421102","name":"黄州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421121","name":"团风县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421122","name":"红安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421123","name":"罗田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421124","name":"英山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421125","name":"浠水县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"421126","name":"蕲春县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421127","name":"黄梅县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421181","name":"麻城市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"421182","name":"武穴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cd36d9a4d9504f9098e5c2d4ecec14bdcffea48803a546a7105ca65ea6f4e500","collisionFallbacks":[]},{"id":"421200","name":"咸宁市","province":"420000","provinceName":"湖北省","sha256":"0b62e51956a5fa08946e754bb20a05a8b51acf1c59ff6a2cc737c4b010a4d560","regions":[{"id":"421202","name":"咸安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421221","name":"嘉鱼县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"421222","name":"通城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421223","name":"崇阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421224","name":"通山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421281","name":"赤壁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e2bc29ca136966f2762628446a07078c0800df0f4c6f804d657a6a1ef0caf336","collisionFallbacks":[]},{"id":"421300","name":"随州市","province":"420000","provinceName":"湖北省","sha256":"a79f1ea0535ce9e69f19757b710245a2d8e959f3d652e0acb3e7d75488d198cd","regions":[{"id":"421303","name":"曾都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"421321","name":"随县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"421381","name":"广水市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d23600453cbac586b3ecc9814d3353fba067aab89514f3f2e47cf79d166a9d90","collisionFallbacks":[]},{"id":"422800","name":"恩施土家族苗族自治州","province":"420000","provinceName":"湖北省","sha256":"e9591ca33847852f7e69809be7ba9d6da020dbc9432098f6a911c030183a1eda","regions":[{"id":"422801","name":"恩施市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"422802","name":"利川市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"422822","name":"建始县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"422823","name":"巴东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"422825","name":"宣恩县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"422826","name":"咸丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"422827","name":"来凤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"422828","name":"鹤峰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"acd9383398b130fcfb4204cbcc222ec3c35368230031d10eb50f44f2424085c0","collisionFallbacks":[]},{"id":"430100","name":"长沙市","province":"430000","provinceName":"湖南省","sha256":"f47f8934db64c5d1c8c8a9eaa8635ba07bd1d4dce67a7beda7306d653954b38c","regions":[{"id":"430102","name":"芙蓉区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430103","name":"天心区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430104","name":"岳麓区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"430105","name":"开福区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430111","name":"雨花区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430112","name":"望城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430121","name":"长沙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430181","name":"浏阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430182","name":"宁乡市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b9af5b8f0dae8c1aa6bafa612165736b57041dd76bb78dd4fa19e59c67454dde","collisionFallbacks":[]},{"id":"430200","name":"株洲市","province":"430000","provinceName":"湖南省","sha256":"c5c986ea9e3c9957888201de6afeb2aafac850ca1302860d09cad48fd7fba900","regions":[{"id":"430202","name":"荷塘区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"430203","name":"芦淞区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430204","name":"石峰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430211","name":"天元区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430212","name":"渌口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430223","name":"攸县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430224","name":"茶陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430225","name":"炎陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430281","name":"醴陵市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b81de2b75f0ab4cc74177845b3dd84fd15739051cb6601f5e07ff96d3dce26bb","collisionFallbacks":[]},{"id":"430300","name":"湘潭市","province":"430000","provinceName":"湖南省","sha256":"6807c3348e70ace86004b27abb419004ad35e7ac88a3720e0098e397c61896d3","regions":[{"id":"430302","name":"雨湖区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"430304","name":"岳塘区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430321","name":"湘潭县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"430381","name":"湘乡市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430382","name":"韶山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"97c567da3b3f6b79ac412a97756683108bf6d7f66d4095bc1dcbe8be4230ea83","collisionFallbacks":[]},{"id":"430400","name":"衡阳市","province":"430000","provinceName":"湖南省","sha256":"344ce6d9c1cb8cfdbeebeb1b39e3b5168e4ac657ed7ff8c7e6147bdb7e83be8d","regions":[{"id":"430405","name":"珠晖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430406","name":"雁峰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430407","name":"石鼓区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430408","name":"蒸湘区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430412","name":"南岳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430421","name":"衡阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430422","name":"衡南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430423","name":"衡山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430424","name":"衡东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430426","name":"祁东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430481","name":"耒阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430482","name":"常宁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d12cb98bb176c406d094048dc4632b48966270dda980fa7aa636c166a043a0bf","collisionFallbacks":[]},{"id":"430500","name":"邵阳市","province":"430000","provinceName":"湖南省","sha256":"692e9f127fd15e066672ec464868b073d60b1ad9cd0927350ad637e851e553e0","regions":[{"id":"430502","name":"双清区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430503","name":"大祥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430511","name":"北塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430522","name":"新邵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430523","name":"邵阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430524","name":"隆回县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430525","name":"洞口县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430527","name":"绥宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430528","name":"新宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430529","name":"城步苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430581","name":"武冈市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430582","name":"邵东市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f8b83f706ba51f1177d7a2fc4ca98388bddf942e28161b702113eddf8ec4f7ca","collisionFallbacks":[]},{"id":"430600","name":"岳阳市","province":"430000","provinceName":"湖南省","sha256":"c718f00f47f5c46bbe4455148d9b993e88a56ac635192615ae450878e4c2094b","regions":[{"id":"430602","name":"岳阳楼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430603","name":"云溪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430611","name":"君山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430621","name":"岳阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430623","name":"华容县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"430624","name":"湘阴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430626","name":"平江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430681","name":"汨罗市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430682","name":"临湘市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"69f65fd41c576173ddcbd07eef1dbcab0e5be356910a2a106f5a6230164d2aeb","collisionFallbacks":[]},{"id":"430700","name":"常德市","province":"430000","provinceName":"湖南省","sha256":"6a2b12ede8a1070b9dd43e3ce6dd061c0b045f9d7c053fe013f07fd7db47d578","regions":[{"id":"430702","name":"武陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430703","name":"鼎城区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"430721","name":"安乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430722","name":"汉寿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430723","name":"澧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430724","name":"临澧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430725","name":"桃源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430726","name":"石门县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430781","name":"津市市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"05c386b60e4d910afc08891e5bc87f5e03fd0a31af3eb5ad89106bf0beb7300e","collisionFallbacks":[]},{"id":"430800","name":"张家界市","province":"430000","provinceName":"湖南省","sha256":"190c56d49eaa8bb3ac473f0e69c3d3916f30a09b72bf56fa72964382f8e9e4c2","regions":[{"id":"430802","name":"永定区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430811","name":"武陵源区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430821","name":"慈利县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430822","name":"桑植县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d90b6d233fc3668216ce1b075fde2a05fda8d3909dd3e738debd1667120b9251","collisionFallbacks":[]},{"id":"430900","name":"益阳市","province":"430000","provinceName":"湖南省","sha256":"6104e83fddffeae3f01c49214d7268763bdf0765e45cc97da42b88f7a9abb946","regions":[{"id":"430902","name":"资阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430903","name":"赫山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430921","name":"南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430922","name":"桃江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430923","name":"安化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"430981","name":"沅江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"754e601b5d8ca9cbd3657f887f2e13f8084762592f4a3e1ac6b5185c08fc52ac","collisionFallbacks":[]},{"id":"431000","name":"郴州市","province":"430000","provinceName":"湖南省","sha256":"ea3759114a01e9192ec7609f370b4d898258e580e3ace8652cedfadced600026","regions":[{"id":"431002","name":"北湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431003","name":"苏仙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431021","name":"桂阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431022","name":"宜章县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431023","name":"永兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431024","name":"嘉禾县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431025","name":"临武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431026","name":"汝城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431027","name":"桂东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431028","name":"安仁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431081","name":"资兴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2fc38957b250e06af2f4f7441e9ea630b398b2789552d0fc350ee511d1ad86f8","collisionFallbacks":[]},{"id":"431100","name":"永州市","province":"430000","provinceName":"湖南省","sha256":"97a274b79a5e5f8c15b4cadb3856edc3109879b4611acf3da6f8e33ffc91fb66","regions":[{"id":"431102","name":"零陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431103","name":"冷水滩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431121","name":"祁阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431122","name":"东安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431123","name":"双牌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431124","name":"道县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431125","name":"江永县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431126","name":"宁远县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"431127","name":"蓝山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431128","name":"新田县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"431129","name":"江华瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9fcf96669cc03d3ed3f4bbbc47b78622c4c0bcf820187ec29b4d25f6bda3f3f7","collisionFallbacks":[]},{"id":"431200","name":"怀化市","province":"430000","provinceName":"湖南省","sha256":"8988c0e3b10693b63562145b9180b94dfef297d1efec12b251a32cb03650c669","regions":[{"id":"431202","name":"鹤城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431221","name":"中方县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431222","name":"沅陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431223","name":"辰溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431224","name":"溆浦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431225","name":"会同县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"431226","name":"麻阳苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431227","name":"新晃侗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431228","name":"芷江侗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431229","name":"靖州苗族侗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431230","name":"通道侗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431281","name":"洪江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8656ba543eccad7fdd6708ed9649be973b8b238b2ea50f528389ae92d6461bda","collisionFallbacks":[]},{"id":"431300","name":"娄底市","province":"430000","provinceName":"湖南省","sha256":"b8272a4ae361e2b85f4cd4fe295e6c6b4b83c48230fb637c680dcc63d538cd67","regions":[{"id":"431302","name":"娄星区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431321","name":"双峰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431322","name":"新化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431381","name":"冷水江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"431382","name":"涟源市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"89a21b1a4fc97607a528ec688d6a49ed2b551846ab692bb1e56e76816abe9e72","collisionFallbacks":[]},{"id":"433100","name":"湘西土家族苗族自治州","province":"430000","provinceName":"湖南省","sha256":"819ce507557c989df8586b53932996f285ff82afb08bc6be3bbac26594802a87","regions":[{"id":"433101","name":"吉首市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433122","name":"泸溪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433123","name":"凤凰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433124","name":"花垣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433125","name":"保靖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433126","name":"古丈县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433127","name":"永顺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"433130","name":"龙山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"07c16e4c0014d408954996ebc6de943728ff123d11c85c680598a4601d050909","collisionFallbacks":[]},{"id":"440100","name":"广州市","province":"440000","provinceName":"广东省","sha256":"c2793000c61b805e1435f5c7282317531ce8a06ac02d9e9a7bb5f1f891522b97","regions":[{"id":"440103","name":"荔湾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440104","name":"越秀区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440105","name":"海珠区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440106","name":"天河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440111","name":"白云区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440112","name":"黄埔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440113","name":"番禺区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440114","name":"花都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440115","name":"南沙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440117","name":"从化区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440118","name":"增城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"02c8a099402400ddb155273a860019bc9e8c994f98a9b6260fb0532a5bcb963b","collisionFallbacks":[]},{"id":"440200","name":"韶关市","province":"440000","provinceName":"广东省","sha256":"de6d4e9aad9e7bfa516d13055cef4aa454f43ca08908dc551863585326e87cd8","regions":[{"id":"440203","name":"武江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440204","name":"浈江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440205","name":"曲江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440222","name":"始兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440224","name":"仁化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440229","name":"翁源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440232","name":"乳源瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440233","name":"新丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440281","name":"乐昌市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440282","name":"南雄市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d9da0eab12a838c47e1ad4e11f43c974affeb1ecb7068059bab1820b2dbd4bce","collisionFallbacks":[]},{"id":"440300","name":"深圳市","province":"440000","provinceName":"广东省","sha256":"e346a6cb0d5c482bf52fd0b845d0cda8c03a6ab666ce310afd3292a4d1899fa8","regions":[{"id":"440303","name":"罗湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440304","name":"福田区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440305","name":"南山区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"440306","name":"宝安区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440307","name":"龙岗区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440308","name":"盐田区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440309","name":"龙华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440310","name":"坪山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440311","name":"光明区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e7819378a80385336a928bf55fbbbbe2f98bfce029f37404035d2fed0f455765","collisionFallbacks":[]},{"id":"440400","name":"珠海市","province":"440000","provinceName":"广东省","sha256":"80f0d1d5141d197b3a96b699876547246491fe8e89d36fd8bb3c93adef3a9193","regions":[{"id":"440402","name":"香洲区","sourceRings":64,"sourceHoles":0,"rings":64,"holes":0,"repairedSourcePolygons":0},{"id":"440403","name":"斗门区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440404","name":"金湾区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"95c6ba4ed7f65d5145604c8541ec0a06f45f133d2f56234a521b3e10e55aad81","collisionFallbacks":[]},{"id":"440500","name":"汕头市","province":"440000","provinceName":"广东省","sha256":"68dd5d4ea5abc5d82edf6af530b0a68b32a99ef32a591395fa990896ed063a39","regions":[{"id":"440507","name":"龙湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440511","name":"金平区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440512","name":"濠江区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440513","name":"潮阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440514","name":"潮南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440515","name":"澄海区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440523","name":"南澳县","sourceRings":18,"sourceHoles":0,"rings":18,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9ad9db99d4aecf5eb40e704dacd0f9be6f1fa0376bb7e51151bcb216e1ed8c7e","collisionFallbacks":[]},{"id":"440600","name":"佛山市","province":"440000","provinceName":"广东省","sha256":"d21e3005fef23b6f37d17ca0a1dbce8bd6c5d9af23241ddb1e4413b2396e1571","regions":[{"id":"440604","name":"禅城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440605","name":"南海区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440606","name":"顺德区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440607","name":"三水区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440608","name":"高明区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8d06a778e96307b6411ddc1ac946c98c0d82ae37cafe95434f0cb3b6be602ddb","collisionFallbacks":[]},{"id":"440700","name":"江门市","province":"440000","provinceName":"广东省","sha256":"f51cc628e45a2d57d0c80bd6a3ae225044bde4a313c466c3d9366660ca566d5c","regions":[{"id":"440703","name":"蓬江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440704","name":"江海区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440705","name":"新会区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440781","name":"台山市","sourceRings":26,"sourceHoles":0,"rings":26,"holes":0,"repairedSourcePolygons":0},{"id":"440783","name":"开平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440784","name":"鹤山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440785","name":"恩平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0e7a5f16fa3e6d25681c38b6c602d00233465f90f053132b00c8203cdd48c08d","collisionFallbacks":[]},{"id":"440800","name":"湛江市","province":"440000","provinceName":"广东省","sha256":"23615a7441811b701cb003d2bfcf443c630870990a36d2e9313d66b27d41ec30","regions":[{"id":"440802","name":"赤坎区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440803","name":"霞山区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440804","name":"坡头区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"440811","name":"麻章区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":2,"repairedSourcePolygons":1},{"id":"440823","name":"遂溪县","sourceRings":1,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":1},{"id":"440825","name":"徐闻县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"440881","name":"廉江市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"440882","name":"雷州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440883","name":"吴川市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"99c5bd2c383458ffcbdad060b40c97bfc426eb5e841e876323cb74dd90bd5d55","collisionFallbacks":[]},{"id":"440900","name":"茂名市","province":"440000","provinceName":"广东省","sha256":"1de54f01930e7d9f8c5a1ceb27d414cf471c218d90e9a053fa84bdcd92314d62","regions":[{"id":"440902","name":"茂南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440904","name":"电白区","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"440981","name":"高州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"440982","name":"化州市","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"440983","name":"信宜市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9deda0b17beac63dddc1124b52540233e948879344a2d9995393b3eb8fee6db6","collisionFallbacks":[]},{"id":"441200","name":"肇庆市","province":"440000","provinceName":"广东省","sha256":"f75a750fd90a814f3a21bc1223f8ae6ff9f25c4af85ff559398527ca8dc5b9d1","regions":[{"id":"441202","name":"端州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441203","name":"鼎湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441204","name":"高要区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"441223","name":"广宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441224","name":"怀集县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441225","name":"封开县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441226","name":"德庆县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"441284","name":"四会市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2f342ff7a3c3c2b898ab3c42ba1103c4dfef6fcd4287934cf4232b1b6716d0da","collisionFallbacks":[]},{"id":"441300","name":"惠州市","province":"440000","provinceName":"广东省","sha256":"705304972431a837f31195ba7651f9905a36ef24a58329c9f5c22ede68d43319","regions":[{"id":"441302","name":"惠城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441303","name":"惠阳区","sourceRings":23,"sourceHoles":0,"rings":23,"holes":0,"repairedSourcePolygons":0},{"id":"441322","name":"博罗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441323","name":"惠东县","sourceRings":7,"sourceHoles":0,"rings":7,"holes":0,"repairedSourcePolygons":0},{"id":"441324","name":"龙门县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b49e4a2be2abdfdf4f5a8b01b38d7c99065c0bafb754c042a0cab3138062865c","collisionFallbacks":[]},{"id":"441400","name":"梅州市","province":"440000","provinceName":"广东省","sha256":"c29bd43f4aa4eb5918ba6eba2a356156083af2369238c495e0248ce25beec372","regions":[{"id":"441402","name":"梅江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441403","name":"梅县区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441422","name":"大埔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441423","name":"丰顺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441424","name":"五华县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441426","name":"平远县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441427","name":"蕉岭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441481","name":"兴宁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"db7781cf6a2b4c49eddd8e3fe1c55c30cbe271cfcb183226d95e35790af6704e","collisionFallbacks":[]},{"id":"441500","name":"汕尾市","province":"440000","provinceName":"广东省","sha256":"637156fcf038e6392e311a9ac8ae3967c9cd731282d41b4e202305a48ebd5afe","regions":[{"id":"441502","name":"城区","sourceRings":9,"sourceHoles":0,"rings":9,"holes":0,"repairedSourcePolygons":0},{"id":"441521","name":"海丰县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"441523","name":"陆河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441581","name":"陆丰市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7667b2511af30033e75c5db7b4cbcad7fa2a1a92a65b26e50bfdfbb013457fe4","collisionFallbacks":[]},{"id":"441600","name":"河源市","province":"440000","provinceName":"广东省","sha256":"09553b543816546c5dcb78bec085ca4782d980c8fe16be714f34a10bd57c2ad0","regions":[{"id":"441602","name":"源城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441621","name":"紫金县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441622","name":"龙川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441623","name":"连平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441624","name":"和平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441625","name":"东源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0695ccecbc6ecf8714673c8de4ba8e1a7dff560166d09b64bd3d64a4f68ba729","collisionFallbacks":[]},{"id":"441700","name":"阳江市","province":"440000","provinceName":"广东省","sha256":"80cc6048c71ba2f1c309aaafe625f0cdef3afb7d7ab38a2fd55a032da4d4f7f7","regions":[{"id":"441702","name":"江城区","sourceRings":10,"sourceHoles":0,"rings":10,"holes":0,"repairedSourcePolygons":0},{"id":"441704","name":"阳东区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"441721","name":"阳西县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"441781","name":"阳春市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"552e95f9290f672be25d4201d84f146c134cf3bb7f9d93a1c6e63db5099764b2","collisionFallbacks":[]},{"id":"441800","name":"清远市","province":"440000","provinceName":"广东省","sha256":"ac9dcdf20f8b2957b7616c9a69bc592cd862db72ce688262009d81e3098b38b0","regions":[{"id":"441802","name":"清城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441803","name":"清新区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441821","name":"佛冈县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441823","name":"阳山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441825","name":"连山壮族瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441826","name":"连南瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441881","name":"英德市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"441882","name":"连州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"674e31521ed48ecdca7b502a63665df0e30d7fa422b11da3b4bfd92320a8359f","collisionFallbacks":[]},{"id":"445100","name":"潮州市","province":"440000","provinceName":"广东省","sha256":"07b8581142ec0b83a63107224448c0b0d53e5c7ee00286860925f5902a414b1e","regions":[{"id":"445102","name":"湘桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445103","name":"潮安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445122","name":"饶平县","sourceRings":8,"sourceHoles":0,"rings":8,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"69db40ea0ddf6db91110b7621f4a0b3217764840281dcc89eff2bfef9a841dc8","collisionFallbacks":[]},{"id":"445200","name":"揭阳市","province":"440000","provinceName":"广东省","sha256":"894624dc613c61cb2b8f1dcf729bd2f62649cd9dd988b62278506a35dfeb5e9b","regions":[{"id":"445202","name":"榕城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445203","name":"揭东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445222","name":"揭西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445224","name":"惠来县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"445281","name":"普宁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0ce21f9cb1654f2d05a1237e914899bd327555a5e770f159addb43d1314318e5","collisionFallbacks":[]},{"id":"445300","name":"云浮市","province":"440000","provinceName":"广东省","sha256":"a4fb0a141da2fadadfde02d243941b6de854661f477d82b3c71936cee682955d","regions":[{"id":"445302","name":"云城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445303","name":"云安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445321","name":"新兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445322","name":"郁南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"445381","name":"罗定市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"06dbf309971043f12ad1868771c4d6d13608bae1830fe9321d91729ec204ae38","collisionFallbacks":[]},{"id":"450100","name":"南宁市","province":"450000","provinceName":"广西壮族自治区","sha256":"b414b9d77dec0379cb8b6aae9ae4bac43b1c15f680990c65035273a4b9291b61","regions":[{"id":"450102","name":"兴宁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450103","name":"青秀区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450105","name":"江南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450107","name":"西乡塘区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"450108","name":"良庆区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450109","name":"邕宁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450110","name":"武鸣区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450123","name":"隆安县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"450124","name":"马山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450125","name":"上林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450126","name":"宾阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450127","name":"横州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bb131dcd13fee68e5d2549e7cd9e36f198aeb8b0a703dda8a55e19c9deac47be","collisionFallbacks":[]},{"id":"450200","name":"柳州市","province":"450000","provinceName":"广西壮族自治区","sha256":"980d57680a0e2f1985b78840efdd1ad5cfe0f4dadc86c4c19b17defd0218be56","regions":[{"id":"450202","name":"城中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450203","name":"鱼峰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450204","name":"柳南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450205","name":"柳北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450206","name":"柳江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450222","name":"柳城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450223","name":"鹿寨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450224","name":"融安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450225","name":"融水苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450226","name":"三江侗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4fa60767c25255c76d4ebf15a83d43e5b16d07cea4bc52925d911794790b5933","collisionFallbacks":[]},{"id":"450300","name":"桂林市","province":"450000","provinceName":"广西壮族自治区","sha256":"576809eb06789811b2cdcf84a86074bc3433d25ca99e381af62cb6d110c9b542","regions":[{"id":"450302","name":"秀峰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450303","name":"叠彩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450304","name":"象山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450305","name":"七星区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450311","name":"雁山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450312","name":"临桂区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450321","name":"阳朔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450323","name":"灵川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450324","name":"全州县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450325","name":"兴安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450326","name":"永福县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450327","name":"灌阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450328","name":"龙胜各族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450329","name":"资源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450330","name":"平乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450332","name":"恭城瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450381","name":"荔浦市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bef42993b22577c5c31b0424d85d7b5ab3878787b0da6a39f742c1d6d927242a","collisionFallbacks":[]},{"id":"450400","name":"梧州市","province":"450000","provinceName":"广西壮族自治区","sha256":"71feff288dd9c412701f2b94ff7b6c3c6eecc33627752f88c7f31b017d943d20","regions":[{"id":"450403","name":"万秀区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450405","name":"长洲区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450406","name":"龙圩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450421","name":"苍梧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450422","name":"藤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450423","name":"蒙山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450481","name":"岑溪市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"02efa27ad282de207f80764f5be2fabf1f15d1662938f1b481e2514d68589c02","collisionFallbacks":[]},{"id":"450500","name":"北海市","province":"450000","provinceName":"广西壮族自治区","sha256":"52a296b0a88c9c1fa39c8c110f48b76b25a6b1a0b0b8ce8b9bd0f455519f259d","regions":[{"id":"450502","name":"海城区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"450503","name":"银海区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450512","name":"铁山港区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450521","name":"合浦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"12df5ff414166465a6a14b018f22717a9d95c9d647e6a68107c4ca790265a24b","collisionFallbacks":[]},{"id":"450600","name":"防城港市","province":"450000","provinceName":"广西壮族自治区","sha256":"3bd132caad8eba31418dc75b06d475c69603615dcb64aa545fe3107b3347c4fe","regions":[{"id":"450602","name":"港口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450603","name":"防城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450621","name":"上思县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450681","name":"东兴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"91bd3c4d6f1341aec53b7e67ec975d8587056796797cc86e74ef0193ab337ca6","collisionFallbacks":[]},{"id":"450700","name":"钦州市","province":"450000","provinceName":"广西壮族自治区","sha256":"8fe555046205a26ea84c4b45d4f13b564b4f235b1001a90d6e799d7edf1a8b87","regions":[{"id":"450702","name":"钦南区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"450703","name":"钦北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450721","name":"灵山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450722","name":"浦北县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d64e118c9532f970924c8ba75c03f38d9ad267013bfafe6f3da4123957883eb4","collisionFallbacks":[]},{"id":"450800","name":"贵港市","province":"450000","provinceName":"广西壮族自治区","sha256":"e4169aabd2b7df3b2ee5df862d932e4188a890e60c760ebe197c74c95852bc28","regions":[{"id":"450802","name":"港北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450803","name":"港南区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450804","name":"覃塘区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450821","name":"平南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450881","name":"桂平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e52b2d1f164b5d47619687a366e9ccc6f79782da38e31b7e8398eac934c81177","collisionFallbacks":[]},{"id":"450900","name":"玉林市","province":"450000","provinceName":"广西壮族自治区","sha256":"86b0aca2307f2678ba0fefa49a0cb9454b9d4495bc0f6414ccbf406538722197","regions":[{"id":"450902","name":"玉州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450903","name":"福绵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450921","name":"容县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450922","name":"陆川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450923","name":"博白县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450924","name":"兴业县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"450981","name":"北流市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b34796290270a114b52c733ac3e86d820c25b64c6225f80ba7b7dfbb0e421275","collisionFallbacks":[]},{"id":"451000","name":"百色市","province":"450000","provinceName":"广西壮族自治区","sha256":"9923c8d586f3021b0a271ad892fe6be9961d41e05910570fb139f8c7404e6a62","regions":[{"id":"451002","name":"右江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451003","name":"田阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451022","name":"田东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451024","name":"德保县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451026","name":"那坡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451027","name":"凌云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451028","name":"乐业县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451029","name":"田林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451030","name":"西林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451031","name":"隆林各族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"451081","name":"靖西市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451082","name":"平果市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e00fd38d1f3ed75c55147b9d13490cd1a57396478cfbb70ec8b880995eb363c3","collisionFallbacks":[]},{"id":"451100","name":"贺州市","province":"450000","provinceName":"广西壮族自治区","sha256":"2e8c488b58ed61c17f225fea46ed053ab70cbc09c6d4b1549d1fb3b0596cc52a","regions":[{"id":"451102","name":"八步区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451103","name":"平桂区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451121","name":"昭平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451122","name":"钟山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451123","name":"富川瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b795044c9070ba2bfd45a593726a6112c58c841bd2261ddefe4106bad8346d10","collisionFallbacks":[]},{"id":"451200","name":"河池市","province":"450000","provinceName":"广西壮族自治区","sha256":"426f5621f0c5c529f375a602fd6cf025c3ae62171cedfaa809d134b64118efc5","regions":[{"id":"451202","name":"金城江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451203","name":"宜州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451221","name":"南丹县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451222","name":"天峨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451223","name":"凤山县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"451224","name":"东兰县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"451225","name":"罗城仫佬族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451226","name":"环江毛南族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451227","name":"巴马瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451228","name":"都安瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451229","name":"大化瑶族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f0aab44c9445a7bc7857c1434ce3b6e10d3719cacd9163d024c59128089b4301","collisionFallbacks":[]},{"id":"451300","name":"来宾市","province":"450000","provinceName":"广西壮族自治区","sha256":"ee6d75253496c981720ea2e863e55adbcc5e9400f736665055679ae34189e949","regions":[{"id":"451302","name":"兴宾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451321","name":"忻城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451322","name":"象州县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451323","name":"武宣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451324","name":"金秀瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451381","name":"合山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bf7ba7ede60d97100fbe2a517b43c8914ba1057fec8e8df892e5374cf97ada02","collisionFallbacks":[]},{"id":"451400","name":"崇左市","province":"450000","provinceName":"广西壮族自治区","sha256":"5937303202b368d15d98e8f8e77dfee7ce829d74887c5fd302a74b385c9217d5","regions":[{"id":"451402","name":"江州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451421","name":"扶绥县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451422","name":"宁明县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451423","name":"龙州县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451424","name":"大新县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451425","name":"天等县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"451481","name":"凭祥市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f7363e97558a291e42c3f03e96b99b073a83a3c77760b65ebf53064919b9f1c9","collisionFallbacks":[]},{"id":"460100","name":"海口市","province":"460000","provinceName":"海南省","sha256":"b6acd61c6633882dc0dcb31786e3ea96e59d5e9f94cd8da81f8ae7b5da3317e6","regions":[{"id":"460105","name":"秀英区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"460106","name":"龙华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"460107","name":"琼山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"460108","name":"美兰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a7388fe3517dc610a6c254b1617fa4703e50685c6eed82e7cd300bcfd564988a","collisionFallbacks":[]},{"id":"460200","name":"三亚市","province":"460000","provinceName":"海南省","sha256":"43582b50fa3943c9e3c1a9fc5ee99020db96c70c117d1741e6ec69c72b6e566d","regions":[{"id":"460202","name":"海棠区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"460203","name":"吉阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"460204","name":"天涯区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"460205","name":"崖州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e5dd8dbbbbd0658938b38e96d560426f7f12c5bee7a6f587b7f013da2bc9654e","collisionFallbacks":[]},{"id":"460300","name":"三沙市","province":"460000","provinceName":"海南省","sha256":"65c171226c7198498ea4ede4eb39825f0cb74e3af05cb83869bc82d66a6a6e22","regions":[{"id":"460301","name":"西沙区","sourceRings":28,"sourceHoles":0,"rings":28,"holes":0,"repairedSourcePolygons":0},{"id":"460302","name":"南沙区","sourceRings":84,"sourceHoles":0,"rings":84,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4cdebd0268280b36ed191a84ac80d754b2db68dd45fbc56eee88f44ecfa70b5e","collisionFallbacks":[]},{"id":"510100","name":"成都市","province":"510000","provinceName":"四川省","sha256":"e5a5f52b38c8b073805da73bac7adad362ecc66d9f64a790aef20d6ec00cd9e1","regions":[{"id":"510104","name":"锦江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510105","name":"青羊区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510106","name":"金牛区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510107","name":"武侯区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510108","name":"成华区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510112","name":"龙泉驿区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510113","name":"青白江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510114","name":"新都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510115","name":"温江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510116","name":"双流区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510117","name":"郫都区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510118","name":"新津区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510121","name":"金堂县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510129","name":"大邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510131","name":"蒲江县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510181","name":"都江堰市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510182","name":"彭州市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510183","name":"邛崃市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510184","name":"崇州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510185","name":"简阳市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"241a09da447bf701e24e2e8adb4d59ef1c83e71840240256a3012a7588276943","collisionFallbacks":[]},{"id":"510300","name":"自贡市","province":"510000","provinceName":"四川省","sha256":"78cba41f9e8ca8924ba031390f67d7a28331bdb7a1518294710a6e336deeae04","regions":[{"id":"510302","name":"自流井区","sourceRings":11,"sourceHoles":0,"rings":11,"holes":0,"repairedSourcePolygons":0},{"id":"510303","name":"贡井区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"510304","name":"大安区","sourceRings":12,"sourceHoles":0,"rings":12,"holes":0,"repairedSourcePolygons":0},{"id":"510311","name":"沿滩区","sourceRings":12,"sourceHoles":0,"rings":12,"holes":0,"repairedSourcePolygons":0},{"id":"510321","name":"荣县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"510322","name":"富顺县","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3e7c1a61d995ac3348d37e76c8ffaf237cf3ebf9c899d8efa994b64183ff4408","collisionFallbacks":[]},{"id":"510400","name":"攀枝花市","province":"510000","provinceName":"四川省","sha256":"5aa6eeddf72dc41ea2832a1fa22f3ade9bfdd20ffa5bd61629e2b737e26a8980","regions":[{"id":"510402","name":"东区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510403","name":"西区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"510411","name":"仁和区","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"510421","name":"米易县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510422","name":"盐边县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3a66467968bd1188de502cfd98b2f1934403758a2382320a84a2d859652da6b1","collisionFallbacks":[]},{"id":"510500","name":"泸州市","province":"510000","provinceName":"四川省","sha256":"b9e723b10b8ae6f935773d37f614cc77746c842bd63db02052309ba42f5baf69","regions":[{"id":"510502","name":"江阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510503","name":"纳溪区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510504","name":"龙马潭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510521","name":"泸县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510522","name":"合江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510524","name":"叙永县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510525","name":"古蔺县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a2ec23b28a28ba6410e2009ab4cc91781ccfa73701650cf49bb380df8ce763e9","collisionFallbacks":[]},{"id":"510600","name":"德阳市","province":"510000","provinceName":"四川省","sha256":"80158cf83e656ec07e9d13931956cb98feeaf9488ebc3cba00ea7c30d55fc716","regions":[{"id":"510603","name":"旌阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510604","name":"罗江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510623","name":"中江县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"510681","name":"广汉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510682","name":"什邡市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510683","name":"绵竹市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a300b8cd1e142407abc4e122cf58fbc35bc73acee3a5d1bf3ec3c6f9fbb2c40d","collisionFallbacks":[]},{"id":"510700","name":"绵阳市","province":"510000","provinceName":"四川省","sha256":"76268cf19162eac2cf6ee85ac6c9da9f3a36d95d572e7fdbf9c7359aedda40fd","regions":[{"id":"510703","name":"涪城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510704","name":"游仙区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510705","name":"安州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510722","name":"三台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510723","name":"盐亭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510725","name":"梓潼县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510726","name":"北川羌族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510727","name":"平武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510781","name":"江油市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"66c11a5b3356a12830009438a134aaa13f7f745717eabac627e3f93e96a4cdf4","collisionFallbacks":[]},{"id":"510800","name":"广元市","province":"510000","provinceName":"四川省","sha256":"fb662ae19d90e7eb6e910050d8e934df57450d4c8b0769e3ad2adb4162c7022e","regions":[{"id":"510802","name":"利州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510811","name":"昭化区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510812","name":"朝天区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510821","name":"旺苍县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510822","name":"青川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510823","name":"剑阁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"510824","name":"苍溪县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"34a3c8cc99f07fca7064fd900be48f7da78d17ac841ee6af061cde6c6530963b","collisionFallbacks":[]},{"id":"510900","name":"遂宁市","province":"510000","provinceName":"四川省","sha256":"cf255d319d8c10f6f9bda28872cb98e29828e68bcf48766f4a626b8c91ccd7e7","regions":[{"id":"510903","name":"船山区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510904","name":"安居区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"510921","name":"蓬溪县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"510923","name":"大英县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"510981","name":"射洪市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"51167a875fd8beb66df777d172038a318d0e5f58a099fceeeceea062daff2652","collisionFallbacks":[]},{"id":"511000","name":"内江市","province":"510000","provinceName":"四川省","sha256":"e74cfe2915c9660de6500210c6072f594c355818e076ef6858851f30dbd8cab8","regions":[{"id":"511002","name":"市中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511011","name":"东兴区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"511024","name":"威远县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511025","name":"资中县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"511083","name":"隆昌市","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ccc6195e30ca599e4022ef13da2fa9b6b8e4e7108f3b09dba8f862bebf2b3dc3","collisionFallbacks":[]},{"id":"511100","name":"乐山市","province":"510000","provinceName":"四川省","sha256":"49a23c954e26301915726d50a06b21d6353309bb51f6d6330efb4631001a8158","regions":[{"id":"511102","name":"市中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511111","name":"沙湾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511112","name":"五通桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511113","name":"金口河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511123","name":"犍为县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"511124","name":"井研县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511126","name":"夹江县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511129","name":"沐川县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511132","name":"峨边彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511133","name":"马边彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511181","name":"峨眉山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ec5793c27f3e2a9e9476f84e426b8e49482ea4003ebd83f7bba9d8d3b60c7210","collisionFallbacks":[]},{"id":"511300","name":"南充市","province":"510000","provinceName":"四川省","sha256":"856bd12d34c7dd4394999a125af3a378d2dd41d8c3354589375af657c5d452e1","regions":[{"id":"511302","name":"顺庆区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511303","name":"高坪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511304","name":"嘉陵区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"511321","name":"南部县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511322","name":"营山县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511323","name":"蓬安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511324","name":"仪陇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511325","name":"西充县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511381","name":"阆中市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ac6a3a2da0b8a9ab01eebb8fdcd63cc9c778d8366e8b0787bf23feb597aaf407","collisionFallbacks":[]},{"id":"511400","name":"眉山市","province":"510000","provinceName":"四川省","sha256":"80555687b4465206ebc6a539587f8e88ec9e3431b961419fc63088345085df36","regions":[{"id":"511402","name":"东坡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511403","name":"彭山区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"511421","name":"仁寿县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511423","name":"洪雅县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511424","name":"丹棱县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511425","name":"青神县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"18618dcd72027ee697cc74caefa3d430fdbaedfe53e94737a2a43cef6d99abb6","collisionFallbacks":[]},{"id":"511500","name":"宜宾市","province":"510000","provinceName":"四川省","sha256":"9b0f502e38872fe7fbf4df5e77630f5064dc38bf58597540b28dd7231e6d18fe","regions":[{"id":"511502","name":"翠屏区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511503","name":"南溪区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511504","name":"叙州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511523","name":"江安县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"511524","name":"长宁县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"511525","name":"高县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511526","name":"珙县","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"511527","name":"筠连县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511528","name":"兴文县","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"511529","name":"屏山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9fca1c8c3222d16b9cde1e8aeaa290c7a68654003b6240d3a9a7ebc5a367c247","collisionFallbacks":[]},{"id":"511600","name":"广安市","province":"510000","provinceName":"四川省","sha256":"df064742927661e6c329b7a865f6933cbb91751b26b3ffe75f0c2f3de01d704e","regions":[{"id":"511602","name":"广安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511603","name":"前锋区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511621","name":"岳池县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511622","name":"武胜县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511623","name":"邻水县","sourceRings":12,"sourceHoles":0,"rings":12,"holes":0,"repairedSourcePolygons":0},{"id":"511681","name":"华蓥市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f6893f2b7469072614e33bb68cdcb144a818ab61ba7f3cbc5ae7f05845aff070","collisionFallbacks":[]},{"id":"511700","name":"达州市","province":"510000","provinceName":"四川省","sha256":"90a7ee8e5eda19a72ec269453e224fcd0c2df5153c9100475b1c00af6ed8181a","regions":[{"id":"511702","name":"通川区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511703","name":"达川区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511722","name":"宣汉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511723","name":"开江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511724","name":"大竹县","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"511725","name":"渠县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511781","name":"万源市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"eee388fb64e366bb8cfd869e2ab25fb9c3ca700eade098c35f0c4d4ba5347e1c","collisionFallbacks":[]},{"id":"511800","name":"雅安市","province":"510000","provinceName":"四川省","sha256":"f7bb06f107b3948c3e1c40404da9b7fcdfdcffe35c3c1102c3db05a468e414ae","regions":[{"id":"511802","name":"雨城区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"511803","name":"名山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511822","name":"荥经县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511823","name":"汉源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511824","name":"石棉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511825","name":"天全县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511826","name":"芦山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511827","name":"宝兴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"057d898bc19f56e8fd4490726ccb240c5a93acccb4d00df6ae971a5db1235f00","collisionFallbacks":[]},{"id":"511900","name":"巴中市","province":"510000","provinceName":"四川省","sha256":"1d8a22427010daff8a137967ce4109f0ce5d242981b44df8b9a89e9367a73101","regions":[{"id":"511902","name":"巴州区","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"511903","name":"恩阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"511921","name":"通江县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"511922","name":"南江县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"511923","name":"平昌县","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b3d51c21ea4b71ea921d77392dfcaf8115ee0fabf5b76d83f933f88192e6e87d","collisionFallbacks":[]},{"id":"512000","name":"资阳市","province":"510000","provinceName":"四川省","sha256":"500c9c44476ff7f7838ddd98b4ede7acb1f9e754b4bf97eb3c1f9745e8d6de49","regions":[{"id":"512002","name":"雁江区","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"512021","name":"安岳县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"512022","name":"乐至县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d5a25a7dc4169b277fc7a4e7f5a5d0556e330f3cf90c9b7dd77b1ffc51b32aea","collisionFallbacks":[]},{"id":"513200","name":"阿坝藏族羌族自治州","province":"510000","provinceName":"四川省","sha256":"a98c50c6af840d4029279c86c224fb7bb19809557506bed12de673a09d176b63","regions":[{"id":"513201","name":"马尔康市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513221","name":"汶川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513222","name":"理县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513223","name":"茂县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513224","name":"松潘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513225","name":"九寨沟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513226","name":"金川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513227","name":"小金县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513228","name":"黑水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513230","name":"壤塘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513231","name":"阿坝县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513232","name":"若尔盖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513233","name":"红原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"efddaf740257c566109c9144d2aa8b957181e1c214bca4bb92cefb53806190f3","collisionFallbacks":[]},{"id":"513300","name":"甘孜藏族自治州","province":"510000","provinceName":"四川省","sha256":"c9473a4726ab6253976c83f8ba6aaca665276c44fcd9d5f68f976f9a8613fc1a","regions":[{"id":"513301","name":"康定市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513322","name":"泸定县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513323","name":"丹巴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513324","name":"九龙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513325","name":"雅江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513326","name":"道孚县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513327","name":"炉霍县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513328","name":"甘孜县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513329","name":"新龙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513330","name":"德格县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513331","name":"白玉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513332","name":"石渠县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513333","name":"色达县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513334","name":"理塘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513335","name":"巴塘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513336","name":"乡城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513337","name":"稻城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513338","name":"得荣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a7aee65954a2bb6c866cf2eb3364c441de19a45d215078a11acde83e13a1421e","collisionFallbacks":[]},{"id":"513400","name":"凉山彝族自治州","province":"510000","provinceName":"四川省","sha256":"4588ed5e240618a7bbd69ced63d45506b6e07e3707266ea37b546702bf3e3c3e","regions":[{"id":"513401","name":"西昌市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513422","name":"木里藏族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513423","name":"盐源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513424","name":"德昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513425","name":"会理市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"513426","name":"会东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513427","name":"宁南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513428","name":"普格县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513429","name":"布拖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513430","name":"金阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513431","name":"昭觉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513432","name":"喜德县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"513433","name":"冕宁县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"513434","name":"越西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513435","name":"甘洛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513436","name":"美姑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"513437","name":"雷波县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b68a08021c7e03cf6793ad1a9fa107e1f69436b78eda02023fdbfe5792467345","collisionFallbacks":[]},{"id":"520100","name":"贵阳市","province":"520000","provinceName":"贵州省","sha256":"5c4a19cb6cb5d44d344451c33fb2126bc9cf325839a04d7c8a0131bfc659a045","regions":[{"id":"520102","name":"南明区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520103","name":"云岩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520111","name":"花溪区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520112","name":"乌当区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520113","name":"白云区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520115","name":"观山湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520121","name":"开阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520122","name":"息烽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520123","name":"修文县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520181","name":"清镇市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0b3f79b5cab0134a6a353ea4c4657e3b8b117dbbce49a184cd9a42fdfd796a8c","collisionFallbacks":[]},{"id":"520200","name":"六盘水市","province":"520000","provinceName":"贵州省","sha256":"586fe76b587b96492b0220b736f62e28a02040a55428f5e6bb645a1fc5f5c54f","regions":[{"id":"520201","name":"钟山区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"520203","name":"六枝特区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520221","name":"水城区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"520281","name":"盘州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0b369f90f4fc2ee72ab5132e77cfaa6185275631253c61c1fcc5c5b625a7e571","collisionFallbacks":[]},{"id":"520300","name":"遵义市","province":"520000","provinceName":"贵州省","sha256":"4dd0f0b3125173df4602cc4f75bcbfca7bb5df53a475651f6e7319c0019bf841","regions":[{"id":"520302","name":"红花岗区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520303","name":"汇川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520304","name":"播州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520322","name":"桐梓县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520323","name":"绥阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520324","name":"正安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520325","name":"道真仡佬族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520326","name":"务川仡佬族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520327","name":"凤冈县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520328","name":"湄潭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520329","name":"余庆县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"520330","name":"习水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520381","name":"赤水市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520382","name":"仁怀市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cbb09d309d82e0be7ad895aff98e2c1b7de8d2f79e7f370c2e2857d4c7ce156a","collisionFallbacks":[]},{"id":"520400","name":"安顺市","province":"520000","provinceName":"贵州省","sha256":"f89a0b89a65e6a39a4a19ef5bf478ae9183ac22345cd64a756aa2c6e5421e8d2","regions":[{"id":"520402","name":"西秀区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"520403","name":"平坝区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520422","name":"普定县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520423","name":"镇宁布依族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520424","name":"关岭布依族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520425","name":"紫云苗族布依族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a6154c27966860961751a665555c3b6ab6618976da61449fba612f17d419643c","collisionFallbacks":[]},{"id":"520500","name":"毕节市","province":"520000","provinceName":"贵州省","sha256":"7ecd2741c5210eeb44f7f6f984833826518dd5e2a3e62cbb58828dc1d52c2ea2","regions":[{"id":"520502","name":"七星关区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520521","name":"大方县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520522","name":"黔西市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"520523","name":"金沙县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"520524","name":"织金县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520525","name":"纳雍县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520526","name":"威宁彝族回族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520527","name":"赫章县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f083eb870a554d9782461b08f41721fc41cd51d6841762b646d38e12ed2493b5","collisionFallbacks":[]},{"id":"520600","name":"铜仁市","province":"520000","provinceName":"贵州省","sha256":"0464bcdd5fb65c60cb6a274ce58b3e746b8a3ff6fe8a9e72646c98201773af22","regions":[{"id":"520602","name":"碧江区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520603","name":"万山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520621","name":"江口县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520622","name":"玉屏侗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520623","name":"石阡县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"520624","name":"思南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520625","name":"印江土家族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520626","name":"德江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520627","name":"沿河土家族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"520628","name":"松桃苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"aa6bb49285abe882e10c44ef90de2e32c6ca82f97247973627d20f92bd33a15a","collisionFallbacks":[]},{"id":"522300","name":"黔西南布依族苗族自治州","province":"520000","provinceName":"贵州省","sha256":"ab757d89d4063f397d3224e399edf26e8074c6c93b6ddc9198e0d12d4fa0f1cb","regions":[{"id":"522301","name":"兴义市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522302","name":"兴仁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522323","name":"普安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522324","name":"晴隆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522325","name":"贞丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522326","name":"望谟县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522327","name":"册亨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522328","name":"安龙县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"1d28d97932bc301d7211ce267945c75f7a20d90bfa094043d149f4770afa5b37","collisionFallbacks":[]},{"id":"522600","name":"黔东南苗族侗族自治州","province":"520000","provinceName":"贵州省","sha256":"e463875598a7d6867b3d3f050721c0a50bb1e6b6fa40756971895a9110cfc070","regions":[{"id":"522601","name":"凯里市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522622","name":"黄平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522623","name":"施秉县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"522624","name":"三穗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522625","name":"镇远县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522626","name":"岑巩县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522627","name":"天柱县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"522628","name":"锦屏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522629","name":"剑河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522630","name":"台江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522631","name":"黎平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522632","name":"榕江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522633","name":"从江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522634","name":"雷山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522635","name":"麻江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522636","name":"丹寨县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"54d79751e08d3064fa1839c41281f52b5e63e07b6ef89229f6782d187c61c8b7","collisionFallbacks":[]},{"id":"522700","name":"黔南布依族苗族自治州","province":"520000","provinceName":"贵州省","sha256":"9e3f6a6e2a01fd0a74399b9079b1777d1be5995d32c65dd4be4c3cb173c69775","regions":[{"id":"522701","name":"都匀市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522702","name":"福泉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522722","name":"荔波县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522723","name":"贵定县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522725","name":"瓮安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522726","name":"独山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522727","name":"平塘县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522728","name":"罗甸县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522729","name":"长顺县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"522730","name":"龙里县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522731","name":"惠水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"522732","name":"三都水族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5cb8b8fd36edf17da5b9d558399f021ceecd393d4090614e4eca352eb844a899","collisionFallbacks":[]},{"id":"530100","name":"昆明市","province":"530000","provinceName":"云南省","sha256":"690b3c71ce619225e2672ba388d4c1d618235d14bcb96cf3705b830a544977a8","regions":[{"id":"530102","name":"五华区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"530103","name":"盘龙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530111","name":"官渡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530112","name":"西山区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"530113","name":"东川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530114","name":"呈贡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530115","name":"晋宁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530124","name":"富民县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"530125","name":"宜良县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530126","name":"石林彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530127","name":"嵩明县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530128","name":"禄劝彝族苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530129","name":"寻甸回族彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530181","name":"安宁市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3e7a57549ce97927e7a4ebca56f59a1140e6842454b1c4d118e91ade9cbf0b7d","collisionFallbacks":[]},{"id":"530300","name":"曲靖市","province":"530000","provinceName":"云南省","sha256":"bd37926aa632521f63b733fdf572e5988633444b7fc493cf4dd27dfc7bbfe470","regions":[{"id":"530302","name":"麒麟区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530303","name":"沾益区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530304","name":"马龙区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530322","name":"陆良县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530323","name":"师宗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530324","name":"罗平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530325","name":"富源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530326","name":"会泽县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"530381","name":"宣威市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2150175f518e9a21373f4032f5bf28e0ff532b2efe2506c4796b30612f8f567c","collisionFallbacks":[]},{"id":"530400","name":"玉溪市","province":"530000","provinceName":"云南省","sha256":"63dd61afbc25244b395f43b8295aa12f6917c828fb579cbd2dc698092452fd2f","regions":[{"id":"530402","name":"红塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530403","name":"江川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530423","name":"通海县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530424","name":"华宁县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"530425","name":"易门县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530426","name":"峨山彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530427","name":"新平彝族傣族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530428","name":"元江哈尼族彝族傣族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530481","name":"澄江市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7d451dc6138ce6516af4c807dc298d66dc959d9f68fc5ca37fb0482ad62d3535","collisionFallbacks":[]},{"id":"530500","name":"保山市","province":"530000","provinceName":"云南省","sha256":"82e5b9ff3c8f252338706813e6d3eeaee6c59ccea2328028b0d4b46d7238ba72","regions":[{"id":"530502","name":"隆阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530521","name":"施甸县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530523","name":"龙陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530524","name":"昌宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530581","name":"腾冲市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"998c18e29e02ee73213a03b8b2d8d2dd781319ed8498e8daed65b222b52bdde5","collisionFallbacks":[]},{"id":"530600","name":"昭通市","province":"530000","provinceName":"云南省","sha256":"b25e33cec38572f76eb08858ff54218b51442a9323032c705489d866f079ffca","regions":[{"id":"530602","name":"昭阳区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530621","name":"鲁甸县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530622","name":"巧家县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"530623","name":"盐津县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530624","name":"大关县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530625","name":"永善县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530626","name":"绥江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530627","name":"镇雄县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530628","name":"彝良县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530629","name":"威信县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530681","name":"水富市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3006c90c6d1d1871aacf5965b75da30ad5cb1625c3d573f6646a1ccd4951090b","collisionFallbacks":[]},{"id":"530700","name":"丽江市","province":"530000","provinceName":"云南省","sha256":"ab090e9493e6bcdeaef9638be2d9a7e25e85d89871045fc2e6343c7e6c602de6","regions":[{"id":"530702","name":"古城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530721","name":"玉龙纳西族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530722","name":"永胜县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"530723","name":"华坪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530724","name":"宁蒗彝族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d4f627c85f043a294dac0f63e3c349ad61b12f3efd585560bd86f90729cdbabb","collisionFallbacks":[]},{"id":"530800","name":"普洱市","province":"530000","provinceName":"云南省","sha256":"655eefdde2ad351d0aefe2cfd6772a827bfe2291286a983f4cdb695c6b482bd7","regions":[{"id":"530802","name":"思茅区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530821","name":"宁洱哈尼族彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530822","name":"墨江哈尼族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530823","name":"景东彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530824","name":"景谷傣族彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530825","name":"镇沅彝族哈尼族拉祜族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530826","name":"江城哈尼族彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530827","name":"孟连傣族拉祜族佤族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530828","name":"澜沧拉祜族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530829","name":"西盟佤族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"eb3596fb5ff8a90a351fa263bb093f857a843f0ee534904c2004e2691c4a7898","collisionFallbacks":[]},{"id":"530900","name":"临沧市","province":"530000","provinceName":"云南省","sha256":"8459d48b2d1f2825556148967a32e40e976f408193657fa57ceee11ddb410a84","regions":[{"id":"530902","name":"临翔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530921","name":"凤庆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530922","name":"云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530923","name":"永德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530924","name":"镇康县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530925","name":"双江拉祜族佤族布朗族傣族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530926","name":"耿马傣族佤族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"530927","name":"沧源佤族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a790286441d5bbb5b6b7b062880eb71b582bde2cf249c81837e559fa89ab6fac","collisionFallbacks":[]},{"id":"532300","name":"楚雄彝族自治州","province":"530000","provinceName":"云南省","sha256":"b783af17abc8b31c89bcd76d12a14884960e2bab5ee6b731841723bea7cb7055","regions":[{"id":"532301","name":"楚雄市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532322","name":"双柏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532323","name":"牟定县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532324","name":"南华县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532325","name":"姚安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532326","name":"大姚县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532327","name":"永仁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532328","name":"元谋县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532329","name":"武定县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532331","name":"禄丰市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"71c111402d59e22eb3e990d320cd7668049ee8223af67b687566becb1a208b9b","collisionFallbacks":["532323"]},{"id":"532500","name":"红河哈尼族彝族自治州","province":"530000","provinceName":"云南省","sha256":"60a3e178a6255083da1d4d9670809f1a393642bab77ccca94fa12d49ed06ab0c","regions":[{"id":"532501","name":"个旧市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"532502","name":"开远市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532503","name":"蒙自市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532504","name":"弥勒市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532523","name":"屏边苗族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532524","name":"建水县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"532525","name":"石屏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532527","name":"泸西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532528","name":"元阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532529","name":"红河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532530","name":"金平苗族瑶族傣族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532531","name":"绿春县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532532","name":"河口瑶族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"25a6880f7a4a478c8c7d756f9dd691954883a9be9850214ece701cdafeaa4f3e","collisionFallbacks":[]},{"id":"532600","name":"文山壮族苗族自治州","province":"530000","provinceName":"云南省","sha256":"a97284c52d10086759d32429fa07b2b6010deccf817e9ecb8e22a2a5d50b643d","regions":[{"id":"532601","name":"文山市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532622","name":"砚山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532623","name":"西畴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532624","name":"麻栗坡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532625","name":"马关县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532626","name":"丘北县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532627","name":"广南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532628","name":"富宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"1a6d36e1e60af90b16c34c935e5fb099843a1ba8a99169a62bfb5832400957a8","collisionFallbacks":[]},{"id":"532800","name":"西双版纳傣族自治州","province":"530000","provinceName":"云南省","sha256":"5f5b511c3dc9c56aa3d1095b473a6f5fffeaae9574187aa0a1c50492dc2a6efe","regions":[{"id":"532801","name":"景洪市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532822","name":"勐海县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532823","name":"勐腊县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"13d022afa13a5e6eb0f8de8185eda9e56afca52a2e1ab196271e04b75915b33b","collisionFallbacks":[]},{"id":"532900","name":"大理白族自治州","province":"530000","provinceName":"云南省","sha256":"a8302dd2eaed8ec54f33b86231627573be67bf5bee638afd59ad44261178eb53","regions":[{"id":"532901","name":"大理市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532922","name":"漾濞彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532923","name":"祥云县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532924","name":"宾川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532925","name":"弥渡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532926","name":"南涧彝族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532927","name":"巍山彝族回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532928","name":"永平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532929","name":"云龙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532930","name":"洱源县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"532931","name":"剑川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"532932","name":"鹤庆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"67e87a73893286e1d064e9affef1026b2bbcec87040e9f6bc7ad5df0a3e0a3db","collisionFallbacks":[]},{"id":"533100","name":"德宏傣族景颇族自治州","province":"530000","provinceName":"云南省","sha256":"bfac3841ac81b795b931cd698d644e3fae518983fabdcad629cc0f0936866ea3","regions":[{"id":"533102","name":"瑞丽市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533103","name":"芒市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533122","name":"梁河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533123","name":"盈江县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533124","name":"陇川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"94c581f146ce4706d0de4e63238d263b7dc82cffe89f637b761cc07d5a2f9a8b","collisionFallbacks":[]},{"id":"533300","name":"怒江傈僳族自治州","province":"530000","provinceName":"云南省","sha256":"ee5fc615a098e5640a054e9ca276f566a2d918fe430c6c64316a90d314079877","regions":[{"id":"533301","name":"泸水市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533323","name":"福贡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533324","name":"贡山独龙族怒族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533325","name":"兰坪白族普米族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"988472543df92f24be44976b8f057babfd71077fe0ca0d6e405c3fce93ce8f6c","collisionFallbacks":[]},{"id":"533400","name":"迪庆藏族自治州","province":"530000","provinceName":"云南省","sha256":"0b943284911d888419b09e70ac82a1eee5a950e8d3933925e1bd397cb9c228f4","regions":[{"id":"533401","name":"香格里拉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533422","name":"德钦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"533423","name":"维西傈僳族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"47e2938bddbcf121b445bd0d681dc8e23bcd4e462997fd0e3eb3b4ed41ef18ba","collisionFallbacks":[]},{"id":"540100","name":"拉萨市","province":"540000","provinceName":"西藏自治区","sha256":"9a3f80aba79831fb03c4de72badcf33a521042cefae26105fc923f256fe3f2d3","regions":[{"id":"540102","name":"城关区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540103","name":"堆龙德庆区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540104","name":"达孜区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540121","name":"林周县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540122","name":"当雄县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540123","name":"尼木县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540124","name":"曲水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540127","name":"墨竹工卡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f56f1215072c8145d327942bade875648f0e6fcb53f4d5411dea3acbe32469ed","collisionFallbacks":[]},{"id":"540200","name":"日喀则市","province":"540000","provinceName":"西藏自治区","sha256":"e2987b1bce569afa1da3b05196e199bc4357f8383c1631d7e4713c421fe44934","regions":[{"id":"540202","name":"桑珠孜区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540221","name":"南木林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540222","name":"江孜县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540223","name":"定日县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540224","name":"萨迦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540225","name":"拉孜县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540226","name":"昂仁县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"540227","name":"谢通门县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540228","name":"白朗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540229","name":"仁布县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540230","name":"康马县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540231","name":"定结县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540232","name":"仲巴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540233","name":"亚东县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540234","name":"吉隆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540235","name":"聂拉木县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540236","name":"萨嘎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540237","name":"岗巴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"6cab117246be3e7d8491411cb620522099bea47f06771cad550b034858caf81a","collisionFallbacks":[]},{"id":"540300","name":"昌都市","province":"540000","provinceName":"西藏自治区","sha256":"ee46020d825b92a09cf95420f189375cb6e41b2d8526d457b2e8d64d54463adb","regions":[{"id":"540302","name":"卡若区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540321","name":"江达县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540322","name":"贡觉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540323","name":"类乌齐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540324","name":"丁青县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540325","name":"察雅县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540326","name":"八宿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540327","name":"左贡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540328","name":"芒康县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540329","name":"洛隆县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540330","name":"边坝县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2ce928c1bf529cbe025406592c6a1351483a17a41077684bb236f0085214047e","collisionFallbacks":[]},{"id":"540400","name":"林芝市","province":"540000","provinceName":"西藏自治区","sha256":"27bef3f22a43499901c35d7835921397d35486c84bf09e388e52cd529d33f66a","regions":[{"id":"540402","name":"巴宜区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540421","name":"工布江达县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540422","name":"米林县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540423","name":"墨脱县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540424","name":"波密县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540425","name":"察隅县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540426","name":"朗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"14263778ae2b5658495424b53e410174e43c84f5c92f29c100058fa2188c5874","collisionFallbacks":[]},{"id":"540500","name":"山南市","province":"540000","provinceName":"西藏自治区","sha256":"e1d2b4e1ad09cb73c41bea4dac44fd8582612fc293fbeafb43031d88a4e45de8","regions":[{"id":"540502","name":"乃东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540521","name":"扎囊县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540522","name":"贡嘎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540523","name":"桑日县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540524","name":"琼结县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540525","name":"曲松县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540526","name":"措美县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540527","name":"洛扎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540528","name":"加查县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540529","name":"隆子县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540530","name":"错那县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540531","name":"浪卡子县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c3a8d733b5679c5d158b514b3b31092699fa637e32d2c15807ada2836e96937a","collisionFallbacks":[]},{"id":"540600","name":"那曲市","province":"540000","provinceName":"西藏自治区","sha256":"a92793bbcc4696ec2ab1982cc93537390461b492e05d3c242da67220631d7582","regions":[{"id":"540602","name":"色尼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540621","name":"嘉黎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540622","name":"比如县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540623","name":"聂荣县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540624","name":"安多县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540625","name":"申扎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540626","name":"索县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540627","name":"班戈县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540628","name":"巴青县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"540629","name":"尼玛县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"540630","name":"双湖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9bdae97fd5225ec1c7e26ac45b0fb478ac78b0e30b9541043ad92c2df2b49342","collisionFallbacks":[]},{"id":"542500","name":"阿里地区","province":"540000","provinceName":"西藏自治区","sha256":"da68c94cdc219db95ea6fe6c075713214abeea9ea31e059f2323e4fd89827f4e","regions":[{"id":"542521","name":"普兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"542522","name":"札达县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"542523","name":"噶尔县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"542524","name":"日土县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"542525","name":"革吉县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"542526","name":"改则县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"542527","name":"措勤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"d72a9501026945141f58f5dd6c8b59fdeed50d9a159e0f2b95187d6d2df104ef","collisionFallbacks":[]},{"id":"610100","name":"西安市","province":"610000","provinceName":"陕西省","sha256":"17b60bf21415fc8ff30a4b4aa63edbc1ea8de1dc149fc0ddbf330517a6ebe317","regions":[{"id":"610102","name":"新城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610103","name":"碑林区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610104","name":"莲湖区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610111","name":"灞桥区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610112","name":"未央区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610113","name":"雁塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610114","name":"阎良区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610115","name":"临潼区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610116","name":"长安区","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"610117","name":"高陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610118","name":"鄠邑区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610122","name":"蓝田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610124","name":"周至县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f0923bca2a4c7a36879bde1ae3ad74e339f40477fa0914af9180a658cc596da0","collisionFallbacks":[]},{"id":"610200","name":"铜川市","province":"610000","provinceName":"陕西省","sha256":"3fd39041e7b3a2a0c076992d1154484c9c21bcd7f4295783ab804daf38171536","regions":[{"id":"610202","name":"王益区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610203","name":"印台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610204","name":"耀州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610222","name":"宜君县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0c524db304d2fe1cd44e2ff4501973c701350630f1f3b870e506bcb162da9636","collisionFallbacks":[]},{"id":"610300","name":"宝鸡市","province":"610000","provinceName":"陕西省","sha256":"c49c4f21cbb9beef7298123b892172f59ef6cb14b23903a8fa117771c3e7fcae","regions":[{"id":"610302","name":"渭滨区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610303","name":"金台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610304","name":"陈仓区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610322","name":"凤翔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610323","name":"岐山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610324","name":"扶风县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610326","name":"眉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610327","name":"陇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610328","name":"千阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610329","name":"麟游县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610330","name":"凤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610331","name":"太白县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"be4fb34e8737820ce42c68ed8f5c04b6bbe99aa7a0d8db9ee059e2e6a8a9eda5","collisionFallbacks":[]},{"id":"610400","name":"咸阳市","province":"610000","provinceName":"陕西省","sha256":"afad0f302a2e4fff6309582729121899ebeab7b9da725032faf4d77be9622a3b","regions":[{"id":"610402","name":"秦都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610403","name":"杨陵区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610404","name":"渭城区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610422","name":"三原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610423","name":"泾阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610424","name":"乾县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610425","name":"礼泉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610426","name":"永寿县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"610428","name":"长武县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610429","name":"旬邑县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610430","name":"淳化县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610431","name":"武功县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610481","name":"兴平市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610482","name":"彬州市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"967db33b83e3d4711d0cc8e0b079790723acdc2b3c152318d0e5461be08bfdab","collisionFallbacks":[]},{"id":"610500","name":"渭南市","province":"610000","provinceName":"陕西省","sha256":"2f51d995b8e31643a933e76741d5f7e6d060ed20c36db3f25fda3f625f3f57d2","regions":[{"id":"610502","name":"临渭区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610503","name":"华州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610522","name":"潼关县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610523","name":"大荔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610524","name":"合阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610525","name":"澄城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610526","name":"蒲城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610527","name":"白水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610528","name":"富平县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610581","name":"韩城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610582","name":"华阴市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"34e6befec0a4ab50f166e526cee1bb89be825f8364e03b638256a6920fd8a0d4","collisionFallbacks":[]},{"id":"610600","name":"延安市","province":"610000","provinceName":"陕西省","sha256":"75dc00682a5537400af33f1f843a0acae5dc16eeebfd2aa8bdfb5d6d1e30ef71","regions":[{"id":"610602","name":"宝塔区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610603","name":"安塞区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610621","name":"延长县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"610622","name":"延川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610625","name":"志丹县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610626","name":"吴起县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610627","name":"甘泉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610628","name":"富县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610629","name":"洛川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610630","name":"宜川县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"610631","name":"黄龙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610632","name":"黄陵县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610681","name":"子长市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"57ecb711dcd70daa98ceaa0b167b0e8b1e4424d4d9e1d725c9aba1b8c5fd3fb9","collisionFallbacks":[]},{"id":"610700","name":"汉中市","province":"610000","provinceName":"陕西省","sha256":"78f9a1a3f7419e268ecd3207247ffd77f17672a61dccc1f806d148ce663a260f","regions":[{"id":"610702","name":"汉台区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610703","name":"南郑区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610722","name":"城固县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610723","name":"洋县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610724","name":"西乡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610725","name":"勉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610726","name":"宁强县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"610727","name":"略阳县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"610728","name":"镇巴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610729","name":"留坝县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610730","name":"佛坪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"139a2ac52a1b317a30f9dfb7a3ea9b1f0de9db5fe1dbc8b4fa402518b0ab3c7d","collisionFallbacks":[]},{"id":"610800","name":"榆林市","province":"610000","provinceName":"陕西省","sha256":"accded40abe1d14594001ea4f5aba012f22e1753eeb64d19a157a6cf1131a5ae","regions":[{"id":"610802","name":"榆阳区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"610803","name":"横山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610822","name":"府谷县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610824","name":"靖边县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610825","name":"定边县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610826","name":"绥德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610827","name":"米脂县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610828","name":"佳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610829","name":"吴堡县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610830","name":"清涧县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610831","name":"子洲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610881","name":"神木市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7b4ae6e2d15a0ac6e66c60b5cd59ec679f43e2b12ca99005020bdf10818966b8","collisionFallbacks":[]},{"id":"610900","name":"安康市","province":"610000","provinceName":"陕西省","sha256":"cccf3fd3bce3859819522c517f46a29d31877c06b8f9281b37970a3e2ad15ab2","regions":[{"id":"610902","name":"汉滨区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610921","name":"汉阴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610922","name":"石泉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610923","name":"宁陕县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610924","name":"紫阳县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"610925","name":"岚皋县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610926","name":"平利县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610927","name":"镇坪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610928","name":"旬阳市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"610929","name":"白河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ca09e8bead57858107f99b281d498442a99cce98c6ada5fb140bf8506e540480","collisionFallbacks":[]},{"id":"611000","name":"商洛市","province":"610000","provinceName":"陕西省","sha256":"cab0a43501cec6f556c39b9c9d0a6f6ae4789a518a72a7201997610b5d48d35d","regions":[{"id":"611002","name":"商州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"611021","name":"洛南县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"611022","name":"丹凤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"611023","name":"商南县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"611024","name":"山阳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"611025","name":"镇安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"611026","name":"柞水县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"0750d7d2efce45e8a756e38ecdbb21f1c078e0c7644e9527e95b75238633a52a","collisionFallbacks":[]},{"id":"620100","name":"兰州市","province":"620000","provinceName":"甘肃省","sha256":"07ebb282943e632d051f6666abb06f348ba3144a154e5f9c72fd8f6fbd2ac069","regions":[{"id":"620102","name":"城关区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620103","name":"七里河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620104","name":"西固区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620105","name":"安宁区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620111","name":"红古区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"620121","name":"永登县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620122","name":"皋兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620123","name":"榆中县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b1faadae7caed04c440f9a5d875185a6aca73533603778f7f9762e78aeb29700","collisionFallbacks":[]},{"id":"620300","name":"金昌市","province":"620000","provinceName":"甘肃省","sha256":"c698c63d4e8d99328f7e4b68acc8352c4017b1b6d43ae124bedd5a81e2330cba","regions":[{"id":"620302","name":"金川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620321","name":"永昌县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ce3d1700f1859839da243e5f469c143d228ea35ae97ea6988b94cb35a8c7a700","collisionFallbacks":[]},{"id":"620400","name":"白银市","province":"620000","provinceName":"甘肃省","sha256":"69e4c984fa30d15795605fe33ff960ab10bda8a7e6decc8c8531ddb0458c88d5","regions":[{"id":"620402","name":"白银区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620403","name":"平川区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620421","name":"靖远县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"620422","name":"会宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620423","name":"景泰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bd420a935921a8c45c7977971743e3ce1798062ac784bb3e97e7455a6adab75a","collisionFallbacks":[]},{"id":"620500","name":"天水市","province":"620000","provinceName":"甘肃省","sha256":"80e979c1b3f1a01ddddb2eeea13f302d086214e0e0cdc49a607c00aaaa3801fa","regions":[{"id":"620502","name":"秦州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620503","name":"麦积区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620521","name":"清水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620522","name":"秦安县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620523","name":"甘谷县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620524","name":"武山县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620525","name":"张家川回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"fd2f0208225a0b6ec120f8d1deeec67ac063993d2065c0082d8bb4fbe7d3941d","collisionFallbacks":[]},{"id":"620600","name":"武威市","province":"620000","provinceName":"甘肃省","sha256":"81e7201fcd998cccd4f79f90a478a91d3bf82d38740ce38b68eba849ad52d6a8","regions":[{"id":"620602","name":"凉州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620621","name":"民勤县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620622","name":"古浪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620623","name":"天祝藏族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e48942df9ff36aabc166e41f59aca315fb560a76538ff93ba71411729dceb6b1","collisionFallbacks":[]},{"id":"620700","name":"张掖市","province":"620000","provinceName":"甘肃省","sha256":"c8ba7ff1203b01584079825a016235e64f01aeca622402fead3b0fb557144e60","regions":[{"id":"620702","name":"甘州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620721","name":"肃南裕固族自治县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"620722","name":"民乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620723","name":"临泽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620724","name":"高台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620725","name":"山丹县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f4d1e000c554ed480e7592445cd08d557452b8cd382d7095c29a5369df7c934e","collisionFallbacks":[]},{"id":"620800","name":"平凉市","province":"620000","provinceName":"甘肃省","sha256":"c1fe55255bb2ab753aa699952a9d84ad987a2de459f9ccb09061633d1f413158","regions":[{"id":"620802","name":"崆峒区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"620821","name":"泾川县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620822","name":"灵台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620823","name":"崇信县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620825","name":"庄浪县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"620826","name":"静宁县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"620881","name":"华亭市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a830697d6f42ddd327012f196048a9d3079ba349e2ba8be1571e002e886407c9","collisionFallbacks":[]},{"id":"620900","name":"酒泉市","province":"620000","provinceName":"甘肃省","sha256":"494d34fdd16d22da7cbb13bbd26eaa44df0f2e396668faecfb027313cca37754","regions":[{"id":"620902","name":"肃州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620921","name":"金塔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620922","name":"瓜州县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620923","name":"肃北蒙古族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"620924","name":"阿克塞哈萨克族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"620981","name":"玉门市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"620982","name":"敦煌市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"eb7d0c584ca1f8106a1abe9b5b0671f90a8136a0566392572b0cbc334a96247e","collisionFallbacks":[]},{"id":"621000","name":"庆阳市","province":"620000","provinceName":"甘肃省","sha256":"2b14454ce5d0602e697467ca0d7068d79bed8a69918d3d0a89f34642380bda36","regions":[{"id":"621002","name":"西峰区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621021","name":"庆城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621022","name":"环县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"621023","name":"华池县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621024","name":"合水县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621025","name":"正宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621026","name":"宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621027","name":"镇原县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e61e3cea6974905d236ef4736a8d7d9fedd308909a90bc917d37d6ab56e329a0","collisionFallbacks":[]},{"id":"621100","name":"定西市","province":"620000","provinceName":"甘肃省","sha256":"76db9d4cdfec2d3f7b1f4cd2144c06486a8f1a8e5843f2bf63af058d342fd98e","regions":[{"id":"621102","name":"安定区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621121","name":"通渭县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621122","name":"陇西县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621123","name":"渭源县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"621124","name":"临洮县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"621125","name":"漳县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621126","name":"岷县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"2e89ea55efa8c0a24211d8a305576f9085f1dff049b7ba139a7d72e6bf4a16d3","collisionFallbacks":[]},{"id":"621200","name":"陇南市","province":"620000","provinceName":"甘肃省","sha256":"5b95eb3b6891bc5dacc1556adb848346ffd714689afc481b42cfb2b8ee0ff7dc","regions":[{"id":"621202","name":"武都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621221","name":"成县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621222","name":"文县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621223","name":"宕昌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621224","name":"康县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621225","name":"西和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621226","name":"礼县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621227","name":"徽县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"621228","name":"两当县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7f7090695f2c634641d033ba6c54454f0f5447664277f5be0c0462f8f57ed65a","collisionFallbacks":[]},{"id":"622900","name":"临夏回族自治州","province":"620000","provinceName":"甘肃省","sha256":"c48f95c30237ccdedbb301bd52d41b564d5617f23975c148d8f98c39e6368a2f","regions":[{"id":"622901","name":"临夏市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622921","name":"临夏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622922","name":"康乐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622923","name":"永靖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622924","name":"广河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622925","name":"和政县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622926","name":"东乡族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"622927","name":"积石山保安族东乡族撒拉族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bab9e8f1d0f1acc10bdbd1475264eb680b7bc50587737b5904eb6e83fcdf879c","collisionFallbacks":[]},{"id":"623000","name":"甘南藏族自治州","province":"620000","provinceName":"甘肃省","sha256":"719281047d6f617c97f6c17308779c0414fc5cac85038738062af31fdbfda1b7","regions":[{"id":"623001","name":"合作市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"623021","name":"临潭县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"623022","name":"卓尼县","sourceRings":5,"sourceHoles":0,"rings":5,"holes":0,"repairedSourcePolygons":0},{"id":"623023","name":"舟曲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"623024","name":"迭部县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"623025","name":"玛曲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"623026","name":"碌曲县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"623027","name":"夏河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"12a5b3634cc53bec7387d23a17acabbfec5a2c2a68908fafc42a921cb10cf36c","collisionFallbacks":[]},{"id":"630100","name":"西宁市","province":"630000","provinceName":"青海省","sha256":"f05995e0bf6c83f2311fdddd54af582d7157d78e39207d15fbc5a204e1d20657","regions":[{"id":"630102","name":"城东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630103","name":"城中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630104","name":"城西区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630105","name":"城北区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630106","name":"湟中区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630121","name":"大通回族土族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630123","name":"湟源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"4bfd39b36139f176b5eb9459160b7fedc7a6651b5dc8fd9218266e784e17dd9d","collisionFallbacks":[]},{"id":"630200","name":"海东市","province":"630000","provinceName":"青海省","sha256":"ac7c0e0ad470a08319621f3e853f9799bb11dbe00da3b623672bb02d8fa8688a","regions":[{"id":"630202","name":"乐都区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630203","name":"平安区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630222","name":"民和回族土族自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"630223","name":"互助土族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630224","name":"化隆回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"630225","name":"循化撒拉族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e3a642b18a19c8af538661f0b24abf87e2b68bacd2b28c51ed7fd2090100fb54","collisionFallbacks":[]},{"id":"632200","name":"海北藏族自治州","province":"630000","provinceName":"青海省","sha256":"bdf90233477e0683007089daf7c2ec73c03891e63bf30d2334c564f42ccd439b","regions":[{"id":"632221","name":"门源回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632222","name":"祁连县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632223","name":"海晏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632224","name":"刚察县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"a7ce1c576a64c11d2459f7f7ad03448e73fa58346b09025c74ecb0b4e7d84eb2","collisionFallbacks":[]},{"id":"632300","name":"黄南藏族自治州","province":"630000","provinceName":"青海省","sha256":"0d5aa6e1967d58a141f37e86eee521a43e5470df26c0f88308a548c8df5ef108","regions":[{"id":"632301","name":"同仁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632322","name":"尖扎县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632323","name":"泽库县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"632324","name":"河南蒙古族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"8938e4d19fd84d8fa28d52ceaae156809eb71418e9130959179e28634afa22d8","collisionFallbacks":[]},{"id":"632500","name":"海南藏族自治州","province":"630000","provinceName":"青海省","sha256":"5e0f73290bdcaa6929e3116699ebd79f9a6dd85905064faa4e72ddd92874a85a","regions":[{"id":"632521","name":"共和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632522","name":"同德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632523","name":"贵德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632524","name":"兴海县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632525","name":"贵南县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"69f601f3486426ead64b1ad2b72095ce849b66eadf9e4d9f70a1fef7258a5552","collisionFallbacks":[]},{"id":"632600","name":"果洛藏族自治州","province":"630000","provinceName":"青海省","sha256":"3b5df30c5b173a52a1870e0936816f7754447aa79e96ef3ed575e4ea088fc482","regions":[{"id":"632621","name":"玛沁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632622","name":"班玛县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632623","name":"甘德县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632624","name":"达日县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632625","name":"久治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632626","name":"玛多县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e0a694535b8bd94a495616f7907a9c56ac4fbefb25b56c22694c04596ba41ed3","collisionFallbacks":[]},{"id":"632700","name":"玉树藏族自治州","province":"630000","provinceName":"青海省","sha256":"cb98e2615944362607a48760ce8a07bcd1a068d9432593433565ce7208eefdaf","regions":[{"id":"632701","name":"玉树市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632722","name":"杂多县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632723","name":"称多县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632724","name":"治多县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632725","name":"囊谦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632726","name":"曲麻莱县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"cc4baeb71f02823404dfeaf3ec8a3bacd72ae7e3a9b77f9f5a3f844f972be600","collisionFallbacks":[]},{"id":"632800","name":"海西蒙古族藏族自治州","province":"630000","provinceName":"青海省","sha256":"f583b31b7cfbe064ce647cb92600f32cccfea8d5759d203612e31e6b9eb0ade0","regions":[{"id":"632801","name":"格尔木市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"632802","name":"德令哈市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632803","name":"茫崖市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632821","name":"乌兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632822","name":"都兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632823","name":"天峻县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"632825","name":"海西蒙古族藏族自治州直辖","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"bc4e0cff4df977fb5f03930b1f1e82d93d69536f4987eb6db10b5588d6c7d82d","collisionFallbacks":[]},{"id":"640100","name":"银川市","province":"640000","provinceName":"宁夏回族自治区","sha256":"2912071e7d83b32fe7a621bc9490318fa07a84b9cac1f6a2d6b5ec43aad263c5","regions":[{"id":"640104","name":"兴庆区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640105","name":"西夏区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640106","name":"金凤区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640121","name":"永宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640122","name":"贺兰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640181","name":"灵武市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"3caf78e4acbac4d76e27afbdaaa796cd63096fd9cd86d38f71ff00b1004017ab","collisionFallbacks":[]},{"id":"640200","name":"石嘴山市","province":"640000","provinceName":"宁夏回族自治区","sha256":"95a2984b18d1c0ef4494df5ad71acb90903680834cb35ca9c42ac4643127daee","regions":[{"id":"640202","name":"大武口区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640205","name":"惠农区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640221","name":"平罗县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"9fa45a160248218796e0a5bcca7b0e4a111e33083e9f6db8fa86d6ab217992d8","collisionFallbacks":[]},{"id":"640300","name":"吴忠市","province":"640000","provinceName":"宁夏回族自治区","sha256":"7f7fde54e61497905fa11f6a45a60d96f0ecc344870c45f2d04cd3f0bbaf24e7","regions":[{"id":"640302","name":"利通区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640303","name":"红寺堡区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640323","name":"盐池县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640324","name":"同心县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640381","name":"青铜峡市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"f34a560bb67c16a960f370bb6e2cf12c49edb3023a95ad2c22e8ad4c5de8affe","collisionFallbacks":[]},{"id":"640400","name":"固原市","province":"640000","provinceName":"宁夏回族自治区","sha256":"eecdf5587e9f569d0431689ee2d8c2c92cdc2a72b5f3e2649d7f5cf93de2a464","regions":[{"id":"640402","name":"原州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640422","name":"西吉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640423","name":"隆德县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"640424","name":"泾源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640425","name":"彭阳县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c8b7df11878cb60fdfba0da622411728844b6a1f06372c04a295ea94131a3e8a","collisionFallbacks":[]},{"id":"640500","name":"中卫市","province":"640000","provinceName":"宁夏回族自治区","sha256":"ffed0ce2c1c8531f023605bdee84e2d8059a82b2a042610d73fea7222e43bae9","regions":[{"id":"640502","name":"沙坡头区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640521","name":"中宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"640522","name":"海原县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"5a92a0f1b28b0eea36b1210aff376493d841f02669022426497869e656f45fcf","collisionFallbacks":[]},{"id":"650100","name":"乌鲁木齐市","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"b13c3e9887cc07a7b981a05c8515dcfb3b35cefb44c54006edc79571b2e3c704","regions":[{"id":"650102","name":"天山区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650103","name":"沙依巴克区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650104","name":"新市区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650105","name":"水磨沟区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650106","name":"头屯河区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650107","name":"达坂城区","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"650109","name":"米东区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650121","name":"乌鲁木齐县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"64e1f680f3a507b732ec30a05db15aae1c7ab80a90605502a494abc5e681cca1","collisionFallbacks":[]},{"id":"650200","name":"克拉玛依市","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"82598341d2b760dcece00d7e6ca310b00fddb90e771cc5f60fcc67e05c3d0e01","regions":[{"id":"650202","name":"独山子区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650203","name":"克拉玛依区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650204","name":"白碱滩区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650205","name":"乌尔禾区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"67752d43d93149891d615fe6d48b0f192bc3347f6ac4223347df3fc409d5df21","collisionFallbacks":[]},{"id":"650400","name":"吐鲁番市","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"9d6ab9aef4b801573bf57df214dd35088bbaa37f40856613c29d60419ae5cc83","regions":[{"id":"650402","name":"高昌区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650421","name":"鄯善县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650422","name":"托克逊县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"343f6e8b60a15f800c431659abb688b4c231b0ef5683acbf7f4355169f21c136","collisionFallbacks":[]},{"id":"650500","name":"哈密市","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"321ee52fb0a6f5684f5082468583b6b840c334bcf3b7234d49c7b858c6766df3","regions":[{"id":"650502","name":"伊州区","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650521","name":"巴里坤哈萨克自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"650522","name":"伊吾县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"c2372fd998a1e790b8e424e7f97626c156f72e08dfe3d734f15a94fb071e3789","collisionFallbacks":[]},{"id":"652300","name":"昌吉回族自治州","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"090389fa1bbc7bd74262e8717c9ca5b0489f7c9e3557e9a3c641b9272f42e99a","regions":[{"id":"652301","name":"昌吉市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652302","name":"阜康市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652323","name":"呼图壁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652324","name":"玛纳斯县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652325","name":"奇台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652327","name":"吉木萨尔县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652328","name":"木垒哈萨克自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e638f1d77624141de38c06da5352d3a11681f501d6ed081ce43b3fcafddc45e7","collisionFallbacks":[]},{"id":"652700","name":"博尔塔拉蒙古自治州","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"8080b9d303ceb6965f523c92bb901e61fce20b0569f36b2cae6b7a8fe2d5f853","regions":[{"id":"652701","name":"博乐市","sourceRings":6,"sourceHoles":0,"rings":6,"holes":0,"repairedSourcePolygons":0},{"id":"652702","name":"阿拉山口市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652722","name":"精河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652723","name":"温泉县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ce4ef33fe75d06e574942c0db4bfaf3e251a94466e75b8c4d221db3b143009c0","collisionFallbacks":[]},{"id":"652800","name":"巴音郭楞蒙古自治州","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"4dadaf284d63a3b138b2d30bfe09f2290bbd460f925a2647655540b2e8af8a54","regions":[{"id":"652801","name":"库尔勒市","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"652822","name":"轮台县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652823","name":"尉犁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652824","name":"若羌县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652825","name":"且末县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652826","name":"焉耆回族自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652827","name":"和静县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652828","name":"和硕县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652829","name":"博湖县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"e2ff8e6a6bdd6398641f108688df0927fe12d45558ad8d5da631fe918f451044","collisionFallbacks":[]},{"id":"652900","name":"阿克苏地区","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"b0fe5dde21b90ead30fee4cb4ee00a250aac4d6c24740a0e5fff2b13becf18e0","regions":[{"id":"652901","name":"阿克苏市","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"652902","name":"库车市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652922","name":"温宿县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652924","name":"沙雅县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652925","name":"新和县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652926","name":"拜城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652927","name":"乌什县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652928","name":"阿瓦提县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"652929","name":"柯坪县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"08b9b44181a404974cffa37d331a28033aed4fce8432795d165cae73141c6131","collisionFallbacks":[]},{"id":"653000","name":"克孜勒苏柯尔克孜自治州","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"aaaf576d4f75063378f89934411110a47201796f905edfbf84d434a10717acbb","regions":[{"id":"653001","name":"阿图什市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653022","name":"阿克陶县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653023","name":"阿合奇县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653024","name":"乌恰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"497ef410d7d5730b426c72e80c8597fd330ed7bb3bbaea45dfdbff887ff1a1ab","collisionFallbacks":[]},{"id":"653100","name":"喀什地区","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"c79376a512bfa012b3bc766640f9113b6646a4df145dd9f3eef3ab0333567d38","regions":[{"id":"653101","name":"喀什市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653121","name":"疏附县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653122","name":"疏勒县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653123","name":"英吉沙县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653124","name":"泽普县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653125","name":"莎车县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653126","name":"叶城县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653127","name":"麦盖提县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653128","name":"岳普湖县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"653129","name":"伽师县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653130","name":"巴楚县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"653131","name":"塔什库尔干塔吉克自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"b079d08e510374fa42b47837e025a0545710179ea63802dc1cecc07b25221b40","collisionFallbacks":[]},{"id":"653200","name":"和田地区","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"430744f6f71fb672c80d5defc8b5fd68e615d5ed8193bd380b4a1e873573bd5e","regions":[{"id":"653201","name":"和田市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653221","name":"和田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653222","name":"墨玉县","sourceRings":4,"sourceHoles":0,"rings":4,"holes":0,"repairedSourcePolygons":0},{"id":"653223","name":"皮山县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"653224","name":"洛浦县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653225","name":"策勒县","sourceRings":3,"sourceHoles":0,"rings":3,"holes":0,"repairedSourcePolygons":0},{"id":"653226","name":"于田县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"653227","name":"民丰县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"431ed44277a6e8132ac0a4668700b0d88f089c3caec401180328f27d06bc6889","collisionFallbacks":[]},{"id":"654000","name":"伊犁哈萨克自治州","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"bf130f74c339dd083c88cd3096b0ff869928c0d4b40f59430b08bf5968782d01","regions":[{"id":"654002","name":"伊宁市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654003","name":"奎屯市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654004","name":"霍尔果斯市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654021","name":"伊宁县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654022","name":"察布查尔锡伯自治县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"654023","name":"霍城县","sourceRings":2,"sourceHoles":0,"rings":2,"holes":0,"repairedSourcePolygons":0},{"id":"654024","name":"巩留县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654025","name":"新源县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654026","name":"昭苏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654027","name":"特克斯县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654028","name":"尼勒克县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"ba44a1c4a8a7bea83bec8d8b42271c5784a97dd719f889e084f051171cc402fb","collisionFallbacks":[]},{"id":"654200","name":"塔城地区","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"eb546e3844517f52ed9cf0edbd95991172d55e8cb2316e1ca32cca46c92c22bb","regions":[{"id":"654201","name":"塔城市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654202","name":"乌苏市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654221","name":"额敏县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654223","name":"沙湾市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654224","name":"托里县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654225","name":"裕民县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654226","name":"和布克赛尔蒙古自治县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"31967dff7790bf621822a0c40474a6d5b2b584186f5286567f1ebe401afb80ad","collisionFallbacks":[]},{"id":"654300","name":"阿勒泰地区","province":"650000","provinceName":"新疆维吾尔自治区","sha256":"d299b50e6bcf1782188f134e015cdb5d762d285741e084955517c8898085a05e","regions":[{"id":"654301","name":"阿勒泰市","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654321","name":"布尔津县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654322","name":"富蕴县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654323","name":"福海县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654324","name":"哈巴河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654325","name":"青河县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0},{"id":"654326","name":"吉木乃县","sourceRings":1,"sourceHoles":0,"rings":1,"holes":0,"repairedSourcePolygons":0}],"assetSha256":"7a2d958b758912e060e825ea79b634800ae93499f87565d0831d41f141b00b92","collisionFallbacks":[]}],"unavailable":[{"id":"441900","name":"东莞市","province":"440000","reason":"no_county_children"},{"id":"442000","name":"中山市","province":"440000","reason":"no_county_children"},{"id":"460400","name":"儋州市","province":"460000","reason":"no_county_children"},{"id":"620200","name":"嘉峪关市","province":"620000","reason":"no_county_children"}]} diff --git a/research/detail-map-index.json b/research/detail-map-index.json new file mode 100644 index 0000000..6b70fe4 --- /dev/null +++ b/research/detail-map-index.json @@ -0,0 +1,864 @@ +{ + "downloadDate": "2026-10-17", + "levels": [ + { + "id": "110000", + "name": "北京市", + "kind": "county", + "source": "DataV.GeoAtlas", + "sha256": "7a333e5737d1e69a7e90400874ec908d5cb5c6a8d8efead24c0f137345054d95", + "regions": [ + { + "id": "110101", + "name": "东城区", + "rings": 1, + "holes": 0 + }, + { + "id": "110102", + "name": "西城区", + "rings": 1, + "holes": 0 + }, + { + "id": "110105", + "name": "朝阳区", + "rings": 2, + "holes": 0 + }, + { + "id": "110106", + "name": "丰台区", + "rings": 1, + "holes": 0 + }, + { + "id": "110107", + "name": "石景山区", + "rings": 1, + "holes": 0 + }, + { + "id": "110108", + "name": "海淀区", + "rings": 1, + "holes": 0 + }, + { + "id": "110109", + "name": "门头沟区", + "rings": 1, + "holes": 0 + }, + { + "id": "110111", + "name": "房山区", + "rings": 1, + "holes": 0 + }, + { + "id": "110112", + "name": "通州区", + "rings": 1, + "holes": 0 + }, + { + "id": "110113", + "name": "顺义区", + "rings": 2, + "holes": 0 + }, + { + "id": "110114", + "name": "昌平区", + "rings": 1, + "holes": 0 + }, + { + "id": "110115", + "name": "大兴区", + "rings": 1, + "holes": 0 + }, + { + "id": "110116", + "name": "怀柔区", + "rings": 1, + "holes": 0 + }, + { + "id": "110117", + "name": "平谷区", + "rings": 1, + "holes": 0 + }, + { + "id": "110118", + "name": "密云区", + "rings": 1, + "holes": 0 + }, + { + "id": "110119", + "name": "延庆区", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "120000", + "name": "天津市", + "kind": "county", + "source": "DataV.GeoAtlas", + "sha256": "9626c700abca708da272e03879ad98db4f1385fad11b8877481b13a0c2ef86db", + "regions": [ + { + "id": "120101", + "name": "和平区", + "rings": 1, + "holes": 0 + }, + { + "id": "120102", + "name": "河东区", + "rings": 1, + "holes": 0 + }, + { + "id": "120103", + "name": "河西区", + "rings": 1, + "holes": 0 + }, + { + "id": "120104", + "name": "南开区", + "rings": 1, + "holes": 0 + }, + { + "id": "120105", + "name": "河北区", + "rings": 1, + "holes": 0 + }, + { + "id": "120106", + "name": "红桥区", + "rings": 2, + "holes": 0 + }, + { + "id": "120110", + "name": "东丽区", + "rings": 1, + "holes": 0 + }, + { + "id": "120111", + "name": "西青区", + "rings": 1, + "holes": 0 + }, + { + "id": "120112", + "name": "津南区", + "rings": 1, + "holes": 0 + }, + { + "id": "120113", + "name": "北辰区", + "rings": 1, + "holes": 1 + }, + { + "id": "120114", + "name": "武清区", + "rings": 1, + "holes": 0 + }, + { + "id": "120115", + "name": "宝坻区", + "rings": 1, + "holes": 0 + }, + { + "id": "120116", + "name": "滨海新区", + "rings": 1, + "holes": 0 + }, + { + "id": "120117", + "name": "宁河区", + "rings": 1, + "holes": 1 + }, + { + "id": "120118", + "name": "静海区", + "rings": 1, + "holes": 0 + }, + { + "id": "120119", + "name": "蓟州区", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "310000", + "name": "上海市", + "kind": "county", + "source": "DataV.GeoAtlas", + "sha256": "f699513d5eb63d56350018d90db92345aeefc88c9e4f76197ea405178b6c31ae", + "regions": [ + { + "id": "310101", + "name": "黄浦区", + "rings": 1, + "holes": 0 + }, + { + "id": "310104", + "name": "徐汇区", + "rings": 1, + "holes": 0 + }, + { + "id": "310105", + "name": "长宁区", + "rings": 1, + "holes": 0 + }, + { + "id": "310106", + "name": "静安区", + "rings": 1, + "holes": 0 + }, + { + "id": "310107", + "name": "普陀区", + "rings": 1, + "holes": 0 + }, + { + "id": "310109", + "name": "虹口区", + "rings": 1, + "holes": 0 + }, + { + "id": "310110", + "name": "杨浦区", + "rings": 1, + "holes": 0 + }, + { + "id": "310112", + "name": "闵行区", + "rings": 1, + "holes": 0 + }, + { + "id": "310113", + "name": "宝山区", + "rings": 1, + "holes": 0 + }, + { + "id": "310114", + "name": "嘉定区", + "rings": 1, + "holes": 0 + }, + { + "id": "310115", + "name": "浦东新区", + "rings": 3, + "holes": 0 + }, + { + "id": "310116", + "name": "金山区", + "rings": 4, + "holes": 0 + }, + { + "id": "310117", + "name": "松江区", + "rings": 1, + "holes": 0 + }, + { + "id": "310118", + "name": "青浦区", + "rings": 1, + "holes": 0 + }, + { + "id": "310120", + "name": "奉贤区", + "rings": 1, + "holes": 0 + }, + { + "id": "310151", + "name": "崇明区", + "rings": 5, + "holes": 0 + } + ] + }, + { + "id": "500000", + "name": "重庆市", + "kind": "county", + "source": "DataV.GeoAtlas", + "sha256": "ab7c6769ee2c8941054b71d82261eae5385e237354aea1887e00c416872c457d", + "regions": [ + { + "id": "500101", + "name": "万州区", + "rings": 1, + "holes": 0 + }, + { + "id": "500102", + "name": "涪陵区", + "rings": 1, + "holes": 0 + }, + { + "id": "500103", + "name": "渝中区", + "rings": 1, + "holes": 0 + }, + { + "id": "500104", + "name": "大渡口区", + "rings": 1, + "holes": 0 + }, + { + "id": "500105", + "name": "江北区", + "rings": 1, + "holes": 0 + }, + { + "id": "500106", + "name": "沙坪坝区", + "rings": 1, + "holes": 0 + }, + { + "id": "500107", + "name": "九龙坡区", + "rings": 3, + "holes": 0 + }, + { + "id": "500108", + "name": "南岸区", + "rings": 1, + "holes": 0 + }, + { + "id": "500109", + "name": "北碚区", + "rings": 1, + "holes": 0 + }, + { + "id": "500110", + "name": "綦江区", + "rings": 1, + "holes": 0 + }, + { + "id": "500111", + "name": "大足区", + "rings": 1, + "holes": 0 + }, + { + "id": "500112", + "name": "渝北区", + "rings": 1, + "holes": 0 + }, + { + "id": "500113", + "name": "巴南区", + "rings": 1, + "holes": 0 + }, + { + "id": "500114", + "name": "黔江区", + "rings": 1, + "holes": 0 + }, + { + "id": "500115", + "name": "长寿区", + "rings": 2, + "holes": 0 + }, + { + "id": "500116", + "name": "江津区", + "rings": 1, + "holes": 0 + }, + { + "id": "500117", + "name": "合川区", + "rings": 2, + "holes": 0 + }, + { + "id": "500118", + "name": "永川区", + "rings": 1, + "holes": 0 + }, + { + "id": "500119", + "name": "南川区", + "rings": 1, + "holes": 0 + }, + { + "id": "500120", + "name": "璧山区", + "rings": 1, + "holes": 0 + }, + { + "id": "500151", + "name": "铜梁区", + "rings": 3, + "holes": 0 + }, + { + "id": "500152", + "name": "潼南区", + "rings": 2, + "holes": 0 + }, + { + "id": "500153", + "name": "荣昌区", + "rings": 1, + "holes": 0 + }, + { + "id": "500154", + "name": "开州区", + "rings": 1, + "holes": 0 + }, + { + "id": "500155", + "name": "梁平区", + "rings": 1, + "holes": 0 + }, + { + "id": "500156", + "name": "武隆区", + "rings": 1, + "holes": 0 + }, + { + "id": "500229", + "name": "城口县", + "rings": 1, + "holes": 0 + }, + { + "id": "500230", + "name": "丰都县", + "rings": 1, + "holes": 0 + }, + { + "id": "500231", + "name": "垫江县", + "rings": 1, + "holes": 0 + }, + { + "id": "500233", + "name": "忠县", + "rings": 1, + "holes": 0 + }, + { + "id": "500235", + "name": "云阳县", + "rings": 1, + "holes": 0 + }, + { + "id": "500236", + "name": "奉节县", + "rings": 3, + "holes": 0 + }, + { + "id": "500237", + "name": "巫山县", + "rings": 1, + "holes": 0 + }, + { + "id": "500238", + "name": "巫溪县", + "rings": 1, + "holes": 0 + }, + { + "id": "500240", + "name": "石柱土家族自治县", + "rings": 1, + "holes": 0 + }, + { + "id": "500241", + "name": "秀山土家族苗族自治县", + "rings": 1, + "holes": 0 + }, + { + "id": "500242", + "name": "酉阳土家族苗族自治县", + "rings": 1, + "holes": 0 + }, + { + "id": "500243", + "name": "彭水苗族土家族自治县", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "810000", + "name": "香港特别行政区", + "kind": "partition", + "source": "DataV.GeoAtlas", + "sha256": "69ae74ef15e964508e6619763affbbff669295e23db0ab487350b7a060aa2bc9", + "regions": [ + { + "id": "810001", + "name": "中西区", + "rings": 3, + "holes": 0 + }, + { + "id": "810002", + "name": "湾仔区", + "rings": 1, + "holes": 0 + }, + { + "id": "810003", + "name": "东区", + "rings": 1, + "holes": 0 + }, + { + "id": "810004", + "name": "南区", + "rings": 6, + "holes": 0 + }, + { + "id": "810005", + "name": "油尖旺区", + "rings": 1, + "holes": 0 + }, + { + "id": "810006", + "name": "深水埗区", + "rings": 1, + "holes": 0 + }, + { + "id": "810007", + "name": "九龙城区", + "rings": 1, + "holes": 0 + }, + { + "id": "810008", + "name": "黄大仙区", + "rings": 1, + "holes": 0 + }, + { + "id": "810009", + "name": "观塘区", + "rings": 1, + "holes": 0 + }, + { + "id": "810010", + "name": "荃湾区", + "rings": 1, + "holes": 0 + }, + { + "id": "810011", + "name": "屯门区", + "rings": 8, + "holes": 0 + }, + { + "id": "810012", + "name": "元朗区", + "rings": 1, + "holes": 0 + }, + { + "id": "810013", + "name": "北区", + "rings": 25, + "holes": 0 + }, + { + "id": "810014", + "name": "大埔区", + "rings": 14, + "holes": 0 + }, + { + "id": "810015", + "name": "西贡区", + "rings": 59, + "holes": 0 + }, + { + "id": "810016", + "name": "沙田区", + "rings": 1, + "holes": 0 + }, + { + "id": "810017", + "name": "葵青区", + "rings": 1, + "holes": 0 + }, + { + "id": "810018", + "name": "离岛区", + "rings": 29, + "holes": 0 + } + ] + }, + { + "id": "820000", + "name": "澳门特别行政区", + "kind": "partition", + "source": "DataV.GeoAtlas", + "sha256": "54a6c69e0007640b25d45b44357037fb40bce2e0e36e7a9026ebcbdfa7cfb19a", + "regions": [ + { + "id": "820001", + "name": "花地玛堂区", + "rings": 2, + "holes": 0 + }, + { + "id": "820002", + "name": "花王堂区", + "rings": 1, + "holes": 0 + }, + { + "id": "820003", + "name": "望德堂区", + "rings": 1, + "holes": 0 + }, + { + "id": "820004", + "name": "大堂区", + "rings": 1, + "holes": 0 + }, + { + "id": "820005", + "name": "风顺堂区", + "rings": 1, + "holes": 0 + }, + { + "id": "820006", + "name": "嘉模堂区", + "rings": 1, + "holes": 0 + }, + { + "id": "820007", + "name": "路凼填海区", + "rings": 1, + "holes": 0 + }, + { + "id": "820008", + "name": "圣方济各堂区", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "710000", + "name": "台湾省", + "kind": "county-city", + "source": "NLSC", + "snapshot": "COUNTY_MOI_1090820", + "translatedOffshoreRings": 16, + "sourceURL": "https://data.gov.tw/dataset/7442", + "license": "政府资料开放授权条款第1版", + "sha256": "fdbb539c6658405c8a81560a947a16cb9f9bb98241c272a9a3d9c844dc4898c8", + "regions": [ + { + "id": "TW-10002", + "name": "宜兰县", + "rings": 102, + "holes": 0 + }, + { + "id": "TW-10007", + "name": "彰化县", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10008", + "name": "南投县", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10009", + "name": "云林县", + "rings": 6, + "holes": 0 + }, + { + "id": "TW-10017", + "name": "基隆市", + "rings": 7, + "holes": 0 + }, + { + "id": "TW-63000", + "name": "台北市", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-65000", + "name": "新北市", + "rings": 1, + "holes": 1 + }, + { + "id": "TW-66000", + "name": "台中市", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-67000", + "name": "台南市", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-68000", + "name": "桃园市", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10005", + "name": "苗栗县", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10020", + "name": "嘉义市", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10010", + "name": "嘉义县", + "rings": 9, + "holes": 1 + }, + { + "id": "TW-64000", + "name": "高雄市", + "rings": 17, + "holes": 0 + }, + { + "id": "TW-10014", + "name": "台东县", + "rings": 10, + "holes": 0 + }, + { + "id": "TW-10015", + "name": "花莲县", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10016", + "name": "澎湖县", + "rings": 296, + "holes": 0 + }, + { + "id": "TW-10018", + "name": "新竹市", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10004", + "name": "新竹县", + "rings": 1, + "holes": 0 + }, + { + "id": "TW-10013", + "name": "屏东县", + "rings": 10, + "holes": 0 + } + ] + } + ] +} diff --git a/research/prefecture-map-index.json b/research/prefecture-map-index.json new file mode 100644 index 0000000..e0725cf --- /dev/null +++ b/research/prefecture-map-index.json @@ -0,0 +1,2736 @@ +{ + "downloadDate": "2026-10-16", + "source": "DataV.GeoAtlas", + "levels": [ + { + "id": "130000", + "name": "河北省", + "sha256": "c7e8f6d81bf815b309e081b17325f73134bfa6929332e1c135398e82216f70f7", + "regions": [ + { + "id": "130100", + "name": "石家庄市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130200", + "name": "唐山市", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "130300", + "name": "秦皇岛市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130400", + "name": "邯郸市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130500", + "name": "邢台市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130600", + "name": "保定市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130700", + "name": "张家口市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130800", + "name": "承德市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "130900", + "name": "沧州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "131000", + "name": "廊坊市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "131100", + "name": "衡水市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "140000", + "name": "山西省", + "sha256": "5da8144cc2d3a6ab6be40a63fd2ed099a33f1deae8e727214542e73f410ff607", + "regions": [ + { + "id": "140100", + "name": "太原市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140200", + "name": "大同市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140300", + "name": "阳泉市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140400", + "name": "长治市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140500", + "name": "晋城市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140600", + "name": "朔州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140700", + "name": "晋中市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140800", + "name": "运城市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "140900", + "name": "忻州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "141000", + "name": "临汾市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "141100", + "name": "吕梁市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "150000", + "name": "内蒙古自治区", + "sha256": "9a4a3b95d903b064c8e815b78d4f80f391b4bdafd3b52dabd854755457385660", + "regions": [ + { + "id": "150100", + "name": "呼和浩特市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150200", + "name": "包头市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150300", + "name": "乌海市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150400", + "name": "赤峰市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150500", + "name": "通辽市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150600", + "name": "鄂尔多斯市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150700", + "name": "呼伦贝尔市", + "unitType": "prefecture", + "rings": 1, + "holes": 1 + }, + { + "id": "150800", + "name": "巴彦淖尔市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "150900", + "name": "乌兰察布市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "152200", + "name": "兴安盟", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "152500", + "name": "锡林郭勒盟", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "152900", + "name": "阿拉善盟", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "210000", + "name": "辽宁省", + "sha256": "679ec739045413f4de0898a9d6a7957f6ffc551809f3f52c786a30d6242b02c5", + "regions": [ + { + "id": "210100", + "name": "沈阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "210200", + "name": "大连市", + "unitType": "prefecture", + "rings": 29, + "holes": 0 + }, + { + "id": "210300", + "name": "鞍山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "210400", + "name": "抚顺市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "210500", + "name": "本溪市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "210600", + "name": "丹东市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "210700", + "name": "锦州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "210800", + "name": "营口市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "210900", + "name": "阜新市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "211000", + "name": "辽阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "211100", + "name": "盘锦市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "211200", + "name": "铁岭市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "211300", + "name": "朝阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "211400", + "name": "葫芦岛市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + } + ] + }, + { + "id": "220000", + "name": "吉林省", + "sha256": "828be8771e676322a81f560611821230d66e1e1dca87308efd7865b27423e605", + "regions": [ + { + "id": "220100", + "name": "长春市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "220200", + "name": "吉林市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "220300", + "name": "四平市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "220400", + "name": "辽源市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "220500", + "name": "通化市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "220600", + "name": "白山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "220700", + "name": "松原市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "220800", + "name": "白城市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "222400", + "name": "延边朝鲜族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "230000", + "name": "黑龙江省", + "sha256": "f8d3bdbee4068811237efd23fe349a4c6e3bc99334079f9746f19e7df5ea4854", + "regions": [ + { + "id": "230100", + "name": "哈尔滨市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230200", + "name": "齐齐哈尔市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230300", + "name": "鸡西市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230400", + "name": "鹤岗市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230500", + "name": "双鸭山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230600", + "name": "大庆市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230700", + "name": "伊春市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "230800", + "name": "佳木斯市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "230900", + "name": "七台河市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "231000", + "name": "牡丹江市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "231100", + "name": "黑河市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "231200", + "name": "绥化市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "232700", + "name": "大兴安岭地区", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + } + ] + }, + { + "id": "320000", + "name": "江苏省", + "sha256": "6af17f07a3c83bad7d4d552efdd7f59ba8f7574363d1a686f59bc1d0f91733e7", + "regions": [ + { + "id": "320100", + "name": "南京市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "320200", + "name": "无锡市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "320300", + "name": "徐州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "320400", + "name": "常州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "320500", + "name": "苏州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "320600", + "name": "南通市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "320700", + "name": "连云港市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "320800", + "name": "淮安市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "320900", + "name": "盐城市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "321000", + "name": "扬州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "321100", + "name": "镇江市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "321200", + "name": "泰州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "321300", + "name": "宿迁市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "330000", + "name": "浙江省", + "sha256": "f87241d47687264861aa619b8dc37ffeb61a2be5d6018a8c01ec0ce0acb5cb38", + "regions": [ + { + "id": "330100", + "name": "杭州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "330200", + "name": "宁波市", + "unitType": "prefecture", + "rings": 19, + "holes": 0 + }, + { + "id": "330300", + "name": "温州市", + "unitType": "prefecture", + "rings": 22, + "holes": 0 + }, + { + "id": "330400", + "name": "嘉兴市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "330500", + "name": "湖州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "330600", + "name": "绍兴市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "330700", + "name": "金华市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "330800", + "name": "衢州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "330900", + "name": "舟山市", + "unitType": "prefecture", + "rings": 94, + "holes": 0 + }, + { + "id": "331000", + "name": "台州市", + "unitType": "prefecture", + "rings": 23, + "holes": 0 + }, + { + "id": "331100", + "name": "丽水市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "340000", + "name": "安徽省", + "sha256": "7ca3290e0458f34086df4d61fa9804e2c624d55dfe5f8f6a841844b5dcd43207", + "regions": [ + { + "id": "340100", + "name": "合肥市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "340200", + "name": "芜湖市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "340300", + "name": "蚌埠市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "340400", + "name": "淮南市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "340500", + "name": "马鞍山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "340600", + "name": "淮北市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "340700", + "name": "铜陵市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "340800", + "name": "安庆市", + "unitType": "prefecture", + "rings": 1, + "holes": 1 + }, + { + "id": "341000", + "name": "黄山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "341100", + "name": "滁州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "341200", + "name": "阜阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "341300", + "name": "宿州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "341500", + "name": "六安市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "341600", + "name": "亳州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "341700", + "name": "池州市", + "unitType": "prefecture", + "rings": 1, + "holes": 3 + }, + { + "id": "341800", + "name": "宣城市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "350000", + "name": "福建省", + "sha256": "0c749acd0048a5042a5ee701ddd5a87c17ff91afb9b728d23b7253799135b58f", + "regions": [ + { + "id": "350100", + "name": "福州市", + "unitType": "prefecture", + "rings": 26, + "holes": 0 + }, + { + "id": "350200", + "name": "厦门市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "350300", + "name": "莆田市", + "unitType": "prefecture", + "rings": 12, + "holes": 0 + }, + { + "id": "350400", + "name": "三明市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "350500", + "name": "泉州市", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "350600", + "name": "漳州市", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "350700", + "name": "南平市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "350800", + "name": "龙岩市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "350900", + "name": "宁德市", + "unitType": "prefecture", + "rings": 27, + "holes": 0 + } + ] + }, + { + "id": "360000", + "name": "江西省", + "sha256": "ee9696faaca6e644fb0f1aebfc0bd800beb938dd2eb1737fcb8b244072405d9e", + "regions": [ + { + "id": "360100", + "name": "南昌市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360200", + "name": "景德镇市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360300", + "name": "萍乡市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360400", + "name": "九江市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "360500", + "name": "新余市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360600", + "name": "鹰潭市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360700", + "name": "赣州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360800", + "name": "吉安市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "360900", + "name": "宜春市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "361000", + "name": "抚州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "361100", + "name": "上饶市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "370000", + "name": "山东省", + "sha256": "04d600e257db17869aa7fabcfcd6a87a7236791a7f02dd891636f5f58da0133f", + "regions": [ + { + "id": "370100", + "name": "济南市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "370200", + "name": "青岛市", + "unitType": "prefecture", + "rings": 8, + "holes": 0 + }, + { + "id": "370300", + "name": "淄博市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "370400", + "name": "枣庄市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "370500", + "name": "东营市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "370600", + "name": "烟台市", + "unitType": "prefecture", + "rings": 19, + "holes": 0 + }, + { + "id": "370700", + "name": "潍坊市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "370800", + "name": "济宁市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "370900", + "name": "泰安市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "371000", + "name": "威海市", + "unitType": "prefecture", + "rings": 6, + "holes": 0 + }, + { + "id": "371100", + "name": "日照市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "371300", + "name": "临沂市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "371400", + "name": "德州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "371500", + "name": "聊城市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "371600", + "name": "滨州市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "371700", + "name": "菏泽市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "410000", + "name": "河南省", + "sha256": "34119256db754324763c8484122d71524818c9cec974207bd27a9aafe2d8ad63", + "regions": [ + { + "id": "410100", + "name": "郑州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410200", + "name": "开封市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410300", + "name": "洛阳市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "410400", + "name": "平顶山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410500", + "name": "安阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410600", + "name": "鹤壁市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410700", + "name": "新乡市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410800", + "name": "焦作市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "410900", + "name": "濮阳市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "411000", + "name": "许昌市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "411100", + "name": "漯河市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "411200", + "name": "三门峡市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "411300", + "name": "南阳市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "411400", + "name": "商丘市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "411500", + "name": "信阳市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "411600", + "name": "周口市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "411700", + "name": "驻马店市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "419001", + "name": "济源市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "420000", + "name": "湖北省", + "sha256": "0acb559fcfe2ab2c5d2707c2477e60facdf4328ad89b8ab7d9126c5166675502", + "regions": [ + { + "id": "420100", + "name": "武汉市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "420200", + "name": "黄石市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "420300", + "name": "十堰市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "420500", + "name": "宜昌市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "420600", + "name": "襄阳市", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "420700", + "name": "鄂州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "420800", + "name": "荆门市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "420900", + "name": "孝感市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "421000", + "name": "荆州市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "421100", + "name": "黄冈市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "421200", + "name": "咸宁市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "421300", + "name": "随州市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "422800", + "name": "恩施土家族苗族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "429004", + "name": "仙桃市", + "unitType": "province-direct", + "rings": 2, + "holes": 0 + }, + { + "id": "429005", + "name": "潜江市", + "unitType": "province-direct", + "rings": 5, + "holes": 0 + }, + { + "id": "429006", + "name": "天门市", + "unitType": "province-direct", + "rings": 6, + "holes": 0 + }, + { + "id": "429021", + "name": "神农架林区", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "430000", + "name": "湖南省", + "sha256": "091cb4e77e2bc73fb37c8a9b3b174db9b2008db5f544a7156f5a8ad34e77dd66", + "regions": [ + { + "id": "430100", + "name": "长沙市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430200", + "name": "株洲市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430300", + "name": "湘潭市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430400", + "name": "衡阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430500", + "name": "邵阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430600", + "name": "岳阳市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "430700", + "name": "常德市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430800", + "name": "张家界市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "430900", + "name": "益阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "431000", + "name": "郴州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "431100", + "name": "永州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "431200", + "name": "怀化市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "431300", + "name": "娄底市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "433100", + "name": "湘西土家族苗族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "440000", + "name": "广东省", + "sha256": "209ad617a296b154c4fd0828180b2a9ab2b270044990ab34e72a344ce913c8c7", + "regions": [ + { + "id": "440100", + "name": "广州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "440200", + "name": "韶关市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "440300", + "name": "深圳市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "440400", + "name": "珠海市", + "unitType": "prefecture", + "rings": 27, + "holes": 0 + }, + { + "id": "440500", + "name": "汕头市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "440600", + "name": "佛山市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "440700", + "name": "江门市", + "unitType": "prefecture", + "rings": 11, + "holes": 0 + }, + { + "id": "440800", + "name": "湛江市", + "unitType": "prefecture", + "rings": 12, + "holes": 0 + }, + { + "id": "440900", + "name": "茂名市", + "unitType": "prefecture", + "rings": 6, + "holes": 0 + }, + { + "id": "441200", + "name": "肇庆市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "441300", + "name": "惠州市", + "unitType": "prefecture", + "rings": 8, + "holes": 0 + }, + { + "id": "441400", + "name": "梅州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "441500", + "name": "汕尾市", + "unitType": "prefecture", + "rings": 7, + "holes": 0 + }, + { + "id": "441600", + "name": "河源市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "441700", + "name": "阳江市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "441800", + "name": "清远市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "441900", + "name": "东莞市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "442000", + "name": "中山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "445100", + "name": "潮州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "445200", + "name": "揭阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "445300", + "name": "云浮市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "450000", + "name": "广西壮族自治区", + "sha256": "5bdcaa8808d78065be4a496718b449c5b97d1ef27900bbfcd2407f69c5f6c041", + "regions": [ + { + "id": "450100", + "name": "南宁市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "450200", + "name": "柳州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "450300", + "name": "桂林市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "450400", + "name": "梧州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "450500", + "name": "北海市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "450600", + "name": "防城港市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "450700", + "name": "钦州市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "450800", + "name": "贵港市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "450900", + "name": "玉林市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "451000", + "name": "百色市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "451100", + "name": "贺州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "451200", + "name": "河池市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "451300", + "name": "来宾市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "451400", + "name": "崇左市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "460000", + "name": "海南省", + "sha256": "ae44b392cf32ff7f7df5466ca16fa7f1b70b9fb9c36f00f54d6f142d011c65e4", + "regions": [ + { + "id": "460100", + "name": "海口市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "460200", + "name": "三亚市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "460300", + "name": "三沙市", + "unitType": "prefecture", + "rings": 112, + "holes": 0 + }, + { + "id": "460400", + "name": "儋州市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "469001", + "name": "五指山市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469002", + "name": "琼海市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469005", + "name": "文昌市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469006", + "name": "万宁市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469007", + "name": "东方市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469021", + "name": "定安县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469022", + "name": "屯昌县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469023", + "name": "澄迈县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469024", + "name": "临高县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469025", + "name": "白沙黎族自治县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469026", + "name": "昌江黎族自治县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469027", + "name": "乐东黎族自治县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469028", + "name": "陵水黎族自治县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469029", + "name": "保亭黎族苗族自治县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "469030", + "name": "琼中黎族苗族自治县", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "510000", + "name": "四川省", + "sha256": "e8e3a3820d97ca3453c18c6335703f4e4f93df95ba394a1259eebab59e7072b1", + "regions": [ + { + "id": "510100", + "name": "成都市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "510300", + "name": "自贡市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "510400", + "name": "攀枝花市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "510500", + "name": "泸州市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "510600", + "name": "德阳市", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "510700", + "name": "绵阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "510800", + "name": "广元市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "510900", + "name": "遂宁市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "511000", + "name": "内江市", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "511100", + "name": "乐山市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "511300", + "name": "南充市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "511400", + "name": "眉山市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "511500", + "name": "宜宾市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "511600", + "name": "广安市", + "unitType": "prefecture", + "rings": 8, + "holes": 0 + }, + { + "id": "511700", + "name": "达州市", + "unitType": "prefecture", + "rings": 6, + "holes": 0 + }, + { + "id": "511800", + "name": "雅安市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "511900", + "name": "巴中市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "512000", + "name": "资阳市", + "unitType": "prefecture", + "rings": 6, + "holes": 0 + }, + { + "id": "513200", + "name": "阿坝藏族羌族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "513300", + "name": "甘孜藏族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "513400", + "name": "凉山彝族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + } + ] + }, + { + "id": "520000", + "name": "贵州省", + "sha256": "3336ddee76a8d33a5841f928c764ec4e4bb33988ec59d08efc75000251af1cf6", + "regions": [ + { + "id": "520100", + "name": "贵阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "520200", + "name": "六盘水市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "520300", + "name": "遵义市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "520400", + "name": "安顺市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "520500", + "name": "毕节市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "520600", + "name": "铜仁市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "522300", + "name": "黔西南布依族苗族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "522600", + "name": "黔东南苗族侗族自治州", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "522700", + "name": "黔南布依族苗族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + } + ] + }, + { + "id": "530000", + "name": "云南省", + "sha256": "c11c7adf7581fc53e965bf0fd2b3217213f118c59ebddf4cab929c51ee00aa6e", + "regions": [ + { + "id": "530100", + "name": "昆明市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "530300", + "name": "曲靖市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "530400", + "name": "玉溪市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "530500", + "name": "保山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "530600", + "name": "昭通市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "530700", + "name": "丽江市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "530800", + "name": "普洱市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "530900", + "name": "临沧市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "532300", + "name": "楚雄彝族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "532500", + "name": "红河哈尼族彝族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "532600", + "name": "文山壮族苗族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "532800", + "name": "西双版纳傣族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "532900", + "name": "大理白族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "533100", + "name": "德宏傣族景颇族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "533300", + "name": "怒江傈僳族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "533400", + "name": "迪庆藏族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "540000", + "name": "西藏自治区", + "sha256": "ba95ab3f6b9183942c183d66d1258ac710dcdf9cb49c51f79915532379747c81", + "regions": [ + { + "id": "540100", + "name": "拉萨市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "540200", + "name": "日喀则市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "540300", + "name": "昌都市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "540400", + "name": "林芝市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "540500", + "name": "山南市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "540600", + "name": "那曲市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "542500", + "name": "阿里地区", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "610000", + "name": "陕西省", + "sha256": "969ca94cc865bf3a37c22e30d7c0125196fd22175f7c212953185f7c67921682", + "regions": [ + { + "id": "610100", + "name": "西安市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "610200", + "name": "铜川市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "610300", + "name": "宝鸡市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "610400", + "name": "咸阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "610500", + "name": "渭南市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "610600", + "name": "延安市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "610700", + "name": "汉中市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "610800", + "name": "榆林市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "610900", + "name": "安康市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "611000", + "name": "商洛市", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + } + ] + }, + { + "id": "620000", + "name": "甘肃省", + "sha256": "5252d2ce49a7b6f721d5ca9404a2960b428fab09b6f62256fe62db0218d1123e", + "regions": [ + { + "id": "620100", + "name": "兰州市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "620200", + "name": "嘉峪关市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "620300", + "name": "金昌市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "620400", + "name": "白银市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "620500", + "name": "天水市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "620600", + "name": "武威市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "620700", + "name": "张掖市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "620800", + "name": "平凉市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "620900", + "name": "酒泉市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "621000", + "name": "庆阳市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "621100", + "name": "定西市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "621200", + "name": "陇南市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "622900", + "name": "临夏回族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "623000", + "name": "甘南藏族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "630000", + "name": "青海省", + "sha256": "42caf689c3c37630aa725bac2351153bac00fb626a01fbe5f141c3a279706936", + "regions": [ + { + "id": "630100", + "name": "西宁市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "630200", + "name": "海东市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "632200", + "name": "海北藏族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "632300", + "name": "黄南藏族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "632500", + "name": "海南藏族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "632600", + "name": "果洛藏族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "632700", + "name": "玉树藏族自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "632800", + "name": "海西蒙古族藏族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + } + ] + }, + { + "id": "640000", + "name": "宁夏回族自治区", + "sha256": "99e03114c3f7dff3fad5b87a88ddf2fb08687d117c62bf999236191ca29d78f9", + "regions": [ + { + "id": "640100", + "name": "银川市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "640200", + "name": "石嘴山市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "640300", + "name": "吴忠市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "640400", + "name": "固原市", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "640500", + "name": "中卫市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + } + ] + }, + { + "id": "650000", + "name": "新疆维吾尔自治区", + "sha256": "587b5069eddcad4b5a2f784380351f756f0ba955211721091b85a6528ae74745", + "regions": [ + { + "id": "650100", + "name": "乌鲁木齐市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "650200", + "name": "克拉玛依市", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "650400", + "name": "吐鲁番市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "650500", + "name": "哈密市", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "652300", + "name": "昌吉回族自治州", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "652700", + "name": "博尔塔拉蒙古自治州", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "652800", + "name": "巴音郭楞蒙古自治州", + "unitType": "prefecture", + "rings": 3, + "holes": 0 + }, + { + "id": "652900", + "name": "阿克苏地区", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "653000", + "name": "克孜勒苏柯尔克孜自治州", + "unitType": "prefecture", + "rings": 1, + "holes": 0 + }, + { + "id": "653100", + "name": "喀什地区", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "653200", + "name": "和田地区", + "unitType": "prefecture", + "rings": 5, + "holes": 0 + }, + { + "id": "654000", + "name": "伊犁哈萨克自治州", + "unitType": "prefecture", + "rings": 4, + "holes": 0 + }, + { + "id": "654200", + "name": "塔城地区", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "654300", + "name": "阿勒泰地区", + "unitType": "prefecture", + "rings": 2, + "holes": 0 + }, + { + "id": "659001", + "name": "石河子市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "659002", + "name": "阿拉尔市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "659003", + "name": "图木舒克市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "659004", + "name": "五家渠市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + }, + { + "id": "659005", + "name": "北屯市", + "unitType": "province-direct", + "rings": 2, + "holes": 0 + }, + { + "id": "659006", + "name": "铁门关市", + "unitType": "province-direct", + "rings": 3, + "holes": 0 + }, + { + "id": "659007", + "name": "双河市", + "unitType": "province-direct", + "rings": 5, + "holes": 0 + }, + { + "id": "659008", + "name": "可克达拉市", + "unitType": "province-direct", + "rings": 5, + "holes": 0 + }, + { + "id": "659009", + "name": "昆玉市", + "unitType": "province-direct", + "rings": 6, + "holes": 0 + }, + { + "id": "659010", + "name": "胡杨河市", + "unitType": "province-direct", + "rings": 1, + "holes": 0 + } + ] + } + ] +} diff --git a/scripts/audit-county-maps.cjs b/scripts/audit-county-maps.cjs new file mode 100644 index 0000000..62f6f76 --- /dev/null +++ b/scripts/audit-county-maps.cjs @@ -0,0 +1,19 @@ +const fs=require('node:fs'),vm=require('node:vm'),assert=require('node:assert/strict'),{createHash}=require('node:crypto'),decomp=require('poly-decomp'); +const index=JSON.parse(fs.readFileSync('research/county-map-index.json','utf8')),context={window:{}};vm.runInNewContext(fs.readFileSync('dist/county-index.js','utf8'),context);const catalog=context.window.COUNTY_INDEX; +assert.equal(index.levels.length,329);assert.equal(catalog.levels.length,329);assert.equal(index.unavailable.length,4);assert.deepEqual(Array.from(catalog.unavailable,l=>l.id).sort(),['441900','442000','460400','620200']); +const parents=JSON.parse(fs.readFileSync('research/prefecture-map-index.json','utf8')).levels.flatMap(p=>p.regions.filter(r=>r.unitType==='prefecture').map(r=>({...r,province:p.id}))); +assert.deepEqual(index.levels.concat(index.unavailable).map(l=>l.id).sort(),parents.map(l=>l.id).sort());for(const entry of index.levels.concat(index.unavailable)){const parent=parents.find(p=>p.id===entry.id);assert.equal(entry.name,parent.name);assert.equal(entry.province,parent.province);} +const packages=new Map();for(const meta of catalog.levels){assert.ok(/^\.\/county\/\d{6}\.js$/.test(meta.path));if(!packages.has(meta.path))packages.set(meta.path,[]);packages.get(meta.path).push(meta);} +assert.deepEqual(fs.readdirSync('dist/county').sort(),Array.from(packages.keys(),p=>p.split('/').pop()).sort());const packedLevels=new Map();for(const [path,metas] of packages){assert.ok(metas.length>=1&&metas.length<=2);assert.equal(new Set(metas.map(m=>m.province)).size,1);metas.sort((a,b)=>a.id.localeCompare(b.id));assert.equal(path,'./county/'+metas[0].id+'.js');const text=fs.readFileSync('dist/'+path.slice(2),'utf8');assert.equal(text,metas.map(m=>fs.readFileSync('src/county/'+m.id+'.js','utf8')).join('\n'));const local=[];vm.runInNewContext(text,{window:{PuzzleAtlas:{register:value=>{assert.ok(!packedLevels.has(value.id));packedLevels.set(value.id,value);local.push(value.id);}}}});assert.deepEqual(local,metas.map(m=>m.id));} +assert.equal(packedLevels.size,329);let pieces=0,rings=0,holes=0,repairs=0; +for(const entry of index.levels){ + const text=fs.readFileSync('src/county/'+entry.id+'.js','utf8');assert.equal(createHash('sha256').update(text).digest('hex'),entry.assetSha256); + const level=packedLevels.get(entry.id),meta=catalog.levels.find(l=>l.id===entry.id);assert.ok(meta);assert.equal(meta.count,entry.regions.length);assert.equal(level.province,entry.province);assert.equal(level.kind,'county');assert.equal(level.regions.length,entry.regions.length);assert.equal(level.id,entry.id); + const seen=new Set();for(const r of level.regions){const source=entry.regions.find(v=>v.id===r.id);assert.ok(source);assert.ok(!seen.has(r.id));seen.add(r.id);assert.equal(r.name,source.name);assert.equal(r.rings.length,source.rings);assert.equal((r.holes||[]).length,source.holes);repairs+=source.repairedSourcePolygons; + for(const ring of r.rings.concat(r.holes||[])){assert.ok(ring.length>=3);assert.ok(ring.every(p=>p.length===2&&p.every(Number.isFinite)));assert.ok(decomp.isSimple(ring),r.name+' must have a simple boundary');let area=0;for(let i=0;i1e-10);} + if((r.holes&&r.holes.length)||(entry.collisionFallbacks||[]).includes(r.id))assert.ok(r.physics&&r.physics.length);pieces++;rings+=r.rings.length;holes+=(r.holes||[]).length; + } + // Every county participates in a connected puzzle, including marked island routes. + const connected=new Set([0]);for(let i=0;i=0&&b>=0&&a=0&&type<=2);if(connected.has(a)||connected.has(b)){connected.add(a);connected.add(b);}}assert.equal(connected.size,level.regions.length,level.name+' puzzle must be connected'); +} +assert.equal(pieces,2728);const report={passed:true,stages:329,countyFiles:packages.size,pieces,rings,holes,repairedSourcePolygons:repairs,exceptions:index.unavailable,scope:'Frozen provider coverage, source names/IDs, topology repairs, static collision holes and all local assets; not current authoritative administrative validation.'};fs.writeFileSync('artifacts/county-map-audit.json',JSON.stringify(report,null,2));console.log('县区关卡核对通过:329关、2728块、'+packages.size+'个县区文件,本地文件/来源索引/父级/边界拓扑/内环碰撞/关卡连通性完整。'); diff --git a/scripts/audit-maps.cjs b/scripts/audit-maps.cjs index 29d5be9..2d13efb 100644 --- a/scripts/audit-maps.cjs +++ b/scripts/audit-maps.cjs @@ -1,5 +1,5 @@ const fs=require('node:fs'),vm=require('node:vm'),assert=require('node:assert/strict'); -const context={window:{}};vm.runInNewContext(fs.readFileSync('src/maps.js','utf8'),context);const data=context.window.MAP_DATA,level=data.levels[0],source=JSON.parse(fs.readFileSync('research/china.json','utf8')); +const context={window:{}};assert.equal(fs.readFileSync('dist/maps.js','utf8'),fs.readFileSync('src/maps.js','utf8'),'地图源素材与构建产物必须一致,请在地图生成完成后重新构建');vm.runInNewContext(fs.readFileSync('dist/maps.js','utf8'),context);const data=context.window.MAP_DATA,level=data.levels[0],source=JSON.parse(fs.readFileSync('research/china.json','utf8')); const expected=['110000','120000','130000','140000','150000','210000','220000','230000','310000','320000','330000','340000','350000','360000','370000','410000','420000','430000','440000','450000','460000','500000','510000','520000','530000','540000','610000','620000','630000','640000','650000','710000','810000','820000']; assert.deepEqual(Array.from(level.regions,r=>r.id).sort(),expected.slice().sort()); const regions=level.regions.map(r=>{const f=source.features.find(f=>String(f.properties.adcode)===r.id),raw=f.geometry.type==='MultiPolygon'?f.geometry.coordinates:[f.geometry.coordinates];assert.equal(r.name,f.properties.name);assert.equal(r.rings.length,raw.length,r.name+'不得丢弃独立外环');for(const ring of r.rings){assert.ok(ring.length>=3);assert.ok(ring.every(p=>p.length===2&&p.every(Number.isFinite)));let area=0;for(let i=0;i1e-10,r.name+'存在退化外环');}return {id:r.id,name:r.name,sourcePolygonCount:raw.length,packagedPolygonCount:r.rings.length};}); @@ -7,3 +7,24 @@ const maritime=source.features.find(f=>f.properties.adcode==='100000_JD');assert assert.ok(level.edges.some(e=>e[2]===1&&(level.regions[e[0]].id==='710000'||level.regions[e[1]].id==='710000'))); const report={passed:true,provinceCount:34,regions,maritimeSegments:level.decorations.length,taiwanIncluded:true,hongKongIncluded:true,macaoIncluded:true,countyAndPrefectureLimitation:'台湾省地级轮廓接口404;无对应地级关卡。直辖市、港澳不设地级单元关卡。',scope:'验证34项名称/代码及源数据外环未丢失,不等于标准地图审图或所有最新区划/全部岛礁的独立权威核验。',mapContentReference:'https://www.gov.cn/gongbao/content/2023/content_5752310.htm'}; fs.writeFileSync('artifacts/map-audit.json',JSON.stringify(report,null,2));console.log('地图核对通过:34省级行政区,含台湾/香港/澳门;全部源外环保留,海域线层'+level.decorations.length+'段。'); +// A province endpoint lists all immediate children. Audit the frozen source +// list, including province-administered county-level peers, not only counts. +const provinceIndex=JSON.parse(fs.readFileSync('research/prefecture-map-index.json','utf8')); +assert.equal(provinceIndex.levels.length,27);let provinceDirectPieces=0,prefecturePieces=0; +for(const entry of provinceIndex.levels){ + const lv=data.levels.find(l=>l.id===entry.id);assert.ok(lv&&lv.kind==='prefecture'); + assert.deepEqual(Array.from(lv.regions,r=>r.id).sort(),entry.regions.map(r=>r.id).sort(),entry.name+'不得过滤省直辖地区或遗漏源子区域'); + assert.equal(new Set(lv.regions.map(r=>r.id)).size,lv.regions.length); + for(const r of lv.regions){const expected=entry.regions.find(v=>v.id===r.id);assert.equal(r.name,expected.name);assert.equal(r.unitType,expected.unitType);assert.equal(r.rings.length,expected.rings,r.name+'源外环必须保留');assert.equal((r.holes||[]).length,expected.holes,r.name+'源内环必须保留');if(r.unitType==='province-direct')provinceDirectPieces++;else prefecturePieces++;for(const ring of r.rings.concat(r.holes||[]))assert.ok(ring.length>=3&&ring.every(p=>p.every(Number.isFinite)));if(r.holes&&r.holes.length)assert.ok(r.physics&&r.physics.length);} + const direct=entry.regions.filter(r=>r.unitType==='province-direct').length; + assert.equal(lv.directRegionCount||0,direct);if(direct){assert.equal(lv.playLabel,'省域拼图');assert.ok(lv.unitCaption.includes('省直辖'));} +} +assert.equal(prefecturePieces,333);assert.equal(provinceDirectPieces,30); +const hainan=data.levels.find(l=>l.id==='460000');assert.ok(hainan.mapInsets&&hainan.mapInsets.length===1);assert.equal(hainan.mapInsets[0].id,'460300');assert.ok(hainan.mapInsets[0].label.includes('缩放移位示意'));assert.ok(hainan.scopeNote.includes('三沙')); +report.prefectureLevels=27;report.prefecturePieces=prefecturePieces;report.provinceDirectPieces=provinceDirectPieces;report.provinceChildPieces=prefecturePieces+provinceDirectPieces; +console.log('省内完整性核对通过:27关、333个地级单元及30个省直辖地区,全部源子区域/外环/内环保留。'); +// The detailed-level index records source IDs, names and exterior/hole counts. +const detailIndex=JSON.parse(fs.readFileSync('research/detail-map-index.json','utf8')); +assert.equal(detailIndex.levels.length,7);let detailPieces=0; +for(const entry of detailIndex.levels){const lv=data.levels.find(l=>l.id===entry.id);assert.ok(lv&&lv.kind===entry.kind);assert.equal(lv.regions.length,entry.regions.length);for(const r of lv.regions){const raw=entry.regions.find(v=>v.id===r.id);assert.ok(raw);assert.equal(r.name,raw.name);assert.equal(r.rings.length,raw.rings,r.name+'源外环必须保留');assert.equal((r.holes||[]).length,raw.holes||0,r.name+'源内环必须保留');for(const ring of r.rings.concat(r.holes||[])){assert.ok(ring.length>=3);assert.ok(ring.every(p=>p.every(Number.isFinite)));}if(r.holes&&r.holes.length)assert.ok(r.physics&&r.physics.length);detailPieces++;}} +report.detailedLevels=detailIndex.levels.map(l=>({id:l.id,name:l.name,kind:l.kind,pieces:l.regions.length,source:l.source,snapshot:l.snapshot}));report.detailedPieces=detailPieces;report.countyAndPrefectureLimitation='四直辖市县区、香港/澳门分区、台湾县市细分关卡已开放;台湾远海岛屿移位示意,金门/连江不重复列入台湾。';fs.writeFileSync('artifacts/map-audit.json',JSON.stringify(report,null,2));console.log('细分地图核对通过:7个新增关卡、'+detailPieces+'块,源外环/内环及类型标注完整。'); diff --git a/scripts/build.mjs b/scripts/build.mjs index 17930ca..3438161 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -1,15 +1,23 @@ import fs from 'node:fs'; import path from 'node:path'; -import {transform} from 'esbuild'; +import vm from 'node:vm'; +import packCountyMaps from './pack-county-maps.cjs'; +import {transform,build} from 'esbuild'; import {execFileSync} from 'node:child_process'; fs.rmSync('dist',{force:true,recursive:true});fs.mkdirSync('dist/vendor',{recursive:true}); for(const name of ['index.html','style.css','maps.js'])fs.copyFileSync('src/'+name,'dist/'+name); -for(const name of ['core.js','game.js','result.js','app.js']){const result=await transform(fs.readFileSync('src/'+name,'utf8'),{target:['chrome61'],minify:true,legalComments:'inline'});fs.writeFileSync('dist/'+name,result.code);} +for(const name of ['core.js','atlas.js','game.js','result.js','app.js']){const result=await transform(fs.readFileSync('src/'+name,'utf8'),{target:['chrome61'],minify:true,legalComments:'inline'});fs.writeFileSync('dist/'+name,result.code);} +await build({entryPoints:['src/video.js'],outfile:'dist/video.js',bundle:true,format:'iife',target:['es2017','chrome61'],minify:true,legalComments:'inline'}); +const countyContext={window:{}};vm.runInNewContext(fs.readFileSync('src/county-index.js','utf8'),countyContext); +const countyPackage=packCountyMaps(countyContext.window.COUNTY_INDEX,id=>fs.readFileSync('src/county/'+id+'.js','utf8')); +fs.writeFileSync('dist/county-index.js','window.COUNTY_INDEX='+JSON.stringify(countyPackage.index)+';\n'); +fs.mkdirSync('dist/county',{recursive:true});for(const [file,text] of countyPackage.files)fs.writeFileSync('dist/'+file,text); for(const name of ['matter.min.js','decomp.min.js'])fs.copyFileSync('src/vendor/'+name,'dist/vendor/'+name); // Include third-party notices in an allowed local asset, outside game UI. -fs.writeFileSync('dist/licenses.json',JSON.stringify({matter:{version:'0.20.0',license:fs.readFileSync('node_modules/matter-js/LICENSE','utf8')},decomp:{version:'0.3.0',license:fs.readFileSync('node_modules/poly-decomp/LICENSE','utf8')},maps:{source:'DataV.GeoAtlas',url:'https://datav.aliyun.com/portal/school/atlas/area_selector',downloaded:'2026-10-16',note:'Public data; geographic outlines simplified for a game. Original provider terms apply.'}},null,2)); +fs.writeFileSync('dist/licenses.json',JSON.stringify({matter:{version:'0.20.0',license:fs.readFileSync('node_modules/matter-js/LICENSE','utf8')},decomp:{version:'0.3.0',license:fs.readFileSync('node_modules/poly-decomp/LICENSE','utf8')},mp4Muxer:{version:'5.2.2',license:fs.readFileSync('node_modules/mp4-muxer/LICENSE','utf8')},taiwanCounty:{source:'NLSC',snapshot:'COUNTY_MOI_1090820',url:'https://data.gov.tw/dataset/7442',license:'政府資料開放授權條款第1版',licenseURL:'https://data.gov.tw/license',downloaded:'2026-10-17',note:'County/city outlines simplified for gameplay; remote island clusters use a labelled translated inset. Kinmen and Lienchiang belong to Fujian and are not duplicated in the Taiwan level.'},maps:{source:'DataV.GeoAtlas',url:'https://datav.aliyun.com/portal/school/atlas/area_selector',downloaded:'2026-10-16',note:'Public data; geographic outlines simplified for a game. Original provider terms apply.'}},null,2)); execFileSync(process.execPath,['scripts/check.mjs'],{stdio:'inherit'}); execFileSync(process.execPath,['scripts/audit-maps.cjs'],{stdio:'inherit'}); +execFileSync(process.execPath,['scripts/audit-county-maps.cjs'],{stdio:'inherit'}); fs.mkdirSync('artifacts',{recursive:true});const audit='.codex/skills/minitool-zip-builder/scripts/audit_artifact.py'; if(!fs.existsSync(audit))throw Error('缺少用户指定官方 Skill,请先安装 1.8.0。'); const dirAudit=execFileSync('python3',[audit,'dist'],{encoding:'utf8'});console.log('官方目录审计:'+dirAudit.trim()); diff --git a/scripts/check.mjs b/scripts/check.mjs index 3b922ac..38624a1 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -2,6 +2,7 @@ import fs from 'node:fs';import path from 'node:path';import {parse} from 'acorn const issues=[];const root='dist'; function walk(dir){return fs.readdirSync(dir,{withFileTypes:true}).flatMap(d=>d.isDirectory()?walk(path.join(dir,d.name)):[path.join(dir,d.name)]);} const files=walk(root),allowed=new Set(['.html','.css','.js','.json','.png','.jpg','.jpeg','.webp','.gif','.svg','.woff','.woff2']); +if(files.length>200)issues.push('ZIP文件数量超过200个上限: '+files.length); for(const f of files){if(!allowed.has(path.extname(f)))issues.push('不允许的文件类型: '+f);if(path.basename(f).startsWith('.'))issues.push('隐藏文件: '+f);const source=fs.readFileSync(f,'utf8');if(f.endsWith('.js')){try{parse(source,{ecmaVersion:2017});}catch(e){issues.push('非 ES2017 语法: '+f+' '+e.message);}const banned=[/\beval\s*\(/,/\bnew\s+Function\s*\(/,/\bfetch\s*\(/,/\bXMLHttpRequest\b/,/\bWebAssembly\b/,/\bnew\s+(?:SharedWorker|Worker|WebSocket|EventSource)\s*\(/,/navigator\.(?:clipboard|geolocation)/,/requestFullscreen\s*\(/,/window\.open\s*\(/];for(const re of banned)if(re.test(source))issues.push('禁用能力 '+re+' '+f);} if(f.endsWith('.html')){for(const m of source.matchAll(/]*>([\s\S]*?)<\/script>/gi))if(m[1].trim())issues.push('内联脚本');if(/\son[a-z]+\s*=/i.test(source))issues.push('行内事件');if(/]+Content-Security-Policy|type=[\"']module[\"']/i.test(source))issues.push('自建CSP或模块脚本');if(/<(?:iframe|object|form)\b|javascript:|\sdownload[\s=>]/i.test(source))issues.push('禁止的 HTML 能力');for(const m of source.matchAll(/(?:src|href)="([^"#]+)"/g)){if(!m[1].startsWith('./'))issues.push('非相对本地资源: '+m[1]);else if(!fs.existsSync(path.join(root,m[1])))issues.push('缺失资源: '+m[1]);}} if(f.endsWith('.css')){for(const m of source.matchAll(/url\(([^)]+)\)/g))if(/https?:|\/\//.test(m[1]))issues.push('外部样式资源');const banned=[/[;{]\s*gap\s*:/,/\bclamp\(/,/\bcolor-mix\(/,/\bdvh\b/,/\baspect-ratio\s*:/];for(const re of banned)if(re.test(source))issues.push('无降级的现代 CSS '+re);}} diff --git a/scripts/fetch-city-county-gis.py b/scripts/fetch-city-county-gis.py new file mode 100644 index 0000000..0aa8317 --- /dev/null +++ b/scripts/fetch-city-county-gis.py @@ -0,0 +1,224 @@ +"""Download/audit county GIS inputs without changing the released game maps. + +Raw source geometry, reproducible per-city game coordinates and a provenance +manifest live in ignored data/. Four cities without county children retain +their whole-city outline instead of fabricated county or township polygons. +""" +import argparse +import concurrent.futures +import datetime +import hashlib +import json +import math +import pathlib +import time +import urllib.error +import urllib.request +import zipfile + +from map_geometry import make_level, place_labels + +ROOT = pathlib.Path(__file__).resolve().parent.parent +BASE = "https://geo.datav.aliyun.com/areas_v3/bound/" +EXCEPTIONS = { + "441900": "https://www.dg.gov.cn/zjdz/dzgk/xzqh/content/post_2824924.html", + "442000": "https://www.zs.gov.cn/zjzs/zsgk/content/post_1669002.html", + "460400": "https://www.danzhou.gov.cn/danzhou/index.html", + "620200": "https://wap.jyg.gov.cn/zjjyg/", +} + + +def read_json(path): + return json.loads(path.read_text()) + + +def inspect_features(data, parent, whole=False): + if data.get("type") != "FeatureCollection" or not data.get("features"): + raise ValueError("Expected a non-empty FeatureCollection") + entries, seen = [], set() + for feature in data["features"]: + prop = feature.get("properties", {}) + code = str(prop.get("adcode", "")) + if not code.isdigit() or code in seen or not prop.get("name"): + raise ValueError("Missing/duplicate feature id or name") + seen.add(code) + if whole: + if code != parent: + raise ValueError("Whole-city feature does not match city") + elif (str(prop.get("parent", {}).get("adcode")) != parent + or prop.get("level") != "district"): + raise ValueError("County is not an immediate district child") + geo = feature.get("geometry", {}) + if geo.get("type") not in ("Polygon", "MultiPolygon"): + raise ValueError("Unexpected non-polygon geometry") + polys = geo["coordinates"] if geo["type"] == "MultiPolygon" else [geo["coordinates"]] + rings = holes = points = 0 + for polygon in polys: + if not polygon: + raise ValueError("Empty polygon") + rings += 1 + holes += len(polygon) - 1 + for ring in polygon: + if len(ring) < 4 or ring[0] != ring[-1]: + raise ValueError("Open or degenerate source ring") + for point in ring: + if (len(point) < 2 or not all(isinstance(v, (int, float)) + and math.isfinite(v) for v in point[:2]) + or not -180 <= point[0] <= 180 or not -90 <= point[1] <= 90): + raise ValueError("Invalid geographic coordinate") + if abs(sum(a[0]*b[1]-b[0]*a[1] for a, b in zip(ring, ring[1:]))) < 1e-15: + raise ValueError("Zero-area source ring") + points += len(ring) + entries.append({"id": code, "name": prop["name"], "rings": rings, + "holes": holes, "points": points}) + return entries + + +def get_source(code, folder, whole=False): + suffix = ".json" if whole else "_full.json" + url = BASE + code + suffix + path = folder / (code + ".json") + if path.exists(): + raw = path.read_bytes() + data = json.loads(raw) + regions = inspect_features(data, code, whole) + return raw, data, regions, url + for attempt in range(3): + try: + request = urllib.request.Request(url, headers={"User-Agent": "ShanhePuzzle-GIS/1.0"}) + with urllib.request.urlopen(request, timeout=35) as response: + raw = response.read() + data = json.loads(raw) + regions = inspect_features(data, code, whole) + tmp = path.with_suffix(".partial") + tmp.write_bytes(raw) + tmp.replace(path) + return raw, data, regions, url + except urllib.error.HTTPError as error: + if error.code == 404 or attempt == 2: + raise + except Exception: + if attempt == 2: + raise + time.sleep(.5 * (attempt + 1)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--snapshot", required=True, help="Local YYYY-MM-DD snapshot label") + parser.add_argument("--only", help="Optional comma-separated city ids for a small probe") + args = parser.parse_args() + datetime.date.fromisoformat(args.snapshot) + index = read_json(ROOT / "research/prefecture-map-index.json") + cities = [dict(region, province=province["id"], provinceName=province["name"]) + for province in index["levels"] for region in province["regions"] + if region["unitType"] == "prefecture"] + if args.only: + selected = set(args.only.split(",")) + cities = [city for city in cities if city["id"] in selected] + if len(cities) != len(selected): + raise ValueError("Unknown city id in --only") + dest = ROOT / "data/city-county-gis" / args.snapshot + for name in ["raw", "unsplit", "levels"]: + (dest / name).mkdir(parents=True, exist_ok=True) + + def fetch(city): + code = city["id"] + entry = {"id": code, "name": city["name"], "province": city["province"], + "provinceName": city["provinceName"]} + try: + raw, data, regions, url = get_source(code, dest / "raw") + entry.update(status="available", path="raw/"+code+".json", source=url, + sha256=hashlib.sha256(raw).hexdigest(), bytes=len(raw), regions=regions) + except urllib.error.HTTPError as error: + if error.code != 404 or code not in EXCEPTIONS: + entry.update(status="failed", reason=str(error)) + return entry + try: + raw, data, regions, url = get_source(code, dest / "unsplit", whole=True) + prop = data["features"][0]["properties"] + if len(regions) != 1 or prop.get("childrenNum") != 0: + raise ValueError("Cannot confirm the no-county-child exception") + entry.update(status="no_county_children", path="unsplit/"+code+".json", + source=url, unavailableChildSource=BASE+code+"_full.json", + sourceChildrenNum=0, reference=EXCEPTIONS[code], + sha256=hashlib.sha256(raw).hexdigest(), bytes=len(raw), regions=regions, + note="Whole-city outline only; township boundaries are not supplied by this source.") + except Exception as fallback_error: + entry.update(status="failed", reason=str(fallback_error)) + except Exception as error: + entry.update(status="failed", reason=str(error)) + return entry + + entries = [] + with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool: + futures = [pool.submit(fetch, city) for city in cities] + for future in concurrent.futures.as_completed(futures): + entries.append(future.result()) + if len(entries) % 25 == 0 or len(entries) == len(cities): + print("GIS fetched:", len(entries), "/", len(cities), flush=True) + entries.sort(key=lambda entry: entry["id"]) + failed = [entry for entry in entries if entry["status"] == "failed"] + for entry in entries: + if entry["status"] != "available": + continue + data = read_json(dest / entry["path"]) + level = make_level(data["features"], int(entry["id"]), entry["name"], int(entry["province"])) + if not level: + raise ValueError("No playable subdivision for " + entry["id"]) + level.update(kind="county", parent=entry["province"], playLabel="县区拼图") + level.pop("projection", None) + place_labels(level) + source_by_id = {region["id"]: region for region in entry["regions"]} + assert {region["id"] for region in level["regions"]} == set(source_by_id) + for region in level["regions"]: + expected = source_by_id[region["id"]] + assert region["name"] == expected["name"] + assert len(region["rings"]) == expected["rings"] + assert len(region.get("holes", [])) == expected["holes"] + for ring in region["rings"] + region.get("holes", []): + assert len(ring) >= 3 and all(all(math.isfinite(v) for v in p) for p in ring) + assert abs(sum(ring[i][0]*ring[(i+1)%len(ring)][1] + -ring[(i+1)%len(ring)][0]*ring[i][1] + for i in range(len(ring)))) > 1e-10 + encoded = json.dumps(level, ensure_ascii=False, separators=(",", ":")).encode() + path = dest / "levels" / (entry["id"] + ".json") + path.write_bytes(encoded) + entry["preparedPath"] = "levels/" + path.name + entry["preparedSha256"] = hashlib.sha256(encoded).hexdigest() + available = [entry for entry in entries if entry["status"] == "available"] + manifest = {"source": "DataV.GeoAtlas", "snapshotDate": args.snapshot, + "scope": "Existing game's prefectural areas; provider snapshot, not a guarantee of current administrative boundaries.", + "rawCoordinates": "Source longitude/latitude values preserved; datum not declared by the source, no WGS84/GCJ02 assumption.", + "preparedCoordinates": "Simplified game-plane coordinates, longest extent 1000; not geographic GIS coordinates.", + "releaseMapsChanged": False, "requested": len(cities), "available": len(available), + "countyPieces": sum(len(entry["regions"]) for entry in available), + "noCountyChildren": sum(entry["status"] == "no_county_children" for entry in entries), + "failed": len(failed), "cities": entries} + (dest / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2)+"\n") + (dest / "README.md").write_text("# City county GIS material snapshot\n\n" + "raw/: original per-city GeoJSON county outlines; longitude/latitude values are preserved.\n" + "levels/: simplified per-city game coordinates, with every source outer ring and hole retained.\n" + "unsplit/: whole-city outlines for four cities that report no county children.\n" + "manifest.json: source URLs, county names/codes, raw/prepared checksums, coverage and exceptions.\n\n" + "Prepared files still require collision decomposition, topology/playability and mobile performance validation before game integration. " + "They are materials, not an uploadable mini-tool ZIP. No released game map is modified.\n") + print(json.dumps({k: manifest[k] for k in ["requested", "available", "countyPieces", "noCountyChildren", "failed"]}), flush=True) + if failed: + print(json.dumps(failed, ensure_ascii=False), flush=True) + raise SystemExit(1) + artifact = ROOT / "artifacts" / ("city-county-gis-"+args.snapshot.replace("-", "")+".zip") + artifact.parent.mkdir(exist_ok=True) + paths = [dest / "manifest.json", dest / "README.md"] + for entry in entries: + paths.append(dest / entry["path"]) + if entry.get("preparedPath"): + paths.append(dest / entry["preparedPath"]) + with zipfile.ZipFile(artifact, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as bundle: + for path in sorted(paths): + bundle.write(path, path.relative_to(dest).as_posix()) + print("GIS material ZIP:", artifact, "|", artifact.stat().st_size, "bytes", flush=True) + + +if __name__ == "__main__": + main() diff --git a/scripts/map_geometry.py b/scripts/map_geometry.py new file mode 100644 index 0000000..2a7bb03 --- /dev/null +++ b/scripts/map_geometry.py @@ -0,0 +1,128 @@ +"""Build-time geometry simplification shared by prefecture and detailed maps.""" +import math +def area(r):return abs(sum(r[i][0]*r[(i+1)%len(r)][1]-r[(i+1)%len(r)][0]*r[i][1] for i in range(len(r)))/2) +def dist(p,a,b): + dx,dy=b[0]-a[0],b[1]-a[1];n=dx*dx+dy*dy + t=max(0,min(1,((p[0]-a[0])*dx+(p[1]-a[1])*dy)/n)) if n else 0 + return (p[0]-a[0]-t*dx)**2+(p[1]-a[1]-t*dy)**2 +def dp(p,eps): + if len(p)<3:return p + v,i=max((dist(p[k],p[0],p[-1]),k) for k in range(1,len(p)-1)) + if v<=eps*eps:return [p[0],p[-1]] + return dp(p[:i+1],eps)[:-1]+dp(p[i:],eps) +def project(p):return [p[0]*.82,-math.log(math.tan(math.pi/4+math.radians(p[1])/2))*180/math.pi*.82] +def make_level(features,code,name,province): + fs=[f for f in features if f.get('properties',{}).get('name') and f['properties'].get('adcode')] + if len(fs)<2:return None + reg=[];boundary=[] + for f in fs: + prop=f['properties'];g=f['geometry'];polys=g['coordinates'] if g['type']=='MultiPolygon' else [g['coordinates']] + rings=[project_ring(p[0]) for p in polys if len(p[0])>=4] + holes=[project_ring(hole) for poly in polys for hole in poly[1:] if len(hole)>=4] + rings.sort(key=area,reverse=True) + if not rings:continue + main=rings[0];boundary.append({(round(x,3),round(y,3)) for r in rings+holes for x,y in r}) + # Keep island geometry, simplify each independently; no invented boundaries. + span=max(max(p[0] for p in main)-min(p[0] for p in main),max(p[1] for p in main)-min(p[1] for p in main)) + simple=[] + for r in rings: + localspan=max(max(p[0] for p in r)-min(p[0] for p in r),max(p[1] for p in r)-min(p[1] for p in r)) + eps=max(min(span*.005,localspan*.01),.00000001);q=dp(r,eps) + while len(q)>90:eps*=1.4;q=dp(r,eps) + if len(q)<4:q=r + simple.append(q[:-1] if q[0]==q[-1] else q) + cx=sum(x for x,y in main[:-1])/max(1,len(main)-1);cy=sum(y for x,y in main[:-1])/max(1,len(main)-1) + entry={'id':str(prop['adcode']),'name':prop['name'],'rings':simple,'center':[cx,cy]} + if holes: + entry['holes']=[] + for hole in holes: + eps=span*.001;q=dp(hole,eps) + while len(q)>90:eps*=1.4;q=dp(hole,eps) + if len(q)<4:q=hole + entry['holes'].append(q[:-1] if q[0]==q[-1] else q) + reg.append(entry) + if len(reg)<2:return None + edges=[] + for i in range(len(reg)): + for j in range(i): + if len(boundary[i]&boundary[j])>=2:edges.append([j,i,0]) + # Join disconnected island components with explicit game-only sea routes. + def components(): + groups=[{i} for i in range(len(reg))] + for a,b,_ in edges: + ga=next(g for g in groups if a in g);gb=next(g for g in groups if b in g) + if ga is not gb:ga.update(gb);groups.remove(gb) + return groups + while len(components())>1: + gs=components();candidates=[] + for a in gs[0]: + for g in gs[1:]: + for b in g: + pa,pb=reg[a]['center'],reg[b]['center'];candidates.append(((pa[0]-pb[0])**2+(pa[1]-pb[1])**2,a,b)) + _,a,b=min(candidates);edges.append([a,b,1]) + allp=[p for r in reg for ring in r['rings'] for p in ring] + minx,miny=min(p[0] for p in allp),min(p[1] for p in allp);maxx,maxy=max(p[0] for p in allp),max(p[1] for p in allp) + span=max(maxx-minx,maxy-miny);scale=1000/span + for r in reg: + r['center']=[round((r['center'][0]-minx)*scale,2),round((r['center'][1]-miny)*scale,2)] + r['rings']=[[[round((x-minx)*scale,4),round((y-miny)*scale,4)] for x,y in ring] for ring in r['rings']] + if r.get('holes'):r['holes']=[[[round((x-minx)*scale,4),round((y-miny)*scale,4)] for x,y in ring] for ring in r['holes']] + return {'id':str(code),'name':name,'province':str(province),'width':round((maxx-minx)*scale,2),'height':round((maxy-miny)*scale,2),'regions':reg,'edges':edges,'projection':[minx,miny,scale]} +def project_ring(r):return [project(p) for p in r] + +def inside(p,ring): + x,y=p;hit=False + for i,a in enumerate(ring): + b=ring[(i+1)%len(ring)] + if (a[1]>y)!=(b[1]>y) and x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0]:hit=not hit + return hit + +def place_labels(lv): + for r in lv['regions']: + ring=r['rings'][0];minx,maxx=min(p[0] for p in ring),max(p[0] for p in ring);miny,maxy=min(p[1] for p in ring),max(p[1] for p in ring) + candidates=[[minx+(maxx-minx)*i/14,miny+(maxy-miny)*j/14] for i in range(1,14) for j in range(1,14)] + candidates=[p for p in candidates if inside(p,ring) and not any(inside(p,hole) for hole in r.get('holes',[]))] + if candidates:r['label']=max(candidates,key=lambda p:min(dist(p,ring[k],ring[(k+1)%len(ring)]) for k in range(len(ring)))) + else:r['label']=r['center'] + r['label']=[round(v,3) for v in r['label']] + + +def hainan_offshore_inset(lv): + """Gameplay inset: preserve every Sansha ring, uniformly scale and translate. + + The national map and raw coordinates are untouched. Only this provincial + puzzle uses a clearly labelled inset so the main island remains playable. + """ + if lv['id']!='460000':return + offshore=next(r for r in lv['regions'] if r['id']=='460300') + for r in lv['regions']: + r['labelName']=r['name'].split('黎族')[0] if '黎族' in r['name'] else r['name'].removesuffix('市').removesuffix('县') + mainland=[p for r in lv['regions'] if r is not offshore for ring in r['rings'] for p in ring] + sea=[p for ring in offshore['rings'] for p in ring] + minx,maxx=min(p[0] for p in mainland),max(p[0] for p in mainland) + miny,maxy=min(p[1] for p in mainland),max(p[1] for p in mainland) + sx,sy=min(p[0] for p in sea),min(p[1] for p in sea) + sw,sh=max(p[0] for p in sea)-sx,max(p[1] for p in sea)-sy + width,height=maxx-minx,maxy-miny + factor=min(width*.38/sw,height*.55/sh) + tx,ty=maxx+width*.10,maxy-height*.53 + move=lambda p:[tx+(p[0]-sx)*factor,ty+(p[1]-sy)*factor] + offshore['rings']=[[move(p) for p in ring] for ring in offshore['rings']] + if offshore.get('holes'):offshore['holes']=[[move(p) for p in ring] for ring in offshore['holes']] + offshore['center']=move(offshore['center']) + allp=[p for r in lv['regions'] for ring in r['rings'] for p in ring] + bx,by=min(p[0] for p in allp),min(p[1] for p in allp) + bw,bh=max(p[0] for p in allp)-bx,max(p[1] for p in allp)-by + scale=1000/max(bw,bh) + normalize=lambda p:[round((p[0]-bx)*scale,4),round((p[1]-by)*scale,4)] + for r in lv['regions']: + r['rings']=[[normalize(p) for p in ring] for ring in r['rings']] + if r.get('holes'):r['holes']=[[normalize(p) for p in ring] for ring in r['holes']] + r['center']=normalize(r['center']) + lv['width'],lv['height']=round(bw*scale,2),round(bh*scale,2) + # Reserve space around the islands, for a visible frame and explanatory label. + a,b=normalize([tx-width*.025,ty-height*.025]),normalize([tx+sw*factor+width*.025,ty+sh*factor+height*.025]) + lv['mapInsets']=[{'id':'460300','label':'三沙诸岛 · 缩放移位示意','x':a[0],'y':a[1],'width':b[0]-a[0],'height':b[1]-a[1]}] + lv['scopeNote']='含15个省直辖地区;三沙诸岛缩放移位示意。' + lv['unitCaption']='地级及省直辖 · 三沙移位示意' + lv['projectionNote']='海南省域游戏关卡使用三沙诸岛缩放移位示意,全国地图与源素材坐标保持原状。' diff --git a/scripts/pack-county-maps.cjs b/scripts/pack-county-maps.cjs new file mode 100644 index 0000000..ade8ccf --- /dev/null +++ b/scripts/pack-county-maps.cjs @@ -0,0 +1,9 @@ +'use strict'; +// Keep editable/auditable maps separate in source, but ship at most two +// same-province stages per classic script to meet the 200-file ZIP limit. +module.exports=function packCountyMaps(index,readStage){ + const levels=index.levels.map(meta=>({...meta})),provinces=new Map(),files=new Map(),seen=new Set(); + for(const meta of levels){if(!/^\d{6}$/.test(meta.id)||!/^\d{6}$/.test(meta.province)||seen.has(meta.id))throw Error('Invalid county catalog');seen.add(meta.id);if(!provinces.has(meta.province))provinces.set(meta.province,[]);provinces.get(meta.province).push(meta);} + for(const entries of provinces.values()){entries.sort((a,b)=>a.id.localeCompare(b.id));for(let i=0;ireadStage(meta.id)).join('\n'));}} + return {index:{...index,levels},files}; +}; diff --git a/scripts/package.py b/scripts/package.py index 8e71ad1..0645141 100644 --- a/scripts/package.py +++ b/scripts/package.py @@ -1,10 +1,12 @@ import pathlib,zipfile,json,hashlib root=pathlib.Path('dist');out=pathlib.Path('artifacts/shanhe-puzzle-xhs.zip') +files=sorted(p for p in root.rglob('*') if p.is_file()) +if len(files)>200:raise SystemExit(f'ZIP文件数量超过200个上限: {len(files)}') with zipfile.ZipFile(out,'w',zipfile.ZIP_DEFLATED,compresslevel=9) as z: - for p in sorted(root.rglob('*')): - if p.is_file():z.write(p,p.relative_to(root).as_posix()) + for p in files:z.write(p,p.relative_to(root).as_posix()) with zipfile.ZipFile(out) as z: assert 'index.html' in z.namelist() assert z.testzip() is None + assert len(z.infolist())<=200 print('离线 ZIP:',out.resolve(),' | ',round(out.stat().st_size/1024),'KB') -pathlib.Path('artifacts/package-report.json').write_text(json.dumps({'file':str(out),'bytes':out.stat().st_size,'sha256':hashlib.sha256(out.read_bytes()).hexdigest(),'archiveIntegrity':'passed','rootEntry':'index.html'},indent=2)) +pathlib.Path('artifacts/package-report.json').write_text(json.dumps({'file':str(out),'bytes':out.stat().st_size,'fileCount':len(files),'fileLimit':200,'sha256':hashlib.sha256(out.read_bytes()).hexdigest(),'archiveIntegrity':'passed','rootEntry':'index.html'},indent=2)) diff --git a/scripts/prepare-ci-audit.py b/scripts/prepare-ci-audit.py new file mode 100644 index 0000000..c6a89db --- /dev/null +++ b/scripts/prepare-ci-audit.py @@ -0,0 +1,19 @@ +"""Install only the pinned official package auditor inside the remote CI image.""" +import hashlib +import io +from pathlib import Path +import urllib.request +import zipfile + +url = 'https://fe-static.xhscdn.com/minitool/20261015161653/minitool-zip-builder-1.8.0.skill' +with urllib.request.urlopen(url, timeout=120) as response: + archive = zipfile.ZipFile(io.BytesIO(response.read())) + matches = [name for name in archive.namelist() if name.endswith('scripts/audit_artifact.py')] + if len(matches) != 1: + raise SystemExit('Official auditor missing or ambiguous') + content = archive.read(matches[0]) +if hashlib.sha256(content).hexdigest() != '62ff11eae1d5bb566a6f74b0fa102fe2eb3ffe982b87596aca2f93485cc9de21': + raise SystemExit('Official auditor changed; review before updating the pinned checksum') +target = Path('.codex/skills/minitool-zip-builder/scripts/audit_artifact.py') +target.parent.mkdir(parents=True, exist_ok=True) +target.write_bytes(content) diff --git a/scripts/prepare-county-levels.py b/scripts/prepare-county-levels.py new file mode 100644 index 0000000..bff9079 --- /dev/null +++ b/scripts/prepare-county-levels.py @@ -0,0 +1,86 @@ +"""Prepare independently loaded city/county game assets from a GIS snapshot. + +Requires Shapely only for this preparation step; npm run build uses the saved +src/county assets and source index and does not require Python GIS packages. +""" +import argparse, copy, hashlib, json, math, pathlib +from shapely import make_valid +from shapely.geometry import Polygon, MultiPolygon +from map_geometry import project + +ROOT=pathlib.Path(__file__).resolve().parent.parent + +def polygons(geometry): + if geometry.geom_type=='Polygon':return [geometry] + if hasattr(geometry,'geoms'):return [p for item in geometry.geoms for p in polygons(item)] + return [] + +def rounded_ring(ring,digits): + points=[] + for p in list(ring.coords)[:-1]: + q=[round(p[0],digits),round(p[1],digits)] + q=[int(v) if float(v).is_integer() else v for v in q] + if not points or q!=points[-1]:points.append(q) + if len(points)>1 and points[0]==points[-1]:points.pop() + return points + +def compact_polygon(poly): + x1,y1,x2,y2=poly.bounds;span=max(x2-x1,y2-y1);eps=span*.003 + simple=poly.simplify(eps,preserve_topology=True) + for _ in range(18): + if len(simple.exterior.coords)<=81:break + candidate=poly.simplify(eps*1.3,preserve_topology=True) + if candidate.areapoly.area*1.03:break + simple=candidate;eps*=1.3 + for digits in [1,2,3,4,6,8]: + outer=rounded_ring(simple.exterior,digits);holes=[rounded_ring(h,digits) for h in simple.interiors] + if len(outer)<3 or any(len(h)<3 for h in holes):continue + candidate=Polygon(outer,holes) + if candidate.is_valid and candidate.area>0 and abs(candidate.area-simple.area)/simple.area<=.01: + return outer,holes,digits + raise ValueError('Cannot quantize a polygon without losing its topology') + +def main(): + parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('--snapshot',default='2026-10-18');args=parser.parse_args() + snapshot=ROOT/'data/city-county-gis'/args.snapshot;manifest=json.loads((snapshot/'manifest.json').read_text()) + dest=ROOT/'src/county';dest.mkdir(exist_ok=True);index={'source':manifest['source'],'snapshot':args.snapshot,'levels':[],'unavailable':[]};catalog=[];total=0;repairs=0 + for entry in manifest['cities']: + if entry['status']!='available': + index['unavailable'].append({'id':entry['id'],'name':entry['name'],'province':entry['province'],'reason':'no_county_children'}) + continue + old=json.loads((snapshot/entry['preparedPath']).read_text());raw=json.loads((snapshot/entry['path']).read_text()) + all_points=[project(p) for f in raw['features'] for poly in (f['geometry']['coordinates'] if f['geometry']['type']=='MultiPolygon' else [f['geometry']['coordinates']]) for p in poly[0]] + minx,miny=min(p[0] for p in all_points),min(p[1] for p in all_points);span=max(max(p[0] for p in all_points)-minx,max(p[1] for p in all_points)-miny);scale=1000/span + def local(p): + q=project(p);return [(q[0]-minx)*scale,(q[1]-miny)*scale] + level={k:copy.deepcopy(old[k]) for k in ['id','name','province','width','height','edges']} + level.update(kind='county',parent=entry['province'],provinceName=entry['provinceName'],playLabel='县区拼图',unitCaption='市辖区 · 县 · 县级市',scopeNote='左右调整待落块,松手落下,拼完整片'+entry['name']+'。',regions=[]) + proof=[] + for feature in raw['features']: + prop=feature['properties'];source_polys=feature['geometry']['coordinates'] if feature['geometry']['type']=='MultiPolygon' else [feature['geometry']['coordinates']] + output=[];fixed=0 + for source_poly in source_polys: + poly=Polygon([local(p) for p in source_poly[0]],[[local(p) for p in h] for h in source_poly[1:]]) + if not poly.is_valid:poly=make_valid(poly);fixed+=1 + pieces=polygons(poly) + if not pieces:raise ValueError('No polygon after source repair') + output.extend(pieces) + output.sort(key=lambda p:p.area,reverse=True);region={'id':str(prop['adcode']),'name':prop['name'],'rings':[]};holes=[] + for poly in output: + outer,inner,digits=compact_polygon(poly);region['rings'].append(outer);holes.extend(inner) + if holes:region['holes']=holes + center=MultiPolygon(output).centroid;label=output[0].representative_point() + region['center']=[round(center.x,1),round(center.y,1)];region['label']=[round(label.x,1),round(label.y,1)] + level['regions'].append(region);repairs+=fixed + proof.append({'id':region['id'],'name':region['name'],'sourceRings':len(source_polys),'sourceHoles':sum(len(p)-1 for p in source_polys),'rings':len(region['rings']),'holes':len(holes),'repairedSourcePolygons':fixed}) + assert [r['id'] for r in level['regions']]==[r['id'] for r in old['regions']] + payload=json.dumps(level,ensure_ascii=False,separators=(',',':')) + (dest/(level['id']+'.js')).write_text('window.PuzzleAtlas.register('+payload+');\n') + index['levels'].append({'id':level['id'],'name':level['name'],'province':level['province'],'provinceName':entry['provinceName'],'sha256':entry['sha256'],'regions':proof}) + catalog.append({'id':level['id'],'name':level['name'],'province':level['province'],'provinceName':entry['provinceName'],'kind':'county','playLabel':'县区拼图','count':len(level['regions']),'path':'./county/'+level['id']+'.js'}) + total+=len(payload.encode()) + (ROOT/'src/county-index.js').write_text('window.COUNTY_INDEX='+json.dumps({'levels':catalog,'unavailable':index['unavailable']},ensure_ascii=False,separators=(',',':'))+';\n') + (ROOT/'research/county-map-index.json').write_text(json.dumps(index,ensure_ascii=False,separators=(',',':'))+'\n') + print('County assets:',len(catalog),'levels;',sum(v['count'] for v in catalog),'pieces;',total,'bytes; source polygon repairs:',repairs) + +if __name__=='__main__':main() diff --git a/scripts/prepare-detail-maps.py b/scripts/prepare-detail-maps.py new file mode 100644 index 0000000..222eb62 --- /dev/null +++ b/scripts/prepare-detail-maps.py @@ -0,0 +1,55 @@ +"""Add a small, explicitly scoped set of detailed puzzles from local map inputs. + +Run after prepare-maps.py. Raw downloads stay in ignored data/, while the +compact source index is required by the build-time geographic audit. +""" +import copy, hashlib, json, pathlib, subprocess +from map_geometry import make_level, place_labels +ROOT=pathlib.Path(__file__).resolve().parent.parent +source=ROOT/'src/maps.js' +data=json.loads(source.read_text().removeprefix('window.MAP_DATA=').strip().removesuffix(';')) +# Preserve the national and 27 provincial levels, including province-administered peers. +data['levels']=[lv for lv in data['levels'] if lv.get('kind') not in ('county','partition','county-city')] +for lv in data['levels']: + lv['kind']='province' if lv['id']=='100000' else 'prefecture' +index={'downloadDate':'2026-10-17','levels':[]} +expected={'110000':('北京市',16),'120000':('天津市',16),'310000':('上海市',16),'500000':('重庆市',38),'810000':('香港特别行政区',18),'820000':('澳门特别行政区',8)} +for code,(name,count) in expected.items(): + raw=ROOT/'data/provinces-raw'/(code+'.json') + features=json.loads(raw.read_text())['features'] + features=[f for f in features if f['properties'].get('level')=='district'] + assert len(features)==count,(code,len(features)) + lv=make_level(features,code,name,code) + assert lv and len(lv['regions'])==count + lv.pop('projection',None);lv['kind']='partition' if code in ('810000','820000') else 'county' + lv['playLabel']='分区拼图' if lv['kind']=='partition' else '县区拼图' + lv['unitCaption']='按素材分区 · 堂区及路凼填海区' if code=='820000' else '18个分区' if code=='810000' else '区 · 县 · 自治县' if code=='500000' else '市辖区' + lv['source']='DataV.GeoAtlas';place_labels(lv);data['levels'].append(lv) + index['levels'].append({'id':code,'name':name,'kind':lv['kind'],'source':'DataV.GeoAtlas','sha256':hashlib.sha256(raw.read_bytes()).hexdigest(),'regions':[{'id':str(f['properties']['adcode']),'name':f['properties']['name'],'rings':len(f['geometry']['coordinates']) if f['geometry']['type']=='MultiPolygon' else 1,'holes':sum(len(poly)-1 for poly in f['geometry']['coordinates']) if f['geometry']['type']=='MultiPolygon' else len(f['geometry']['coordinates'])-1} for f in features]}) +# An explicitly attributed county/city source is separate from the national map. +taiwan=ROOT/'data/taiwan-raw/counties.geojson' +if not taiwan.exists():raise SystemExit('缺少台湾县市构建输入,请先运行 scripts/prepare-taiwan.py') +features=json.loads(taiwan.read_text())['features'] +assert len(features)==20 +play_features=copy.deepcopy(features) +# Keep every source exterior ring. Two remote island clusters are translated +# into a labelled inset area so one county does not span thousands of km. +insets=0 +for f in play_features: + for poly in f['geometry']['coordinates']: + ring=poly[0];cx=sum(p[0] for p in ring)/len(ring);cy=sum(p[1] for p in ring)/len(ring) + if cy<21 or cx<118: + target=(118.95,21.7) if cy<15 else (119.35,21.7) + dx,dy=target[0]-cx,target[1]-cy + for p in ring:p[0]+=dx;p[1]+=dy + insets+=1 +assert insets>0 +lv=make_level(play_features,'710000','台湾省','710000');lv.pop('projection',None) +lv.update(kind='county-city',playLabel='县市拼图',unitCaption='县市 · 远海岛屿移位示意',source='NLSC',scopeNote='县市关卡包括台湾岛及澎湖;远海岛屿采用移位示意。金门、连江属福建,不重复列入。') +place_labels(lv);data['levels'].append(lv) +index['levels'].append({'id':'710000','name':'台湾省','kind':'county-city','source':'NLSC','snapshot':'COUNTY_MOI_1090820','translatedOffshoreRings':insets,'sourceURL':'https://data.gov.tw/dataset/7442','license':'政府资料开放授权条款第1版','sha256':hashlib.sha256(taiwan.read_bytes()).hexdigest(),'regions':[{'id':str(f['properties']['adcode']),'name':f['properties']['name'],'rings':len(f['geometry']['coordinates']),'holes':sum(len(poly)-1 for poly in f['geometry']['coordinates'])} for f in features]}) +assert len(data['levels'])==35 +source.write_text('window.MAP_DATA='+json.dumps(data,ensure_ascii=False,separators=(',',':'))+';\n') +subprocess.run(['node',str(ROOT/'scripts/triangulate-holes.mjs')],check=True,cwd=ROOT) +(ROOT/'research/detail-map-index.json').write_text(json.dumps(index,ensure_ascii=False,indent=2)+'\n') +print('Detailed levels:',[(lv['name'],lv['playLabel'],len(lv['regions'])) for lv in data['levels'] if lv['kind'] not in ('province','prefecture')]) diff --git a/scripts/prepare-maps.py b/scripts/prepare-maps.py index dcfc294..339a6c0 100644 --- a/scripts/prepare-maps.py +++ b/scripts/prepare-maps.py @@ -1,65 +1,7 @@ -import json, math, pathlib, collections +import json, math, pathlib, collections, subprocess, hashlib ROOT=pathlib.Path(__file__).resolve().parent.parent AREAS=json.load(open(ROOT/'research/areas.json'));LOOKUP={a['adcode']:a for a in AREAS} -def area(r):return abs(sum(r[i][0]*r[(i+1)%len(r)][1]-r[(i+1)%len(r)][0]*r[i][1] for i in range(len(r)))/2) -def dist(p,a,b): - dx,dy=b[0]-a[0],b[1]-a[1];n=dx*dx+dy*dy - t=max(0,min(1,((p[0]-a[0])*dx+(p[1]-a[1])*dy)/n)) if n else 0 - return (p[0]-a[0]-t*dx)**2+(p[1]-a[1]-t*dy)**2 -def dp(p,eps): - if len(p)<3:return p - v,i=max((dist(p[k],p[0],p[-1]),k) for k in range(1,len(p)-1)) - if v<=eps*eps:return [p[0],p[-1]] - return dp(p[:i+1],eps)[:-1]+dp(p[i:],eps) -def project(p):return [p[0]*.82,-math.log(math.tan(math.pi/4+math.radians(p[1])/2))*180/math.pi*.82] -def make_level(features,code,name,province): - fs=[f for f in features if f.get('properties',{}).get('name') and f['properties'].get('adcode')] - if len(fs)<2:return None - reg=[];boundary=[] - for f in fs: - prop=f['properties'];g=f['geometry'];polys=g['coordinates'] if g['type']=='MultiPolygon' else [g['coordinates']] - rings=[project_ring(p[0]) for p in polys if len(p[0])>=4] - rings.sort(key=area,reverse=True) - if not rings:continue - main=rings[0];boundary.append({(round(x,3),round(y,3)) for r in rings for x,y in r}) - # Keep island geometry, simplify each independently; no invented boundaries. - span=max(max(p[0] for p in main)-min(p[0] for p in main),max(p[1] for p in main)-min(p[1] for p in main)) - simple=[] - for r in rings: - localspan=max(max(p[0] for p in r)-min(p[0] for p in r),max(p[1] for p in r)-min(p[1] for p in r)) - eps=max(min(span*.005,localspan*.01),.00000001);q=dp(r,eps) - while len(q)>90:eps*=1.4;q=dp(r,eps) - if len(q)<4:q=r - simple.append(q[:-1] if q[0]==q[-1] else q) - cx=sum(x for x,y in main[:-1])/max(1,len(main)-1);cy=sum(y for x,y in main[:-1])/max(1,len(main)-1) - reg.append({'id':str(prop['adcode']),'name':prop['name'],'rings':simple,'center':[cx,cy]}) - if len(reg)<2:return None - edges=[] - for i in range(len(reg)): - for j in range(i): - if len(boundary[i]&boundary[j])>=2:edges.append([j,i,0]) - # Join disconnected island components with explicit game-only sea routes. - def components(): - groups=[{i} for i in range(len(reg))] - for a,b,_ in edges: - ga=next(g for g in groups if a in g);gb=next(g for g in groups if b in g) - if ga is not gb:ga.update(gb);groups.remove(gb) - return groups - while len(components())>1: - gs=components();candidates=[] - for a in gs[0]: - for g in gs[1:]: - for b in g: - pa,pb=reg[a]['center'],reg[b]['center'];candidates.append(((pa[0]-pb[0])**2+(pa[1]-pb[1])**2,a,b)) - _,a,b=min(candidates);edges.append([a,b,1]) - allp=[p for r in reg for ring in r['rings'] for p in ring] - minx,miny=min(p[0] for p in allp),min(p[1] for p in allp);maxx,maxy=max(p[0] for p in allp),max(p[1] for p in allp) - span=max(maxx-minx,maxy-miny);scale=1000/span - for r in reg: - r['center']=[round((r['center'][0]-minx)*scale,2),round((r['center'][1]-miny)*scale,2)] - r['rings']=[[[round((x-minx)*scale,4),round((y-miny)*scale,4)] for x,y in ring] for ring in r['rings']] - return {'id':str(code),'name':name,'province':str(province),'width':round((maxx-minx)*scale,2),'height':round((maxy-miny)*scale,2),'regions':reg,'edges':edges,'projection':[minx,miny,scale]} -def project_ring(r):return [project(p) for p in r] +from map_geometry import make_level, project, place_labels, hainan_offshore_inset levels=[] cn=json.load(open(ROOT/'research/china.json'));nation=make_level(cn['features'],100000,'中国 · 省级拼图',100000);levels.append(nation) for p in sorted((ROOT/'data/raw').glob('*.json')): @@ -78,35 +20,45 @@ result={'source':'DataV.GeoAtlas','downloadDate':'2026-10-16','provinces':provin summary={'levels':len(levels),'countyLevels':len(levels)-1,'provincePieces':len(nation['regions']),'countyPieces':sum(len(l['regions']) for l in levels[1:]),'availableProvinces':len({l['province'] for l in levels[1:]}),'seaRoutes':sum(e[2] for l in levels for e in l['edges'])} (ROOT/'data/county-materials/summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2));print(summary) -# Formal release: only province and prefecture-level units, no county pieces. +# Formal release: prefectures plus province-administered peers, so the province has no filtered-out gaps. citylevels=[nation] -excluded=[] +direct_summary=[] +prefecture_index={'downloadDate':'2026-10-16','source':'DataV.GeoAtlas','levels':[]} for p in sorted((ROOT/'data/provinces-raw').glob('*.json')): code=int(p.stem);info=LOOKUP.get(code) if not info:continue fs=json.load(open(p)).get('features',[]) - cityfs=[f for f in fs if f.get('properties',{}).get('level')=='city' and int(f['properties'].get('adcode',0))%100==0] - excluded.extend(f['properties']['name'] for f in fs if f not in cityfs) + # These are the province endpoint's immediate children, not every county + # nested inside a prefecture. District-only municipalities are added separately. + children=[f for f in fs if f.get('properties',{}).get('level') in ('city','district') and f['properties'].get('parent',{}).get('adcode')==code] + prefectures=[f for f in children if int(f['properties']['adcode'])%100==0] + if not prefectures:continue + cityfs=children + assert len(cityfs)==len(fs),(code,'unclassified province children') + direct=[f for f in cityfs if f not in prefectures] lv=make_level(cityfs,code,info['name'],code) if lv: - # Missing county-only zones may disconnect prefectures: these are not land neighbors. + lv['kind']='prefecture' + direct_ids={str(f['properties']['adcode']) for f in direct} + for r in lv['regions']:r['unitType']='province-direct' if r['id'] in direct_ids else 'prefecture' + if direct: + lv['playLabel']='省域拼图' + lv['unitCaption']='地级行政区 · 省直辖地区' + lv['scopeNote']='含'+str(len(direct))+'个省直辖县级地区,拼完整片省域。' + lv['directRegionCount']=len(direct) + direct_summary.append({'province':str(code),'names':[f['properties']['name'] for f in direct]}) + entries=[] + for f in cityfs: + prop=f['properties'];geometry=f['geometry'];polys=geometry['coordinates'] if geometry['type']=='MultiPolygon' else [geometry['coordinates']] + entries.append({'id':str(prop['adcode']),'name':prop['name'],'unitType':'province-direct' if str(prop['adcode']) in direct_ids else 'prefecture','rings':len(polys),'holes':sum(len(poly)-1 for poly in polys)}) + prefecture_index['levels'].append({'id':str(code),'name':info['name'],'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'regions':entries}) + # Disconnected islands retain explicit game-only routes. for edge in lv['edges']: if edge[2]:edge[2]=2 citylevels.append(lv) -def inside(p,ring): - x,y=p;hit=False - for i,a in enumerate(ring): - b=ring[(i+1)%len(ring)] - if (a[1]>y)!=(b[1]>y) and x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0]:hit=not hit - return hit for lv in citylevels: - for r in lv['regions']: - ring=r['rings'][0];minx,maxx=min(p[0] for p in ring),max(p[0] for p in ring);miny,maxy=min(p[1] for p in ring),max(p[1] for p in ring) - candidates=[[minx+(maxx-minx)*i/14,miny+(maxy-miny)*j/14] for i in range(1,14) for j in range(1,14)] - candidates=[p for p in candidates if inside(p,ring)] - if candidates:r['label']=max(candidates,key=lambda p:min(dist(p,ring[k],ring[(k+1)%len(ring)]) for k in range(len(ring)))) - else:r['label']=r['center'] - r['label']=[round(v,3) for v in r['label']] + hainan_offshore_inset(lv) + place_labels(lv) # Preserve the source's unnamed maritime boundary features as a separate layer. minx,miny,scale=nation['projection'];decorations=[] for feature in cn['features']: @@ -117,5 +69,7 @@ nation['decorations']=decorations for lv in citylevels:lv.pop('projection',None) result={'source':'DataV.GeoAtlas','downloadDate':'2026-10-16','provinces':provinces,'levels':citylevels} (ROOT/'src/maps.js').write_text('window.MAP_DATA='+json.dumps(result,ensure_ascii=False,separators=(',',':'))+';\n') -summary={'levels':len(citylevels),'prefectureLevels':len(citylevels)-1,'provincePieces':len(nation['regions']),'prefecturePieces':sum(len(l['regions']) for l in citylevels[1:]),'availableProvinces':len(citylevels)-1,'excludedCountyUnits':excluded,'countyMaterials':{'levels':len(levels)-1,'pieces':sum(len(l['regions']) for l in levels[1:]),'path':'data/county-materials/maps.js'}} -(ROOT/'data/map-summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2));print('Release:',{k:v for k,v in summary.items() if k!='excludedCountyUnits'}) +subprocess.run(['node',str(ROOT/'scripts/triangulate-holes.mjs')],check=True,cwd=ROOT) +summary={'levels':len(citylevels),'prefectureLevels':len(citylevels)-1,'provincePieces':len(nation['regions']),'prefecturePieces':sum(len(l['regions']) for l in citylevels[1:]),'availableProvinces':len(citylevels)-1,'provinceDirectPieces':sum(len(v['names']) for v in direct_summary),'provinceDirectUnits':direct_summary,'countyMaterials':{'levels':len(levels)-1,'pieces':sum(len(l['regions']) for l in levels[1:]),'path':'data/county-materials/maps.js'}} +(ROOT/'research/prefecture-map-index.json').write_text(json.dumps(prefecture_index,ensure_ascii=False,indent=2)+'\n') +(ROOT/'data/map-summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2));print('Release:',{k:v for k,v in summary.items() if k!='provinceDirectUnits'}) diff --git a/scripts/prepare-taiwan.py b/scripts/prepare-taiwan.py new file mode 100644 index 0000000..71dc4f5 --- /dev/null +++ b/scripts/prepare-taiwan.py @@ -0,0 +1,53 @@ +"""Convert the official NLSC county SHP ZIP to a build-only GeoJSON input. + +Download https://maps.nlsc.gov.tw/pro/download.jsp's county EPSG:3824 ZIP +into data/taiwan-raw/counties.zip first. Only Python's standard library is used. +""" +import json, pathlib, struct, zipfile +ROOT=pathlib.Path(__file__).resolve().parent.parent +folder=ROOT/'data/taiwan-raw' +with zipfile.ZipFile(folder/'counties.zip') as z: + names=z.namelist();dbf=z.read(next(n for n in names if n.lower().endswith('.dbf'))) + shp=z.read(next(n for n in names if n.lower().endswith('.shp'))) + prj=z.read(next(n for n in names if n.lower().endswith('.prj'))).decode() + assert 'GEOGCS' in prj and 'TWD_1997' in prj and 'Degree' in prj + count,header,size=struct.unpack_from('ii',shp,offset);part=shp[offset+8:offset+8+words*2];offset+=8+words*2 + assert struct.unpack_from('y)!=(b[1]>y) and x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0]:hit=not hit + return hit + polys=[[r] for r in outers] + for hole in [r for r in rings if signed(r)>0]: + owners=[poly for poly in polys if inside(hole[0],poly[0])];assert len(owners)==1;owners[0].append(hole) + geometries.append({'type':'MultiPolygon','coordinates':polys}) + assert len(geometries)==len(rows) + trans=str.maketrans({'臺':'台','縣':'县','蘭':'兰','雲':'云','義':'义','園':'园','東':'东','蓮':'莲'}) + features=[] + for prop,g in zip(rows,geometries): + # These two counties belong to Fujian, not Taiwan Province. + if prop['COUNTYCODE'] in ('09007','09020'):continue + features.append({'type':'Feature','properties':{'adcode':'TW-'+prop['COUNTYCODE'],'sourceCode':prop['COUNTYCODE'],'name':prop['COUNTYNAME'].translate(trans),'level':'county-city'},'geometry':g}) + assert len(features)==20 + result={'type':'FeatureCollection','source':'NLSC','sourceURL':'https://data.gov.tw/dataset/7442','snapshot':'COUNTY_MOI_1090820','license':'政府資料開放授權條款第1版','features':features} + (folder/'counties.geojson').write_text(json.dumps(result,ensure_ascii=False,separators=(',',':'))) + print('台湾县市输入:',len(features),'块;外环',sum(len(f['geometry']['coordinates']) for f in features)) diff --git a/scripts/profile-physics.cjs b/scripts/profile-physics.cjs new file mode 100644 index 0000000..eff4c6d --- /dev/null +++ b/scripts/profile-physics.cjs @@ -0,0 +1,15 @@ +// Deterministic Node diagnostic, not a mobile FPS / native acceptance test. +const fs=require('node:fs'),vm=require('node:vm'),path=require('node:path'),Module=require('node:module'),{performance}=require('node:perf_hooks'),M=require('matter-js'); +const args=process.argv.slice(2),source=args[0]||'src/game.js'; +const mod=new Module(path.resolve('src/profile-game.cjs'));mod.filename=path.resolve('src/profile-game.cjs');mod.paths=module.paths;mod._compile(fs.readFileSync(source,'utf8'),mod.filename);const {Game}=mod.exports; +const box={window:{}};vm.runInNewContext(fs.readFileSync('src/maps.js','utf8'),box);const maps=box.window.MAP_DATA.levels; +let county;vm.runInNewContext(fs.readFileSync('src/county/140500.js','utf8'),{window:{PuzzleAtlas:{register(l){county=l;}}}}); +const methods=['uprightOnce','guardPenetrations','tryMerges','attractNearby','updateSupport','stepGrowth','limitMotion','pose','pocketPlan','snapPlan']; +function run(level,upright,shake){let seed=74;const rng=()=>{seed=(seed*1664525+1013904223)>>>0;return seed/4294967296;};const g=new Game(level,440,680,4,()=>{},rng,1,2),cost={},calls={},ticks=[],collisions={count:0},transforms={count:0};let measuring=false; + for(const key of methods){const f=g[key];g[key]=function(...args){if(!measuring)return f.apply(this,args);calls[key]=(calls[key]||0)+1;const start=performance.now();try{return f.apply(this,args);}finally{cost[key]=(cost[key]||0)+performance.now()-start;}};} + const collide=M.Collision.collides,angle=M.Body.setAngle;M.Collision.collides=function(...args){if(measuring)collisions.count++;return collide.apply(this,args);};M.Body.setAngle=function(...args){if(measuring)transforms.count++;return angle.apply(this,args);};g.start();let awake=0,samples=0; + try{for(let i=0;i<2400&&g.status==='playing';i++){if(g.pending&&i%35===0){const serial=g.pending.serial;g.movePending(35+rng()*370,serial);g.holdPending(serial);g.releasePending(serial);}if(i===1200)upright&&g.uprightOnce();if(shake&&i>=1200&&i%40===0)g.swipe({x:220,y:560},{x:i%80?100:-100,y:-30},65);measuring=i>=1800;const start=performance.now();g.tick(1000/60);if(measuring){ticks.push(performance.now()-start);awake+=g.groups.filter(p=>!p.body.isSleeping).length;samples+=g.groups.length;}}}finally{M.Collision.collides=collide;M.Body.setAngle=angle;} + ticks.sort((a,b)=>a-b);const result={id:level.id,upright,shake,status:g.status,groups:g.groups.length,dropped:g.dropped,parts:g.groups.reduce((n,p)=>n+p.body.parts.length,0),sampleTicks:ticks.length,meanMs:ticks.reduce((n,t)=>n+t,0)/ticks.length,p95Ms:ticks[Math.floor(ticks.length*.95)],awakeRatio:awake/samples,collisionCalls:collisions.count,angleGeometryTransforms:transforms.count,costMs:cost,calls};g.destroy();return result; +} +const out=[];for(const level of [maps[0],maps.find(l=>l.id==='420000'),county])for(const shake of [false,true])for(const upright of [false,true])out.push(run(level,upright,shake)); +const report={scope:'Node physics only; upright means one button press at tick 1200, not a mode; method times are inclusive and instrumentation adds overhead; no rendering/video or native FPS claim',source,cases:out};if(args[1])fs.writeFileSync(args[1],JSON.stringify(report,null,2)+'\n');else console.log(JSON.stringify(report,null,2)); diff --git a/scripts/requirements-gis.txt b/scripts/requirements-gis.txt new file mode 100644 index 0000000..3af72fb --- /dev/null +++ b/scripts/requirements-gis.txt @@ -0,0 +1,2 @@ +# Only needed to regenerate src/county assets; not needed by npm run build. +shapely==2.1.2 diff --git a/scripts/serve.mjs b/scripts/serve.mjs index e7a715d..2882595 100644 --- a/scripts/serve.mjs +++ b/scripts/serve.mjs @@ -1,6 +1,7 @@ import http from 'node:http'; import fs from 'node:fs'; import path from 'node:path'; -const root=path.resolve(process.env.PREVIEW_DIR||'src'); +const root=path.resolve(process.env.PREVIEW_DIR||'dist'); +if(!fs.existsSync(path.join(root,'index.html')))throw Error('请先运行 npm run build,再启动预览。'); const mime={'.html':'text/html; charset=utf-8','.js':'text/javascript; charset=utf-8','.css':'text/css; charset=utf-8','.svg':'image/svg+xml','.png':'image/png','.json':'application/json'}; http.createServer((req,res)=>{let p;try{p=decodeURIComponent(new URL(req.url,'http://localhost').pathname);}catch{res.writeHead(400).end();return;}const file=path.resolve(root,'.'+(p==='/'?'/index.html':p));if(!file.startsWith(root+path.sep)){res.writeHead(403).end();return;}fs.readFile(file,(err,b)=>{if(err){res.writeHead(404).end('Not found');return;}res.writeHead(200,{'Content-Type':mime[path.extname(file)]||'application/octet-stream','Cache-Control':'no-store'});res.end(b);});}).listen(4173,'127.0.0.1',()=>console.log('山河拼图预览:http://localhost:4173')); diff --git a/scripts/triangulate-county-holes.mjs b/scripts/triangulate-county-holes.mjs new file mode 100644 index 0000000..68d8db3 --- /dev/null +++ b/scripts/triangulate-county-holes.mjs @@ -0,0 +1,14 @@ +// Preparation only: static hole-aware convex parts and robust decomposition fallback. +import fs from 'node:fs';import earcut from 'earcut';import assert from 'node:assert/strict';import {createHash} from 'node:crypto';import M from 'matter-js';import gameModule from '../src/game.js'; +function inside([x,y],ring){let hit=false;for(let i=0,j=ring.length-1;iy)!==(b[1]>y)&&x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])hit=!hit;}return hit;} +function triangulate(region){region.physics=[];let assigned=0;for(const outer of region.rings){const holes=(region.holes||[]).filter(h=>inside(h[0],outer));assigned+=holes.length;const flat=earcut.flatten([outer,...holes]),indices=earcut(flat.vertices,flat.holes,2);assert.ok(earcut.deviation(flat.vertices,flat.holes,2,indices)<1e-8);for(let i=0;i[flat.vertices[j*2],flat.vertices[j*2+1]]));}assert.equal(assigned,(region.holes||[]).length);} +let regions=0,parts=0,fallbacks=0;const index=JSON.parse(fs.readFileSync('research/county-map-index.json','utf8')); +for(const name of fs.readdirSync('src/county').filter(n=>n.endsWith('.js'))){const path='src/county/'+name,level=JSON.parse(fs.readFileSync(path,'utf8').replace(/^window\.PuzzleAtlas\.register\(/,'').replace(/\);\s*$/,'')); + for(const region of level.regions)if(region.holes&®ion.holes.length){regions++;triangulate(region);parts+=region.physics.length;} + // Exercise the exact game's decomposition at common viewport scales. A valid + // but awkward outline must not leave missing physical parts after max-depth. + const fallback=new Set();for(const [w,h] of [[320,568],[340,560],[440,680]]){const game=new gameModule.Game(level,w,h,4);for(let id=0;id{if(String(args[0]).includes('quickDecomp'))warned=true;else previous(...args);};let group;try{group=game.createGroup([id],{tx:0,ty:0,angle:0});}finally{console.warn=previous;}if(warned)fallback.add(id);M.Composite.remove(game.engine.world,group.body);game.groups=[];}game.destroy();} + for(const id of fallback){triangulate(level.regions[id]);fallbacks++;} + const encoded='window.PuzzleAtlas.register('+JSON.stringify(level)+');\n';fs.writeFileSync(path,encoded);const entry=index.levels.find(l=>l.id===level.id);entry.assetSha256=createHash('sha256').update(encoded).digest('hex');entry.collisionFallbacks=Array.from(fallback,id=>level.regions[id].id); +} +fs.writeFileSync('research/county-map-index.json',JSON.stringify(index)+'\n');console.log('County physics:',regions,'hole regions,',parts,'hole parts;',fallbacks,'static decomposition fallbacks'); diff --git a/scripts/triangulate-holes.mjs b/scripts/triangulate-holes.mjs new file mode 100644 index 0000000..e750e8b --- /dev/null +++ b/scripts/triangulate-holes.mjs @@ -0,0 +1,10 @@ +// Build-only triangulation: the game consumes static convex polygons, no library. +import earcut from 'earcut';import fs from 'node:fs';import assert from 'node:assert/strict'; +const filename='src/maps.js',data=JSON.parse(fs.readFileSync(filename,'utf8').replace(/^window\.MAP_DATA=/,'').replace(/;\s*$/,'')); +function inside([x,y],ring){let hit=false;for(let i=0,j=ring.length-1;iy)!==(b[1]>y)&&x<(b[0]-a[0])*(y-a[1])/(b[1]-a[1])+a[0])hit=!hit;}return hit;} +let count=0; +for(const lv of data.levels)for(const region of lv.regions){if(!region.holes||!region.holes.length)continue;region.physics=[];let assigned=0; + for(const outer of region.rings){const holes=region.holes.filter(h=>inside(h[0],outer));assigned+=holes.length;if(!holes.length){region.physics.push(outer);continue;}const flat=earcut.flatten([outer,...holes]),indices=earcut(flat.vertices,flat.holes,2);assert.ok(earcut.deviation(flat.vertices,flat.holes,2,indices)<1e-8); + for(let i=0;i[flat.vertices[j*2],flat.vertices[j*2+1]])); + }assert.equal(assigned,region.holes.length);count++;} +fs.writeFileSync(filename,'window.MAP_DATA='+JSON.stringify(data)+';\n');console.log('保留内嵌县市的环形碰撞区域:'+count+'块'); diff --git a/src/app.js b/src/app.js index 64b5bdb..8bed3b1 100644 --- a/src/app.js +++ b/src/app.js @@ -1,115 +1,204 @@ (function(){ 'use strict'; -var $=function(id){return document.getElementById(id);},data=window.MAP_DATA,C=window.PuzzleCore,Engine=window.PuzzleGame; +var $=function(id){return document.getElementById(id);},data=window.MAP_DATA,C=window.PuzzleCore,Engine=window.PuzzleGame,Atlas=window.PuzzleAtlas; var colors=['#c3d4b4','#e3c78f','#d2b5a5','#b5cbd0','#d2c69d','#b1c5a0','#d9bca6','#bdc7ac','#d7c5c5','#bfd0ba']; -var provinceCode='330000',mode='province',speed=0,bounce=1,result=null,level=data.levels[0],game=null,screen='entry',records={},pausedByModal=false,toastTimer=null; -var canvas=$('board'),ctx=canvas.getContext('2d'),w=0,h=0,dpr=1,miniTool=null,storageNative=false,storeReady=false,saveChain=Promise.resolve(); -var reducedMotion=typeof window.matchMedia==='function'?window.matchMedia('(prefers-reduced-motion: reduce)'):null,modeGesture=null,suppressModeClickUntil=0; +var selectedProvince=null,selectedCity=null,pendingCity=null,mapRequest=0,journalProvince='',entryMap=data.levels[0],mode='province',bounce=1,snap=0,difficultyDraft=null,result=null,level=data.levels[0],game=null,screen='entry',records={},triumphs={},pausedByModal=false,toastTimer=null,journalFilter='all',journalPage=0; +var canvas=$('board'),ctx=canvas.getContext('2d'),w=0,h=0,dpr=1,miniTool=null,storageNative=false,storeReady=false,storeReadable=true,saveChain=Promise.resolve(); +var videoCapture=null,videoJob=null,videoOutput=null,videoSettled=false,videoNotice='',victoryAge=0; +var reducedMotion=typeof window.matchMedia==='function'?window.matchMedia('(prefers-reduced-motion: reduce)'):null,renderedMap=null; var holdTimer=null,inputDirection=0,tankGesture=null,swipeTrace=null,keys={left:false,right:false},rafId=0,last=0,uiAt=0,lastLabelBoxes=[],labelObstacles=[]; +// Small DOM-backed diagnostics survive a failed frame without exposing player +// storage. Update at 2 Hz; no per-frame console output or network reporting. +var loopHealth={build:'2.2.0-direct-upright-20261018',frames:0,stage:'idle',physicsMs:0,drawMs:0,videoMs:0,error:null},healthAt=-Infinity; +function loopNow(){return window.performance&&typeof window.performance.now==='function'?window.performance.now():Date.now();} +function writeLoopHealth(force){var now=loopNow();if(!force&&now-healthAt<500)return;healthAt=now;canvas.setAttribute('data-loop-health',JSON.stringify({build:loopHealth.build,frames:loopHealth.frames,stage:loopHealth.stage,physicsMs:loopHealth.physicsMs,drawMs:loopHealth.drawMs,videoMs:loopHealth.videoMs,error:loopHealth.error,status:game?game.status:screen,level:level.id,dropped:game?game.dropped:0,groups:game?game.groups.length:0,uprightCount:game?game.uprightCount:0}));} +function recordLoopError(stage,error){loopHealth.error={stage:stage,message:String(error&&error.message||error),stack:String(error&&error.stack||'').slice(0,3000)};writeLoopHealth(true);if(window.console&&typeof console.error==='function')console.error('Shanhe '+stage,error);} +function captureVideoFrame(force){if(!videoCapture)return;var started=loopNow();try{videoCapture.capture(canvas,videoMeta(),!!force);}catch(error){recordLoopError('video',error);try{videoCapture.dispose();}catch(ignored){}videoCapture=null;videoNotice='本局视频记录暂不可用,可分享成绩图';toast('视频记录遇到问题,游戏可继续');}finally{loopHealth.videoMs=loopNow()-started;}} +function pauseAfterFrameError(error){recordLoopError(loopHealth.stage,error);stopInput();if(!game||game.endReason)return;game.status='paused';pausedByModal=true;openModal('TAKE A BREATH','

画面暂时停了一下

已暂停并保留本局进度,可以尝试继续,或结束旅程保存成绩。

',[{label:'继续本局',primary:true,action:function(){closeModal();}},{label:'结束旅程',action:finishJourney}]);} function motionAllowed(){return !reducedMotion||!reducedMotion.matches;} function pulseButton(button,kind){if(!button||button.disabled||!motionAllowed())return;button.classList.remove('tap-pop','bounce-pop');void button.offsetWidth;button.classList.add(kind||'tap-pop');} -document.addEventListener('animationend',function(e){if(e.target.classList){e.target.classList.remove('tap-pop','bounce-pop');}}); -document.addEventListener('click',function(e){var button=e.target.closest&&e.target.closest('button');pulseButton(button,button&&(button.hasAttribute('data-bounce')||button.id==='up')?'bounce-pop':'tap-pop');}); -function toast(msg){$('toast').textContent=msg;$('toast').hidden=false;clearTimeout(toastTimer);toastTimer=setTimeout(function(){$('toast').hidden=true;},3200);} +document.addEventListener('animationend',function(e){if(e.target.classList){e.target.classList.remove('tap-pop','bounce-pop','map-arrive','difficulty-arrive');}}); +document.addEventListener('click',function(e){var button=e.target.closest&&e.target.closest('button');pulseButton(button,button&&(button.hasAttribute('data-bounce'))?'bounce-pop':'tap-pop');}); +function toast(msg,quick){var node=$('toast');clearTimeout(toastTimer);node.classList.remove('toast-quick');node.textContent=msg;node.hidden=false;if(quick){void node.offsetWidth;node.classList.add('toast-quick');}toastTimer=setTimeout(function(){node.hidden=true;},quick?800:3200);} function version(options){return Number(options&&options.miniToolEnv&&options.miniToolEnv.buildVersion)||0;} var storePromise; -function mergeRecords(a,b){Object.keys(b).forEach(function(k){a[k]=Math.max(a[k]||0,b[k]);});return a;} +function parseStored(raw){try{return raw?JSON.parse(raw):{};}catch(e){return {};}} +function localStored(key){try{return parseStored(window.localStorage.getItem(key));}catch(e){return {};}} +async function writeProgress(){if(!storeReadable)throw Error('Storage read incomplete');var serialized=JSON.stringify({records:records,triumphs:triumphs});if(storageNative)await miniTool.setStorage({key:'shanhe-progress-v2',data:serialized});else window.localStorage.setItem('shanhe-progress-v2',serialized);} async function initStore(){var xhs=window.xhs;miniTool=xhs&&xhs.miniTool;var v=version(xhs&&xhs.launchOptions);if(!v&&miniTool&&typeof miniTool.getLaunchOptions==='function'){try{v=version(await miniTool.getLaunchOptions());}catch(e){v=0;}} storageNative=!!(Math.floor(v/1000)>=9460&&miniTool&&typeof miniTool.getStorage==='function'&&typeof miniTool.setStorage==='function'); -var old={};try{var legacy=window.localStorage.getItem('shanhe-records-v1');old=C.safeRecord(legacy?JSON.parse(legacy):{});}catch(e){}var loaded={};if(storageNative){try{var r=await miniTool.getStorage({key:'shanhe-records-v1'});loaded=C.safeRecord(r&&r.data?JSON.parse(r.data):{});}catch(e){}}else loaded=old; -records=mergeRecords(mergeRecords(loaded,old),records);storeReady=true;if(storageNative&&Object.keys(old).length){try{await miniTool.setStorage({key:'shanhe-records-v1',data:JSON.stringify(records)});}catch(e){toast('旧纪录已在当前页面恢复,迁移保存暂不可用');}}updateUI();} -function recordKey(){return level.id+':'+speed+(bounce?':'+bounce:'');} -function saveRecord(){var key=recordKey();records[key]=Math.max(records[key]||0,game.score);updateUI();saveChain=saveChain.then(async function(){await storePromise;try{var serialized=JSON.stringify(records);if(storageNative)await miniTool.setStorage({key:'shanhe-records-v1',data:serialized});else window.localStorage.setItem('shanhe-records-v1',serialized);}catch(e){toast('本次纪录仅保留在当前页面,存储暂不可用');}});} -function shortName(name){return name.replace(/特别行政区|维吾尔自治区|壮族自治区|回族自治区|自治区|省|市$/g,'');} +var old=C.safeRecord(localStored('shanhe-records-v1')),loaded=C.mergeProgress({records:old},localStored('shanhe-progress-v2')),nativeLegacy={}; +if(storageNative){try{var legacy=await miniTool.getStorage({key:'shanhe-records-v1'});nativeLegacy=C.safeRecord(parseStored(legacy&&legacy.data));}catch(e){}loaded=C.mergeProgress(loaded,{records:nativeLegacy});try{var current=await miniTool.getStorage({key:'shanhe-progress-v2'});loaded=C.mergeProgress(loaded,parseStored(current&¤t.data));}catch(e){storeReadable=false;toast('战绩读取暂不可用,新成绩先保留在当前页面');}} +loaded=C.mergeProgress(loaded,{records:records,triumphs:triumphs});records=loaded.records;triumphs=loaded.triumphs;storeReady=true; +if(storeReadable&&(Object.keys(old).length||Object.keys(nativeLegacy).length||(storageNative&&(Object.keys(loaded.records).length||Object.keys(loaded.triumphs).length)))){try{await writeProgress();}catch(e){toast('战绩已在当前页面恢复,迁移保存暂不可用');}}updateUI();if($('modal').classList.contains('journal-modal')&&$('modal').hasAttribute('open'))renderJournal();} +function recordKey(){return level.id+':4:'+bounce+':s'+snap;} +function bestRecord(){var best=records[recordKey()]||0;if(snap===2)best=Math.max(best,records[level.id+':4'+(bounce?':'+bounce:'')]||0);return best;} +function saveRecord(){var progress=C.finishProgress({records:records,triumphs:triumphs},game.level.id,game.snapIndex,game.bounceIndex,game.score,game.endReason==='won');records=progress.records;triumphs=progress.triumphs;updateUI();saveChain=saveChain.then(async function(){await storePromise;try{await writeProgress();}catch(e){toast('本次战绩仅保留在当前页面,存储暂不可用');}});} +function shortName(name){return name.replace(/(?:特别行政区|维吾尔自治区|壮族自治区|回族自治区|自治区|省|市)$/,'');} +function displayLevelName(){return selectedCity?shortName(level.provinceName)+' · '+shortName(level.name):selectedProvince?shortName(level.name):level.name;} function sizeCanvas(c,ww,hh){c.width=Math.round(ww*dpr);c.height=Math.round(hh*dpr);var context=c.getContext('2d');context.setTransform(dpr,0,0,dpr,0,0);return context;} function layout(){ dpr=Math.min(window.devicePixelRatio||1,2); var bodyStyle=window.getComputedStyle(document.body),padding=(parseFloat(bodyStyle.paddingTop)||0)+(parseFloat(bodyStyle.paddingBottom)||0); var viewport=window.visualViewport;var visibleHeight=viewport&&typeof viewport.height==='number'&&viewport.scale===1?Math.min(window.innerHeight,viewport.height):window.innerHeight;var available=Math.max(200,visibleHeight-padding);document.documentElement.style.setProperty('--content-top',(parseFloat(bodyStyle.paddingTop)||0)+'px');document.documentElement.style.setProperty('--game-height',available+'px');document.body.classList.toggle('compact-entry',available<700||window.innerWidth<=720);document.body.classList.toggle('tiny-entry',available<540); - if(screen==='entry'){fitEntryMap();drawReference();return;}if(screen==='result'){fitCard();return;} + if(screen==='entry'){var main=document.querySelector('.atlas-main'),scene=document.querySelector('.atlas-scene'),room=main.clientHeight-document.querySelector('.atlas-navigation').offsetHeight-document.querySelector('.atlas-tip').offsetHeight-document.querySelector('.atlas-actions').offsetHeight-8;document.documentElement.style.setProperty('--atlas-scene-height',Math.max(80,Math.min(room,window.innerWidth<=720?scene.clientWidth*1.18:room))+'px');drawReference();return;}if(screen==='result'){fitCard();return;} var r=canvas.getBoundingClientRect(),nw=Math.round(r.width),nh=Math.round(r.height); if(nw<1||nh<1)return; - var changed=w!==nw||h!==nh;w=nw;h=nh;sizeCanvas(canvas,w,h);labelObstacles=['board-status'].map(function(id){var box=$(id).getBoundingClientRect();return {x:box.left-r.left-3,y:box.top-r.top-2,w:box.width+6,h:box.height+4};});var danger=document.querySelector('.danger-label').getBoundingClientRect();labelObstacles.push({x:danger.left-r.left-3,y:danger.top-r.top-2,w:danger.width+6,h:danger.height+4}); - if(game&&changed)game.resize(w,h);drawNext();if(game)draw(); -} -function fitEntryMap(){ - var landscape=window.innerWidth>=600&&window.innerHeight<=520;if(window.innerWidth>720&&!landscape){document.body.classList.remove('map-roomy');return;} - var main=document.querySelector('.entry-main'),setup=document.querySelector('.setup'),style=window.getComputedStyle(main),inside=main.clientHeight-(parseFloat(style.paddingTop)||0)-(parseFloat(style.paddingBottom)||0); - var space=landscape?inside:inside-setup.offsetHeight-10,preview=Math.max(44,Math.min(220,space));document.documentElement.style.setProperty('--entry-preview-height',Math.floor(preview)+'px');document.body.classList.toggle('map-roomy',!landscape&&preview>=180); + var changed=w!==nw||h!==nh;w=nw;h=nh;sizeCanvas(canvas,w,h);var line=Engine.dangerLine(h);$('board-status').style.top=Math.min(h-18,line+20)+'px';$('drop-countdown').style.top=Math.round(line-23)+'px';document.querySelector('.danger-label').style.top=Math.round(line-10)+'px';labelObstacles=['board-status'].map(function(id){var box=$(id).getBoundingClientRect();return {x:box.left-r.left-3,y:box.top-r.top-2,w:box.width+6,h:box.height+4};});labelObstacles.push({x:0,y:0,w:w,h:line+2});var danger=document.querySelector('.danger-label').getBoundingClientRect();labelObstacles.push({x:danger.left-r.left-3,y:danger.top-r.top-2,w:danger.width+6,h:danger.height+4}); + if(game&&changed){stopInput();game.resize(w,h);}drawNext();if(game)draw(); } function openModal(kicker,html,actions){ stopInput();if(game&&game.status==='playing'){game.status='paused';pausedByModal=true;cancelAnimationFrame(rafId);rafId=0;} - $('modal').classList.remove('province-picker-modal');$('modal-kicker').textContent=kicker;$('modal-content').innerHTML=html;$('modal-actions').innerHTML=''; - (actions||[]).forEach(function(a){var b=document.createElement('button');b.className=a.primary?'primary':'secondary';b.textContent=a.label;b.addEventListener('click',a.action);$('modal-actions').appendChild(b);}); + $('modal').classList.remove('difficulty-modal','difficulty-arrive','journal-modal');$('modal').removeAttribute('aria-labelledby');$('modal-kicker').textContent=kicker;$('modal-content').innerHTML=html;$('modal-actions').innerHTML=''; + (actions||[]).forEach(function(a){var b=document.createElement('button');b.className=a.primary?'primary':'secondary';b.textContent=a.label;b.addEventListener('click',a.action);if(a.id)b.id=a.id;$('modal-actions').appendChild(b);}); var d=$('modal');if(!d.hasAttribute('open')){if(typeof d.showModal==='function')d.showModal();else{d.setAttribute('open','');d.classList.add('modal-fallback');}} updateUI(); } -function closeModal(resume){$('province-picker').classList.remove('expanded');var d=$('modal');if(typeof d.close==='function')d.close();else{d.removeAttribute('open');d.classList.remove('modal-fallback');}if(pausedByModal&&resume!==false&&game&&game.status==='paused'){game.status='playing';last=0;schedule();}pausedByModal=false;updateUI();} -$('modal').addEventListener('cancel',function(e){e.preventDefault();closeModal();});$('close-modal').addEventListener('click',function(){closeModal();}); -function start(){ - stopInput();result=null;lastLabelBoxes=[];if(game)game.destroy();game=null;screen='game';document.body.classList.add('is-playing');$('entry-screen').hidden=true;$('result-screen').hidden=true;$('game-screen').hidden=false;window.scrollTo(0,0); - $('board-status').textContent='轻划后松手,让山河随惯性相遇';$('tank').style.transform='translateX(0px)';layout(); - game=new Engine.Game(level,w,h,speed,onGameEvent,null,bounce);game.start();last=0;drawNext();updateUI();schedule(); +function closeModal(resume){difficultyDraft=null;var d=$('modal');if(typeof d.close==='function')d.close();else{d.removeAttribute('open');d.classList.remove('modal-fallback');}if(pausedByModal&&resume!==false&&game&&game.status==='paused'){game.status='playing';last=0;schedule();}pausedByModal=false;updateUI();} +function dismissModal(){if(difficultyDraft&&difficultyDraft.starting&&screen==='game'){closeModal(false);pausedByModal=true;pause();}else closeModal();} +$('modal').addEventListener('cancel',function(e){e.preventDefault();dismissModal();});$('close-modal').addEventListener('click',dismissModal); +function detailPlayable(){return !!selectedProvince&&!pendingCity&&level.id===(selectedCity||selectedProvince);} +function detailLabel(){return level.playLabel||'地级拼图';} +function start(event){var button=event&&event.currentTarget;openDifficulty(true,button&&button.getBoundingClientRect?button.getBoundingClientRect():null);} +function launchJourney(){ + if(selectedProvince&&!detailPlayable())return; + loopHealth.frames=0;loopHealth.error=null;healthAt=-Infinity;victoryAge=0;resetVideo();videoCapture=new window.PuzzleVideo.Capture({snapshot:videoScene,render:renderVideoScene});stopInput();result=null;lastLabelBoxes=[];if(game)game.destroy();game=null;screen='game';document.body.classList.add('is-playing');$('entry-screen').hidden=true;$('result-screen').hidden=true;$('game-screen').hidden=false;window.scrollTo(0,0); + $('board-status').textContent='红线下方轻划,晃动整框山河';$('tank').style.transform='translateX(0px)';layout(); + game=new Engine.Game(level,w,h,4,onGameEvent,null,bounce,snap);game.start();last=0;drawNext();updateUI();draw();captureVideoFrame(true);schedule(); } -function showEntry(){stopInput();cancelAnimationFrame(rafId);rafId=0;if(game)game.destroy();game=null;lastLabelBoxes=[];screen='entry';document.body.classList.remove('is-playing');$('game-screen').hidden=true;$('result-screen').hidden=true;$('entry-screen').hidden=false;result=null;$('tank').style.transform='translateX(0px)';window.scrollTo(0,0);updateUI();layout();} +function showEntry(){resetVideo();document.querySelectorAll('#entry-screen .tap-pop,#entry-screen .bounce-pop').forEach(function(b){b.classList.remove('tap-pop','bounce-pop');});stopInput();cancelAnimationFrame(rafId);rafId=0;if(game)game.destroy();game=null;lastLabelBoxes=[];screen='entry';document.body.classList.remove('is-playing');$('game-screen').hidden=true;$('result-screen').hidden=true;$('entry-screen').hidden=false;result=null;$('tank').style.transform='translateX(0px)';window.scrollTo(0,0);updateUI();layout();} function finishJourney(){closeModal(false);if(game)game.finish();} -function pause(){if(!game||screen!=='game'||$('modal').hasAttribute('open'))return;if(game.endReason){showResult();return;}openModal('TAKE A BREATH','

山河等你回来

'+level.name+' · '+Engine.SPEEDS[speed].name+' · '+Engine.BOUNCES[bounce].name+'

暂停不计时。随时结束,也能带走这一程的成绩图。

',[{label:'继续游戏',primary:true,action:function(){closeModal();}},{label:'结束旅程',action:finishJourney},{label:'重新开局',action:function(){closeModal(false);start();}}]);} +function pause(event){if(!game||screen!=='game'||$('modal').hasAttribute('open'))return;if(game.endReason){if(event&&event.type==='click')showResult();return;}openModal('TAKE A BREATH','

山河等你回来

'+displayLevelName()+' · '+'随心落子 · '+game.snap.name+' · '+game.bounce.name+' · 回正 '+game.uprightCount+' 次'+'

暂停不计时。随时结束,也能带走这一程的成绩图。

',[{label:'继续游戏',primary:true,action:function(){closeModal();}},{label:'结束旅程',action:finishJourney},{label:'重新开局',action:start}]);} function onGameEvent(type,detail){ - if(type==='spawn'){drawNext();if(game.queue.length===0)$('board-status').textContent='碎片已全部落下 · 继续晃动容器';} - else if(type==='merge')$('board-status').textContent=(detail.sea===1?'跨海连接':detail.sea===2?'隔区连接':'边缘吻合')+(game.chain>1?' · '+game.chain+' 连合':''); + if(type==='prepare'){drawNext();} + else if(type==='spawn'){drawNext();if(game.queue.length===0)$('board-status').textContent='山河已到齐 · 继续晃动,慢慢拼合';} + else if(type==='merge')$('board-status').textContent=(detail.pocket?'留洞补位':detail.sea===1?'跨海连接':detail.sea===2?'隔区连接':'边缘吻合')+(game.chain>1?' · '+game.chain+' 连合':''); else if(type==='zoom')$('board-status').textContent='拼合区域变大 · 视野自动缩放'; - else if(type==='end'){stopInput();saveRecord();showResult();} + else if(type==='milestone')$('board-status').textContent=detail.names.join(' · ')+' · 拼合完成'; + else if(type==='end'){stopInput();saveRecord();if(detail.won){$('board-status').textContent=level.regions.length+' 块山河,完整相遇';drawNext();victoryAge=0;last=0;schedule();}else showResult();} updateUI(); } function updateUI(){ - var key=recordKey(),best=records[key],config=Engine.SPEEDS[speed];$('entry-screen').classList.toggle('city-mode',mode==='city');var destination=data.levels.find(function(l){return l.id===provinceCode;});$('province-name').textContent=destination?destination.name:'浙江省';$('province-count').textContent=(destination?destination.regions.length:11)+' 个地级单元'; - $('entry-best').textContent=best?best.toLocaleString('zh-CN'):'—';$('journey-count').textContent=level.regions.length+' 块山河';$('map-caption').textContent=level.name+' · '+level.regions.length+' 块等你拼完整'; - $('city-select-panel').hidden=mode!=='city';$('city-note').textContent='27 个省区可选 · 仅拼地级市、自治州、地区、盟'; - $('multiplier').textContent='得分 ×'+config.multiplier;var comments=['慢慢来,也能看见山河','找到自己的拼图节奏','眼疾手快,山河相逢','留给地理高手的挑战'];$('speed-note').textContent=config.interval/1000+' 秒落下一块 · '+comments[speed]; - document.querySelectorAll('[data-mode]').forEach(function(b){var selected=b.getAttribute('data-mode')===mode;b.classList.toggle('selected',selected);b.setAttribute('aria-pressed',String(selected));}); -document.querySelectorAll('[data-speed]').forEach(function(b){var selected=Number(b.getAttribute('data-speed'))===speed;b.classList.toggle('selected',selected);b.setAttribute('aria-pressed',String(selected));}); - document.querySelectorAll('[data-bounce]').forEach(function(b){var selected=Number(b.getAttribute('data-bounce'))===bounce;b.classList.toggle('selected',selected);b.setAttribute('aria-pressed',String(selected));}); + $('entry-screen').classList.toggle('province-selected',!!selectedProvince);$('entry-screen').classList.toggle('fine-map',!!selectedProvince&&mode!=='city'&&mode!=='province');var best=bestRecord(),choice=difficultyDraft||{bounce:bounce,snap:snap},unavailable=!!selectedProvince&&!detailPlayable(); + $('entry-best').textContent=!unavailable&&best?best.toLocaleString('zh-CN'):'—'; + $('atlas-title').textContent=selectedProvince?shortName(entryMap.name):'中国';$('atlas-mode').textContent=pendingCity?'正在展开':selectedProvince?(unavailable?'暂未开放':detailLabel()):'省级拼图'; + $('journey-count').innerHTML=(unavailable&&!pendingCity)?'— 块山河':''+level.regions.length+' 块山河'; + $('map-caption').textContent=(unavailable&&!pendingCity)?'暂未开放细分关卡':selectedProvince?(level.unitCaption||'地级市 · 自治州 · 地区 · 盟'):'34 个省级行政区'; + $('atlas-back').hidden=!selectedProvince;$('atlas-back').disabled=!selectedProvince;var backName=selectedCity?shortName(Atlas.get(selectedProvince).name)+'地图':'全国地图';$('atlas-back-label').textContent=backName;$('atlas-back').setAttribute('aria-label','返回'+backName);$('start').disabled=unavailable;$('start-label').textContent=pendingCity?'地图展开中':unavailable?'暂未开放':'开启旅程';$('reference').setAttribute('aria-busy',String(!!pendingCity)); + $('atlas-tip').textContent=pendingCity?'正在展开'+shortName(Atlas.meta(pendingCity).name)+'的县区地图…':unavailable?'暂缺可靠细分轮廓,可返回上级地图。':selectedProvince?(mode==='city'?'直接出发拼这片省域,或点击地级市继续选县区。':level.scopeNote||'目的地已选好,出发去拼这片山河。'):'点击省区,拼一片家乡;或直接出发,拼完整个中国。'; + $('difficulty-summary').textContent=Engine.SNAP_DIFFICULTIES[snap].name+' · '+Engine.BOUNCES[bounce].name; + if($('difficulty-destination'))$('difficulty-destination').textContent=displayLevelName()+' · '+level.regions.length+' 块山河'; + if($('snap-note'))$('snap-note').textContent=Engine.SNAP_DIFFICULTIES[choice.snap].note; + document.querySelectorAll('[data-snap]').forEach(function(b){var selected=Number(b.getAttribute('data-snap'))===choice.snap;b.classList.toggle('selected',selected);b.setAttribute('aria-pressed',String(selected));}); + document.querySelectorAll('[data-bounce]').forEach(function(b){var selected=Number(b.getAttribute('data-bounce'))===choice.bounce;b.classList.toggle('selected',selected);b.setAttribute('aria-pressed',String(selected));}); $('pause').disabled=!game; + $('upright-once').disabled=!game||game.status!=='playing'||!game.groups.length; if(!game)return; $('score').textContent=game.score.toLocaleString('zh-CN');$('merged').textContent=game.groups.reduce(function(n,g){return Math.max(n,g.ids.length);},0);$('total').textContent=level.regions.length; - $('game-title').textContent=level.name+(mode==='city'?' · 地级拼图':'');$('game-speed').textContent=config.name+' · '+Engine.BOUNCES[bounce].name+' · ×'+config.multiplier; + $('game-title').textContent=displayLevelName()+(selectedProvince?' · '+detailLabel():'');$('game-speed').textContent=game.snap.name+' · '+game.bounce.name+' · 随心落子'; $('progress-label').textContent='已落下 '+game.dropped+' / '+level.regions.length+' 块'+(game.maxChain>1?' · 最佳 '+game.maxChain+' 连合':''); } -function polygon(context,ring,transform){context.beginPath();ring.forEach(function(p,i){var q=transform(p);if(i===0)context.moveTo(q.x,q.y);else context.lineTo(q.x,q.y);});context.closePath();} -function drawPiece(context,region,id,transform,opts){opts=opts||{};context.save();context.fillStyle=opts.ghost?'rgba(110,142,83,.10)':colors[id%colors.length];context.strokeStyle=opts.impact?'#96a47e':opts.physical?'#819778':'#fffdf2';context.lineWidth=opts.impact?1.65:opts.physical?1.4:1.25;if(opts.physical){context.shadowColor='rgba(42,62,46,.15)';context.shadowOffsetY=2;context.shadowBlur=3;}region.rings.forEach(function(r){polygon(context,r,transform);context.fill();context.stroke();});if(opts.label){context.shadowColor='transparent';context.shadowOffsetY=0;context.shadowBlur=0;var p=transform(region.center);var name=mode==='province'?shortName(region.name):region.name;var size=opts.font||10;context.font='500 '+size+'px -apple-system,"PingFang SC",sans-serif';context.textAlign='center';context.textBaseline='middle';context.strokeStyle='rgba(255,254,244,.88)';context.lineWidth=2.5;context.strokeText(name,p.x,p.y);context.fillStyle='#486044';context.fillText(name,p.x,p.y);}context.restore();} +function polygon(context,ring,transform,append){if(!append)context.beginPath();ring.forEach(function(p,i){var q=transform(p);if(i===0)context.moveTo(q.x,q.y);else context.lineTo(q.x,q.y);});context.closePath();} +function drawPiece(context,region,id,transform,opts){opts=opts||{};context.save();context.fillStyle=opts.ghost?'rgba(110,142,83,.10)':colors[id%colors.length];context.strokeStyle=opts.celebrating?'#ba9b53':opts.impact?'#96a47e':opts.physical?'#819778':'#fffdf2';context.lineWidth=opts.celebrating?2:opts.impact?1.65:opts.physical?1.4:1.25;if(opts.physical){context.shadowColor='rgba(42,62,46,.15)';context.shadowOffsetY=2;context.shadowBlur=3;}if(opts.celebrating){context.shadowColor='rgba(196,163,81,.5)';context.shadowBlur=8;}if(region.holes&®ion.holes.length){context.beginPath();region.rings.concat(region.holes).forEach(function(r){polygon(context,r,transform,true);});context.fill('evenodd');context.stroke();}else region.rings.forEach(function(r){polygon(context,r,transform);context.fill();context.stroke();});if(opts.label){context.shadowColor='transparent';context.shadowOffsetY=0;context.shadowBlur=0;var p=transform(region.center);var name=region.labelName||(mode==='province'?shortName(region.name):region.name);var size=opts.font||10;context.font='500 '+size+'px -apple-system,"PingFang SC",sans-serif';context.textAlign='center';context.textBaseline='middle';context.strokeStyle='rgba(255,254,244,.88)';context.lineWidth=2.5;context.strokeText(name,p.x,p.y);context.fillStyle='#486044';context.fillText(name,p.x,p.y);}context.restore();} function staticTransform(ww,hh,padding){var sc=Math.min((ww-padding*2)/level.width,(hh-padding*2)/level.height),ox=(ww-level.width*sc)/2,oy=(hh-level.height*sc)/2;return function(p){return {x:p[0]*sc+ox,y:p[1]*sc+oy};};} -function drawDecorations(context,transform){if(!level.decorations)return;context.save();context.fillStyle='#a1ad95';context.strokeStyle='#a1ad95';context.lineWidth=.5;level.decorations.forEach(function(ring){polygon(context,ring,transform);context.fill();context.stroke();});context.restore();} +function drawDecorations(context,transform,map){map=map||level;if(!map.decorations)return;context.save();context.fillStyle='#a1ad95';context.strokeStyle='#a1ad95';context.lineWidth=.5;map.decorations.forEach(function(ring){polygon(context,ring,transform);context.fill();context.stroke();});context.restore();} function renderLabels(context,items,ww,hh,fontSize,obstacles){ var placed=[],offsets=[[0,0],[0,-18],[0,18],[-24,-12],[24,-12],[-24,12],[24,12],[0,-36],[0,36],[-45,0],[45,0],[-45,-25],[45,-25]]; context.save();context.font='500 '+fontSize+'px -apple-system,"PingFang SC",sans-serif';context.textAlign='center';context.textBaseline='middle'; items.sort(function(a,b){return Number(a.tiny)-Number(b.tiny);}).forEach(function(item){ var lines=item.name.length>7?[item.name.slice(0,Math.ceil(item.name.length/2)),item.name.slice(Math.ceil(item.name.length/2))]:[item.name]; var width=Math.max.apply(null,lines.map(function(line){return context.measureText(line).width;}))+10,height=lines.length*(fontSize+2)+5,best=null,bestCost=Infinity; - offsets.forEach(function(o){var x=Math.max(width/2+4,Math.min(ww-width/2-4,item.anchor.x+o[0])),y=Math.max(height/2+4,Math.min(hh-height/2-5,item.anchor.y+o[1]));var box={x:x-width/2,y:y-height/2,w:width,h:height,cx:x,cy:y};var cost=Math.hypot(x-item.anchor.x,y-item.anchor.y)*.25;placed.forEach(function(p){var overlap=Math.max(0,Math.min(p.x+p.w,box.x+box.w)-Math.max(p.x,box.x))*Math.max(0,Math.min(p.y+p.h,box.y+box.h)-Math.max(p.y,box.y));cost+=overlap*15;});(obstacles||[]).forEach(function(p){cost+=Math.max(0,Math.min(p.x+p.w,box.x+box.w)-Math.max(p.x,box.x))*Math.max(0,Math.min(p.y+p.h,box.y+box.h)-Math.max(p.y,box.y))*25;});if(cost.01?100000+overlap*15:0;});(obstacles||[]).forEach(function(p){var covered=Math.max(0,Math.min(p.x+p.w,box.x+box.w)-Math.max(p.x,box.x))*Math.max(0,Math.min(p.y+p.h,box.y+box.h)-Math.max(p.y,box.y));cost+=covered>.01?100000+covered*25:0;});if(costMath.max(p.x,box.x)+.1&&Math.min(p.y+p.h,box.y+box.h)>Math.max(p.y,box.y)+.1;});} + // Crowded clusters need farther label positions before accepting an overlap. + for(var radius=48;blocked(best)&&radius10; if(detached){context.strokeStyle='rgba(105,133,86,.65)';context.lineWidth=.8;context.beginPath();context.moveTo(Math.max(1,Math.min(ww-1,item.anchor.x)),Math.max(1,Math.min(hh-1,item.anchor.y)));context.lineTo(best.cx,best.cy);context.stroke();context.fillStyle='rgba(255,254,245,.94)';context.fillRect(best.x,best.y,best.w,best.h);context.strokeStyle='rgba(170,187,149,.7)';context.strokeRect(best.x+.5,best.y+.5,best.w-1,best.h-1);} - context.lineWidth=2.5;context.strokeStyle='rgba(255,254,244,.95)';context.fillStyle='#486044';lines.forEach(function(line,index){var y=best.cy+(index-(lines.length-1)/2)*(fontSize+2);context.strokeText(line,best.cx,y);context.fillText(line,best.cx,y);});best.name=item.name;placed.push(best); + context.lineWidth=fontSize*.2;context.strokeStyle='rgba(255,254,244,.95)';context.fillStyle='#486044';lines.forEach(function(line,index){var y=best.cy+(index-(lines.length-1)/2)*(fontSize+2);context.strokeText(line,best.cx,y);context.fillText(line,best.cx,y);});best.name=item.name;best.id=item.id;placed.push(best); });context.restore();return placed; } -function drawReference(){var c=$('reference'),ww=c.clientWidth||500,hh=c.clientHeight||240,con=sizeCanvas(c,ww,hh);con.clearRect(0,0,ww,hh);var trans=staticTransform(ww,hh-18,8);level.regions.forEach(function(r,i){drawPiece(con,r,i,trans,{label:false});});drawDecorations(con,trans);if(level.id==='100000'&&hh>110){var important=level.regions.filter(function(r){return ['710000','810000','820000'].indexOf(r.id)>=0;}).map(function(r){return {name:shortName(r.name),anchor:trans(r.label||r.center),tiny:true};});renderLabels(con,important,ww,hh-18,8);}} -function drawNext(){var c=$('next'),ww=c.clientWidth||64,hh=c.clientHeight||46,con=sizeCanvas(c,ww,hh);con.clearRect(0,0,ww,hh);if(!game||!game.queue.length){$('next-name').textContent=game?'已全部落下':'—';return;}var id=game.queue[0],r=level.regions[id],ring=r.rings[0],xs=ring.map(function(p){return p[0];}),ys=ring.map(function(p){return p[1];}),minx=Math.min.apply(null,xs),maxx=Math.max.apply(null,xs),miny=Math.min.apply(null,ys),maxy=Math.max.apply(null,ys),sc=Math.min((ww-8)/(maxx-minx),(hh-6)/(maxy-miny));drawPiece(con,{rings:[ring],center:r.center},id,function(p){return {x:(p[0]-(minx+maxx)/2)*sc+ww/2,y:(p[1]-(miny+maxy)/2)*sc+hh/2};},{});$('next-name').textContent=shortName(r.name);} -function contactTransform(g){ +function svgElement(tag,attrs,text){var el=document.createElementNS('http://www.w3.org/2000/svg',tag);Object.keys(attrs||{}).forEach(function(k){el.setAttribute(k,attrs[k]);});if(text!==undefined)el.textContent=text;return el;} +function ringPath(rings){return rings.map(function(ring){return ring.map(function(p,i){return (i?'L':'M')+p[0]+','+p[1];}).join('')+'Z';}).join('');} +function drawReference(){ + var svg=$('reference');svg.setAttribute('preserveAspectRatio',window.innerWidth<=720?'xMaxYMin meet':'xMidYMid meet');if(renderedMap===entryMap)return;renderedMap=entryMap; + var map=entryMap,national=!selectedProvince,pad=Math.max(map.width,map.height)*.055,fragment=document.createDocumentFragment(); + svg.setAttribute('viewBox',[-pad,-pad,map.width+pad*2,map.height+pad*2].join(' '));svg.setAttribute('aria-label',national?'中国地图,点击省区选择旅程':shortName(map.name)+'地图'); + var countyLabels=null;if(selectedCity){var measure=document.createElement('canvas').getContext('2d'),fontSize=Math.max(map.width,map.height)*.027;countyLabels=renderLabels(measure,map.regions.map(function(r){var anchor=r.label||r.center;return {id:r.id,name:r.labelName||r.name,anchor:{x:anchor[0]+pad,y:anchor[1]+pad},tiny:false};}),map.width+pad*2,map.height+pad*2,fontSize,[]);} + var callouts={'110000':[-55,-58],'120000':[50,-8],'310000':[80,0],'810000':[100,44],'820000':[-30,80],'710000':[85,8]}; + map.regions.forEach(function(r,i){ + var cityTarget=!national&&!selectedCity&&mode==='city'&&r.unitType==='prefecture',attributes=national?{'class':'atlas-region','data-province':r.id,'role':'button','tabindex':'0','aria-label':shortName(r.name)}:{'class':'atlas-region-detail','data-region':r.id};if(cityTarget){attributes['class']+=' atlas-city';attributes['data-city']=r.id;attributes.role='button';attributes.tabindex='0';attributes['aria-label']=shortName(r.name)+(Atlas.meta(r.id)?' · 县区拼图':' · 无县区子级');}var group=svgElement('g',attributes); + group.appendChild(svgElement('path',{d:ringPath(r.rings.concat(r.holes||[])),'fill-rule':'evenodd',fill:colors[i%colors.length],'class':'atlas-land'}));group.appendChild(svgElement('title',{},national?shortName(r.name):r.name)); + var anchor=r.label||r.center,offset=national&&callouts[r.id],x=anchor[0]+(offset?offset[0]:0),y=anchor[1]+(offset?offset[1]:0),font=Math.max(map.width,map.height)*(national?.025:.027),name=national?shortName(r.name):(r.labelName||r.name); + if(offset){group.appendChild(svgElement('path',{d:'M'+anchor[0]+','+anchor[1]+'L'+x+','+y,'class':'atlas-leader'}));group.appendChild(svgElement('rect',{x:x-name.length*font*.54-font*.25,y:y-font*.78,width:name.length*font*1.08+font*.5,height:font*1.5,rx:font*.18,'class':'atlas-label-bg'}));} + if(!selectedCity)group.appendChild(svgElement('text',{x:x,y:y,'font-size':font,'class':'atlas-label','text-anchor':'middle','dominant-baseline':'central'},name));fragment.appendChild(group); + }); + if(countyLabels)countyLabels.forEach(function(box){var r=map.regions.find(function(r){return r.id===box.id;}),anchor=r.label||r.center,x=box.cx-pad,y=box.cy-pad,group=svgElement('g',{'class':'county-map-label','aria-hidden':'true'}),font=Math.max(map.width,map.height)*.027;if(Math.hypot(x-anchor[0],y-anchor[1])>10){group.appendChild(svgElement('path',{d:'M'+anchor[0]+','+anchor[1]+'L'+x+','+y,'class':'atlas-leader'}));group.appendChild(svgElement('rect',{x:box.x-pad,y:box.y-pad,width:box.w,height:box.h,rx:4,'class':'atlas-label-bg'}));}var lines=box.name.length>7?[box.name.slice(0,Math.ceil(box.name.length/2)),box.name.slice(Math.ceil(box.name.length/2))]:[box.name];lines.forEach(function(line,i){group.appendChild(svgElement('text',{x:x,y:y+(i-(lines.length-1)/2)*(font+2),'font-size':font,'class':'atlas-label','text-anchor':'middle','dominant-baseline':'central'},line));});fragment.appendChild(group);}); + if(map.mapInsets)map.mapInsets.forEach(function(inset){var font=Math.max(map.width,map.height)*.021;fragment.appendChild(svgElement('rect',{x:inset.x,y:inset.y,width:inset.width,height:inset.height,fill:'none',stroke:'#a4b295','stroke-width':Math.max(map.width,map.height)*.0012,'stroke-dasharray':'5 5',rx:6,'aria-hidden':'true'}));fragment.appendChild(svgElement('text',{x:inset.x+inset.width/2,y:inset.y-font*.55,'font-size':font,fill:'#798e70','text-anchor':'middle','class':'atlas-inset-caption'},inset.label));}); + if(map.decorations)fragment.appendChild(svgElement('path',{d:ringPath(map.decorations),'class':'atlas-maritime','aria-hidden':'true'})); + // Small-region callouts must remain above neighboring province fills. + if(national)Object.keys(callouts).forEach(function(code){var marker=fragment.querySelector('[data-province="'+code+'"]');if(marker)fragment.appendChild(marker);}); + while(svg.firstChild)svg.removeChild(svg.firstChild);svg.appendChild(fragment); + if(motionAllowed()){svg.classList.remove('map-arrive');void svg.getBoundingClientRect();svg.classList.add('map-arrive');} +} +function drawNext(){var c=$('next'),ww=c.clientWidth||64,hh=c.clientHeight||46,con=sizeCanvas(c,ww,hh);con.clearRect(0,0,ww,hh);if(!game||!game.pending){$('next-name').textContent=game?(game.endReason?'旅程结束':'山河已到齐'):'—';return;}var id=game.pending?game.pending.id:game.queue[0],r=level.regions[id],ring=r.rings[0],xs=ring.map(function(p){return p[0];}),ys=ring.map(function(p){return p[1];}),minx=Math.min.apply(null,xs),maxx=Math.max.apply(null,xs),miny=Math.min.apply(null,ys),maxy=Math.max.apply(null,ys),sc=Math.min((ww-8)/(maxx-minx),(hh-6)/(maxy-miny))*Engine.PIECE_SIZE*game.singleFactor(id);drawPiece(con,{rings:[ring],holes:r.holes,center:r.center},id,function(p){return {x:(p[0]-(minx+maxx)/2)*sc+ww/2,y:(p[1]-(miny+maxy)/2)*sc+hh/2};},{});$('next-name').textContent=r.labelName||(mode==='province'?shortName(r.name):r.name);} +function contactTransform(game,g){ var left=g.hitUntil-game.clock,active=left>0&&motionAllowed(),progress=1-Math.max(0,left)/Engine.CONTACT_MS; var wave=active?Math.sin(progress*Math.PI*2)*Math.pow(1-progress,2)*.025*g.hitStrength:0,vertical=Math.abs(g.hitNormal.y)>=Math.abs(g.hitNormal.x); var sx=1+wave*(vertical?.55:-1),sy=1+wave*(vertical?-1:.55),center=g.body.position; return function(p){var q=game.worldPoint(g,p);return {x:center.x+(q.x-center.x)*sx,y:center.y+(q.y-center.y)*sy};}; } -function draw(){if(!game)return;ctx.clearRect(0,0,w,h);ctx.fillStyle='#f1f2e9';ctx.fillRect(0,0,w,h);ctx.fillStyle='#d8decd';for(var x=15;x0?'#bd3e42':'#d46e70';ctx.setLineDash([4,5]);ctx.beginPath();ctx.moveTo(0,Engine.DANGER_Y);ctx.lineTo(w,Engine.DANGER_Y);ctx.stroke();ctx.setLineDash([]); - var labels=[];game.groups.forEach(function(g){var trans=contactTransform(g);g.ids.forEach(function(i){var r=level.regions[i];drawPiece(ctx,r,i,trans,{label:false,physical:true,impact:motionAllowed()&&g.hitUntil>game.clock});var points=r.rings[0].map(trans),xs=points.map(function(p){return p.x;}),ys=points.map(function(p){return p.y;}),rw=Math.max.apply(null,xs)-Math.min.apply(null,xs),rh=Math.max.apply(null,ys)-Math.min.apply(null,ys);labels.push({name:mode==='province'?shortName(r.name):r.name,anchor:trans(r.label||r.center),tiny:rw<32||rh<25});});if(g.ids.length===level.regions.length)drawDecorations(ctx,trans);}); +function drawPocketHints(game,c,level){ + var hints=game.pocketHints?game.pocketHints():[];c.save();c.fillStyle='rgba(119,153,90,.10)';c.strokeStyle='rgba(106,138,79,.55)';c.lineWidth=1;c.setLineDash([3,4]); + hints.forEach(function(hint){hint.ids.forEach(function(id){var r=level.regions[id];c.beginPath();r.rings.concat(r.holes||[]).forEach(function(ring){polygon(c,ring,function(p){return game.worldPoint(hint.anchor,p);},true);});c.fill('evenodd');c.stroke();});});c.restore(); +} +function drawPocketTransfers(game,c,level,transfers,clock){ + transfers.forEach(function(t){var target=game.groups.find(function(g){return t.ids.every(function(id){return g.ids.indexOf(id)>=0;});});if(!target)return;var progress=Math.min(1,(clock-t.started)/t.duration),eased=1-Math.pow(1-progress,3),from=t.from;c.save();c.globalAlpha=(1-progress)*.75; + t.ids.forEach(function(id){drawPiece(c,level.regions[id],id,function(p){var offset=C.rotate({x:(p[0]*from.scale-from.cx)*from.factor,y:(p[1]*from.scale-from.cy)*from.factor},from.angle),end=game.worldPoint(target,p);return {x:(from.x+offset.x)*(1-eased)+end.x*eased,y:(from.y+offset.y)*(1-eased)+end.y*eased};},{physical:true});});c.restore(); + }); +} +function draw(){if(game)drawBoard(game,ctx,{width:w,height:h,level:level,mode:mode,trace:swipeTrace,obstacles:labelObstacles,effectClock:game.clock+victoryAge});} +function drawBoard(game,ctx,view){var w=view.width,h=view.height,level=view.level,mode=view.mode,swipeTrace=view.trace,labelObstacles=view.obstacles,effectClock=view.effectClock===undefined?game.clock:view.effectClock,celebration=activeCelebration(game.celebrations,effectClock);ctx.clearRect(0,0,w,h);ctx.fillStyle='#f1f2e9';ctx.fillRect(0,0,w,h);ctx.fillStyle='#e9eee1';ctx.fillRect(0,0,w,game.dangerY);ctx.fillStyle='#d8decd';for(var x=15;x0?'#bd3e42':'#d46e70';ctx.lineWidth=1;ctx.setLineDash([4,5]);ctx.beginPath();ctx.moveTo(0,game.dangerY);ctx.lineTo(w,game.dangerY);ctx.stroke();ctx.setLineDash([]); + var transfers=motionAllowed()?(game.pocketTransfers||[]).filter(function(t){return effectClock>=t.started&&effectClock=0;});ctx.save();if(transfer)ctx.globalAlpha=Math.min(1,(effectClock-transfer.started)/transfer.duration*1.6);drawPiece(ctx,r,i,trans,{label:false,physical:true,impact:motionAllowed()&&g.hitUntil>game.clock,celebrating:!!celebration&&celebration.ids.indexOf(i)>=0});ctx.restore();var points=r.rings[0].map(trans),xs=points.map(function(p){return p.x;}),ys=points.map(function(p){return p.y;}),rw=Math.max.apply(null,xs)-Math.min.apply(null,xs),rh=Math.max.apply(null,ys)-Math.min.apply(null,ys);labels.push({name:r.labelName||(mode==='province'?shortName(r.name):r.name),anchor:trans(r.label||r.center),tiny:rw<32||rh<25});});if(g.ids.length===level.regions.length)drawDecorations(ctx,trans,level);}); + drawPocketTransfers(game,ctx,level,transfers,effectClock); + var pending=game.pendingView(); + if(pending){var previewRegion=level.regions[pending.id];ctx.save();drawPiece(ctx,previewRegion,pending.id,function(p){return {x:p[0]*pending.scale+pending.tx,y:p[1]*pending.scale+pending.ty};},{physical:true});ctx.strokeStyle=pending.held?'#9f8255':'#a6b497';ctx.lineWidth=1;ctx.setLineDash([2,4]);ctx.beginPath();ctx.moveTo(pending.x,pending.bottom+3);ctx.lineTo(pending.x,game.dangerY-25);ctx.stroke();ctx.setLineDash([]);ctx.restore();} + if(!view.replay){$('drop-countdown').style.top=Math.round(game.dangerY-23)+'px';$('drop-countdown').textContent=pending?'∞ · 左右调整,松手落下':(game.endReason?'本局已结束':'山河已到齐,继续拼合'); + document.querySelector('.danger-label').style.top=Math.round(game.dangerY-10)+'px';} if(swipeTrace&&swipeTrace.until>game.clock&&motionAllowed()){var life=(swipeTrace.until-game.clock)/280;ctx.save();ctx.globalAlpha=life*.30;ctx.strokeStyle='#9b8b62';ctx.lineWidth=1.5;ctx.beginPath();ctx.arc(swipeTrace.x,swipeTrace.y,9+(1-life)*12,0,Math.PI*2);ctx.moveTo(swipeTrace.x,swipeTrace.y);var length=Math.max(1,Math.hypot(swipeTrace.dx,swipeTrace.dy));ctx.lineTo(swipeTrace.x+swipeTrace.dx/length*19,swipeTrace.y+swipeTrace.dy/length*19);ctx.stroke();ctx.restore();} - lastLabelBoxes=renderLabels(ctx,labels,w,h,Math.max(9,Math.min(12,12*Math.sqrt(game.zoom))),labelObstacles); + var drawnLabels=renderLabels(ctx,labels,w,h,Math.max(8,Math.min(12,12*Math.sqrt(game.zoom))*Engine.PIECE_SIZE),labelObstacles);if(!view.replay)lastLabelBoxes=drawnLabels; if(motionAllowed())game.impacts.forEach(function(f){var life=Math.max(0,(f.until-game.clock)/Engine.SPARK_MS),radius=1.5+(1-life)*(2+f.strength*2);ctx.save();ctx.globalAlpha=life*.38;ctx.strokeStyle='#b8a779';ctx.lineWidth=1;ctx.beginPath();ctx.arc(f.x,f.y,radius,0,Math.PI*2);ctx.stroke();for(var i=0;i<2;i++){var angle=i*Math.PI+.7;ctx.beginPath();ctx.moveTo(f.x+Math.cos(angle)*(radius+1),f.y+Math.sin(angle)*(radius+1));ctx.lineTo(f.x+Math.cos(angle)*(radius+3),f.y+Math.sin(angle)*(radius+3));ctx.stroke();}ctx.restore();}); game.fx.forEach(function(f){ctx.save();ctx.globalAlpha=Math.min(1,(f.until-game.clock)/500);ctx.textAlign='center';ctx.font='500 12px sans-serif';ctx.fillStyle='#557642';ctx.fillText(f.text,Math.max(70,Math.min(w-70,f.x)),f.y-28-(1600-f.until+game.clock)*.018);ctx.restore();}); + if(celebration)drawCelebration(ctx,celebration,effectClock,w,h,game.dangerY); +} +function activeCelebration(effects,clock){var active=null;(effects||[]).forEach(function(effect){if(clock>=effect.started&&clock10&&c.measureText(text).width>max){size--;c.font='500 '+size+'px -apple-system,"PingFang SC",sans-serif';}c.fillText(text,x,y);} +function drawCelebration(c,effect,clock,w,h,line){ + var age=clock-effect.started,t=age/effect.duration,victory=effect.kind==='victory',motion=motionAllowed(),alpha=motion?Math.min(1,age/180,(effect.duration-age)/350):1; + var cw=Math.min(w-24,victory?300:280),ch=victory?108:88,cx=w/2,cy=Math.min(h-ch/2-12,line+(h-line)*.30),lift=motion?(1-Math.min(1,age/220))*10:0; + c.save();c.globalAlpha=Math.max(0,alpha); + if(victory){c.fillStyle='rgba(214,187,112,.10)';c.fillRect(0,0,w,h);} + if(motion){var count=victory?32:12;for(var i=0;igame.clock);draw();if(t-uiAt>120){uiAt=t;updateUI();}if(game.status==='playing')schedule();} -function endTankGesture(){var gesture=tankGesture;tankGesture=null;$('tank').classList.remove('swiping');if(gesture&&typeof canvas.hasPointerCapture==='function'&&canvas.hasPointerCapture(gesture.id))canvas.releasePointerCapture(gesture.id);} +function frame(t){rafId=0;if(!game||screen!=='game')return;if(!last)last=t; + try{loopHealth.frames++;loopHealth.stage='physics';var started=loopNow(); + if(game.endReason==='won')victoryAge=Math.min(Engine.VICTORY_MS,victoryAge+Math.max(0,Math.min(100,t-last)));else game.tick(t-last);loopHealth.physicsMs=loopNow()-started; + last=t;if(screen!=='game')return;loopHealth.stage='draw';started=loopNow();$('tank').style.transform='translate('+game.shake.offset.toFixed(2)+'px,'+game.shake.y.toFixed(2)+'px)';$('tank').classList.toggle('impact',game.wallHitUntil>game.clock);draw();loopHealth.drawMs=loopNow()-started; + loopHealth.stage='video';captureVideoFrame(false);loopHealth.stage='ui';if(t-uiAt>120){uiAt=t;updateUI();} + if(game.endReason==='won'&&victoryAge>=Engine.VICTORY_MS){showResult();return;}loopHealth.stage='idle';writeLoopHealth(false); + }catch(error){pauseAfterFrameError(error);} + finally{last=t;if(game&&screen==='game'&&(game.status==='playing'||game.endReason==='won'))schedule();} +} +function endTankGesture(){var gesture=tankGesture;if(gesture&&gesture.kind==='aim'&&game)game.cancelPendingDrag(gesture.serial);tankGesture=null;$('tank').classList.remove('swiping');if(gesture&&typeof canvas.hasPointerCapture==='function'&&canvas.hasPointerCapture(gesture.id))canvas.releasePointerCapture(gesture.id);} function stopInput(){if(game)game.groups.forEach(function(g){g.pendingHopUntil=-1;});endTankGesture();swipeTrace=null;clearInterval(holdTimer);holdTimer=null;inputDirection=0;keys.left=false;keys.right=false;} function refreshInput(){var direction=(keys.right?1:0)-(keys.left?1:0);if(!game||game.status!=='playing')direction=0;if(direction===inputDirection)return;clearInterval(holdTimer);holdTimer=null;inputDirection=direction;if(direction){game.nudge(direction);holdTimer=setInterval(function(){if(game&&game.status==='playing')game.nudge(direction);else stopInput();},150);}} // Collect a short flick, then emit exactly one impulse on release. Pointer @@ -120,6 +209,7 @@ function sampleTankGesture(e){ } function releaseTankFlick(e){ var g=tankGesture;if(!g||g.id!==e.pointerId)return; + if(g.kind==='aim'){var rect=canvas.getBoundingClientRect();game.movePending((e.clientX-rect.left)*w/rect.width-g.offset,g.serial);game.releasePending(g.serial);endTankGesture();return;} sampleTankGesture(e);var samples=g.samples,end=samples[samples.length-1],first=samples[0],dx=end.x-first.x,dy=end.y-first.y,elapsed=end.t-first.t,distance=Math.hypot(dx,dy); // A slow drag or a held finger is not a flick. Pauses/cancellations discard it. if(game&&game.status==='playing'&&distance>=18&&elapsed<=350&&distance/Math.max(16,elapsed)>=.16){ @@ -130,51 +220,136 @@ function releaseTankFlick(e){ } canvas.addEventListener('pointerdown',function(e){ if(screen!=='game'||!game||game.status!=='playing'||$('modal').hasAttribute('open')||tankGesture||e.isPrimary===false||(e.pointerType==='mouse'&&e.button!==0))return; - e.preventDefault();var now=performance.now();tankGesture={id:e.pointerId,startX:e.clientX,startY:e.clientY,x:e.clientX,y:e.clientY,active:false,samples:[{x:e.clientX,y:e.clientY,t:now}]};if(typeof canvas.setPointerCapture==='function')canvas.setPointerCapture(e.pointerId); + e.preventDefault();var rect=canvas.getBoundingClientRect(),localX=(e.clientX-rect.left)*w/rect.width,localY=(e.clientY-rect.top)*h/rect.height;if(game.pending&&localY这局,拼哪里?

直辖市、港澳没有地级关卡;台湾省暂缺地级轮廓数据。省级版包含全部 34 个省级行政区。

');$('modal').classList.add('province-picker-modal');$('province-picker').classList.add('expanded'); - data.levels.slice(1).forEach(function(l){var button=document.createElement('button');button.type='button';button.textContent=shortName(l.name);button.setAttribute('data-province',l.id);button.setAttribute('aria-pressed',String(l.id===provinceCode));button.className=l.id===provinceCode?'selected':'';button.addEventListener('click',function(){provinceCode=l.id;selectLevel();closeModal();});$('province-grid').appendChild(button);}); +function provincePreview(region){ + var xs=[],ys=[];region.rings.forEach(function(r){r.forEach(function(p){xs.push(p[0]);ys.push(p[1]);});});var minx=Math.min.apply(null,xs),miny=Math.min.apply(null,ys),width=Math.max.apply(null,xs)-minx,height=Math.max.apply(null,ys)-miny; + var local=function(p){return [p[0]-minx,p[1]-miny];};return {id:region.id,name:region.name,width:width,height:height,regions:[{id:region.id,name:region.name,rings:region.rings.map(function(r){return r.map(local);}),center:local(region.center),label:local(region.label||region.center)}]}; } -function selectLevel(){level=mode==='province'?data.levels[0]:(data.levels.find(function(l){return l.id===provinceCode;})||data.levels[1]);updateUI();layout();} -document.querySelectorAll('[data-mode]').forEach(function(b){b.addEventListener('click',function(){if(screen!=='entry'||performance.now()35&&Math.abs(dx)>Math.abs(dy)*1.3){mode=dx<0?'city':'province';suppressModeClickUntil=performance.now()+350;selectLevel();}}); -document.addEventListener('pointercancel',function(){modeGesture=null;}); -document.querySelectorAll('[data-speed]').forEach(function(b){b.addEventListener('click',function(){if(screen!=='entry')return;speed=Number(b.getAttribute('data-speed'));updateUI();});});document.querySelectorAll('[data-bounce]').forEach(function(b){b.addEventListener('click',function(){if(screen!=='entry')return;bounce=Number(b.getAttribute('data-bounce'));updateUI();});});$('province-picker').addEventListener('click',openProvincePicker); -$('rules-button').addEventListener('click',function(){openModal('HOW TO PLAY','

轻摇轻颠,拼一片山河

  1. 先选旅程,再开一局。选择省级 / 地级版、地区、下落速度和弹性,点击开始。
  2. 晃动整个框。在容器内快速轻划并松手,触发一次晃动。划过位置附近更剧烈,所有地块随后自由运动;手指只给出大致方向,不能牵引地块。慢拖或按住不触发,点击底部圆形暂停图标可查看本局、结束或重开;电脑也可使用方向键。
  3. 相邻的边自动吸合。碎片碰撞时会轻微弹跳、翻动,停稳后自动回正;只有真实相邻地区按正确方位接触时才合并。把所有碎片拼为一个整体即可通关。
合并基础分:100 + 40 ×(合并后块数 − 2)
8.5 秒内连合,每次系数 +0.25,最高 ×2。
速度倍率:佛系看山 ×1 / 说走就走 ×1.5 / 一路狂飙 ×2 / 山河起飞 ×3。
跨海 / 隔区连接 ×0.8;通关再奖 1000 × 速度倍率。
轻划不限次数、不扣分;弹性不改变得分倍率,最佳纪录按速度和弹性分别保存。

弹性推荐“蹦蹦跳”,方便腾挪;“轻轻弹”偏沉稳,“弹力全开”需要控制节奏。稳定堆过顶部红线超过 2.4 秒,本局结束;也可随时从暂停页结束并生成成绩图。省级离岛和地级间隔分别标记为跨海、隔区连接。

');}); -$('data-button').addEventListener('click',function(){openModal('MAP NOTES','

关于这片山河

轮廓来源:阿里云 DataV.GeoAtlas 公开行政区数据,2026-10-16 下载,随包离线提供。轮廓已为游戏做简化,所有源数据外环及独立海域线段随包保留。

省级版包含 34 块;地级版提供 27 个省区关卡、333 个地级单元,包含地级市、自治州、地区、盟,不含县和县级市。直辖市、港澳不设地级关卡;数据源暂缺台湾省地级轮廓。

岛屿及未纳入的省直辖县造成的间隔,使用明确标记的跨海 / 隔区连接。地图仅供游戏示意,不用于测绘、导航或区划查询。

纪录仅在本地保存,存储失败不影响游玩。

');}); +function selectProvince(code){ + if(screen!=='entry')return;var region=data.levels[0].regions.find(function(r){return r.id===code;});if(code&&!region)return; + mapRequest++;pendingCity=null;selectedCity=null;selectedProvince=code||null;var city=code&&Atlas.get(code);mode=city?(city.kind==='county'||city.kind==='county-city'||city.kind==='partition'?city.kind:'city'):'province';level=city||data.levels[0];entryMap=city||(region?provincePreview(region):level);updateUI();drawReference(); +} +async function selectCity(code){ + if(screen!=='entry'||!selectedProvince||selectedCity||mode!=='city')return;var meta=Atlas.meta(code),province=selectedProvince; + if(!meta){if(Atlas.unavailable(code))toast(shortName(Atlas.unavailable(code).name)+'下辖镇街,暂无县区拼图');return;}if(meta.province!==province)return; + var request=++mapRequest;pendingCity=code;updateUI(); + try{var local=await Atlas.load(code);if(request!==mapRequest||screen!=='entry'||selectedProvince!==province)return;pendingCity=null;selectedCity=code;mode='county';level=local;entryMap=local;updateUI();drawReference();} + catch(e){if(request!==mapRequest)return;pendingCity=null;updateUI();toast('县区地图展开失败,请再点一次重试');} +} +$('atlas-back').addEventListener('click',function(){selectProvince(selectedCity?selectedProvince:null);}); +function chooseMapTarget(event){var target=event.target.closest&&event.target.closest('[data-province],[data-city]');if(!target)return;if(event.type==='keydown'){if(event.key!=='Enter'&&event.key!==' ')return;event.preventDefault();}if(target.hasAttribute('data-province'))selectProvince(target.getAttribute('data-province'));else selectCity(target.getAttribute('data-city'));} +$('reference').addEventListener('click',chooseMapTarget);$('reference').addEventListener('keydown',chooseMapTarget); +function openDifficulty(starting,origin){ + starting=starting===true;if(!starting&&screen!=='entry')return;if(selectedProvince&&!detailPlayable())return; + difficultyDraft={snap:snap,bounce:bounce,starting:starting}; + openModal(starting?'READY TO GO':'JOURNEY SETTINGS',$('difficulty-template').innerHTML,[{label:starting?'取消':'取消修改',action:dismissModal},{id:starting?'confirm-journey':'confirm-difficulty',label:starting?'确认难度,出发':'完成设置',primary:true,action:function(){var choice=difficultyDraft;if(!choice)return;bounce=choice.bounce;snap=choice.snap;closeModal(false);if(choice.starting)launchJourney();}}]); + $('modal').classList.add('difficulty-modal'); + if(starting&&origin&&motionAllowed()){var dialog=$('modal'),box=dialog.getBoundingClientRect();dialog.style.setProperty('--launch-x',origin.left+origin.width/2-box.left-box.width/2+'px');dialog.style.setProperty('--launch-y',origin.top+origin.height/2-box.top-box.height/2+'px');dialog.style.setProperty('--launch-sx',Math.max(.06,Math.min(1,origin.width/box.width)));dialog.style.setProperty('--launch-sy',Math.max(.06,Math.min(1,origin.height/box.height)));void dialog.offsetWidth;dialog.classList.add('difficulty-arrive');} +} +function journalCategory(l){return l.kind==='province'?'national':l.kind==='prefecture'?'province':'detail';} +function trophy(won,name){return '';} +function renderJournal(){ + var categories=[['all','全部'],['national','全国'],['province','省内'],['detail','县市区']],all=Atlas.catalog,scoped=all.filter(function(l){return !journalProvince||l.province===journalProvince;}),filtered=scoped.filter(function(l){return journalFilter==='all'||journalCategory(l)===journalFilter;}),pageSize=6,pages=Math.max(1,Math.ceil(filtered.length/pageSize)),earned=0,completed=0; + journalPage=Math.max(0,Math.min(journalPage,pages-1));all.forEach(function(l){var stats=C.journeyStats(l.id,records,triumphs);earned+=stats.wins.filter(Boolean).length;if(stats.wins.some(Boolean))completed++;}); + var html='

山河战绩簿

'+all.length+' 个关卡 · 已通关 '+completed+' 关 · 奖杯 '+earned+' / '+all.length*3+'

'; + categories.forEach(function(c){var count=scoped.filter(function(l){return c[0]==='all'||journalCategory(l)===c[0];}).length;html+='';}); + html+='
'; + filtered.slice(journalPage*pageSize,(journalPage+1)*pageSize).forEach(function(l){var stats=C.journeyStats(l.id,records,triumphs),name=l.kind==='province'?'中国':shortName(l.name),label=l.playLabel||(l.kind==='province'?'省级拼图':'地级拼图'); + html+='

'+name+'

'+(l.provinceName?shortName(l.provinceName)+' · ':'')+label+' · '+l.count+' 块
最高分'+(stats.best===null?'—':stats.best.toLocaleString('zh-CN'))+'
'; + Engine.SNAP_DIFFICULTIES.forEach(function(d,i){html+='
'+trophy(stats.wins[i],d.name)+''+d.name+''+(stats.scores[i]===null?'未挑战':stats.scores[i].toLocaleString('zh-CN'))+'
';});html+='
'; + }); + if(!filtered.length)html+='

这个分类暂时没有关卡,试试其他筛选。

';html+='
'+(journalPage+1)+' / '+pages+' 页

每关每种吸附难度通关,点亮一枚奖杯;弹性不限。
战绩保存在本机。旧分数保留,奖杯从本次更新起记录。

'; + $('modal-content').innerHTML=html; +} +function openJournal(){if(screen!=='entry')return;journalFilter='all';journalProvince='';journalPage=0;openModal('JOURNEY RECORDS','',[]);$('modal').classList.add('journal-modal');$('modal').setAttribute('aria-labelledby','journal-title');renderJournal();} +$('journey-records').addEventListener('click',openJournal); +$('modal-content').addEventListener('change',function(e){if(e.target.id!=='journal-province')return;journalProvince=e.target.value;journalPage=0;renderJournal();$('journal-province').focus();}); +$('modal-content').addEventListener('click',function(e){if(!$('modal').classList.contains('journal-modal'))return;var button=e.target.closest&&e.target.closest('[data-journal-filter],[data-journal-page]');if(!button||button.disabled)return;var focusSelector;if(button.hasAttribute('data-journal-filter')){journalFilter=button.getAttribute('data-journal-filter');journalPage=0;focusSelector='[data-journal-filter="'+journalFilter+'"]';}else{journalPage+=Number(button.getAttribute('data-journal-page'));focusSelector='[data-journal-page="'+button.getAttribute('data-journal-page')+'"]';}renderJournal();var next=$('modal-content').querySelector(focusSelector);if(next&&!next.disabled)next.focus();else $('modal-content').querySelector('.journal-scroll').focus();}); +document.addEventListener('click',function(e){ + if(!difficultyDraft||!$('modal').classList.contains('difficulty-modal')||!$('modal').hasAttribute('open'))return; + var button=e.target.closest&&e.target.closest('[data-snap],[data-bounce]');if(!button)return; + if(button.hasAttribute('data-snap'))difficultyDraft.snap=Number(button.getAttribute('data-snap'));else difficultyDraft.bounce=Number(button.getAttribute('data-bounce'));updateUI(); +}); +function uprightNow(){if(!game||game.status!=='playing')return;var outcome=game.uprightOnce();updateUI();draw();toast(outcome.turned?'已回正 '+outcome.turned+' 组':'当前地块已经朝上',true);} +$('upright-once').addEventListener('click',uprightNow); +$('rules-button').addEventListener('click',function(){openModal('HOW TO PLAY','

轻摇轻颠,拼一片山河

  1. 先选旅程,再开一局。默认在全国地图直接开始省级拼图,也可点省区进入地级、县区、县市或分区拼图准备页,再点击开始。省域地图上的地级市可继续进入县区拼图,并逐级返回;每次开局先确认吸附难度和弹性。所有对局均为随心落子:在红线上方左右调整,松手才落下,没有倒计时。
  2. 晃动整个框。在容器内快速轻划并松手,触发一次晃动。划过位置附近更剧烈,所有地块随后自由运动;手指只给出大致方向,不能牵引地块。慢拖或按住不触发,点击底部圆形暂停图标可查看本局、结束或重开;电脑也可使用方向键。
  3. 相邻的边自动吸合。碎片随碰撞自然弹跳、翻转,默认保留当前角度;暂停键旁的“回正一次”按钮只调整当前已落下的地块,随后继续自由转动,新落下的地块不受影响。点击即将全部已落地块朝上,保持当前位置,碰撞继续由正常物理处理。真实相邻地区接近正确方位时会轻微靠拢,足够接近后自动合并,山河也会轻轻长大一点。外圈围住缺口时会显示缺失轮廓,正确地区靠近外圈且方向合适即可留洞补位,不必硬塞进封闭入口。全国版完整拼合华东、华北等地区时会亮起阶段庆祝;细分关卡在最大组合达到25%、50%、75%时提示进度。把所有碎片拼为一个整体即可通关,并欣赏山河完整的庆祝。
合并基础分:100 + 40 ×(合并后块数 − 2)
8.5 秒内连合,每次系数 +0.25,最高 ×2。
所有对局得分倍率 ×1。
跨海 / 隔区连接 ×0.8;通关再奖 1000 分。
轻划不限次数、不扣分;吸附难度和弹性不改变得分倍率,最佳纪录按两者分别保存。

吸附推荐“轻松拼”,方向和距离更宽松;“严丝合缝”保留原有规则。弹性推荐“蹦蹦跳”,方便腾挪;“轻轻弹”偏沉稳,“弹力全开”需要控制节奏。稳定堆过顶部红线超过 2.4 秒,本局结束;也可随时从暂停页结束并生成成绩图。离岛和地区间隔分别标记为跨海、隔区连接。

');}); +$('data-button').addEventListener('click',function(){openModal('MAP NOTES','

关于这片山河

全国、地级与直辖市及港澳细分轮廓来源:阿里云 DataV.GeoAtlas 公开数据,2026-10-16 下载。台湾县市来自国土测绘中心开放数据 COUNTY_MOI_1090820 快照,2026-10-17 下载,采用政府资料开放授权条款第1版。所有轮廓随包离线提供,已为游戏简化并保留源外环。

新增329个地级行政区的县区关卡,共2728块,2026-10-18从DataV公开接口获取。点击省域地图的地级市即可进入,东莞、中山、儋州、嘉峪关无县区子级,暂不提供镇街细分。新增关卡轮廓按需从包内加载,仍可离线游玩。

全国34块;27个省区提供333个地级单元及30个省直辖县级地区,湖北、海南、河南、新疆均保留素材中的省直辖地区;这四关标为省域拼图。海南省内关卡的三沙诸岛采用缩放移位示意,保留全部源外环,以便看清和拼合本岛;全国地图保持原比例。北京、天津、上海各16个区,重庆38个区县。香港18个分区,澳门按源素材8个分区(堂区及路凼填海区),不将其称为县级行政区。

台湾省开放20块县市拼图,源数据离岛外环保留;部分远海岛屿采用移位示意。金门、连江属福建,不重复列入台湾关卡。此关卡为县市层级,不把市内各区与县市混在同一关。

岛屿及不相接地区之间的间隔,使用明确标记的跨海 / 隔区连接。地图仅供游戏示意,不用于测绘、导航或区划查询。

阶段完成按玩法分为华北、东北、华东、华中、华南、西南、西北七组,34块均纳入;华东含台湾,华南含香港、澳门。分组仅用于游戏阶段提示,不是新增行政区划。纪录仅在本地保存,存储失败不影响游玩。

');}); function fitCard(){var box=$('result-card').parentNode,r=box.getBoundingClientRect(),sc=Math.max(.01,Math.min((r.width-22)/750,(r.height-22)/1400));$('result-card').style.width=Math.floor(750*sc)+'px';$('result-card').style.height=Math.floor(1400*sc)+'px';} function showResult(){ stopInput();cancelAnimationFrame(rafId);rafId=0;draw(); var snapshot=document.createElement('canvas');snapshot.width=canvas.width;snapshot.height=canvas.height;snapshot.getContext('2d').drawImage(canvas,0,0); - result={reason:game.endReason||game.status,score:game.score,levelName:level.name,speed:speed,bounce:bounce,speedName:Engine.SPEEDS[speed].name,bounceName:Engine.BOUNCES[bounce].name,elapsed:game.clock,dropped:game.dropped,total:level.regions.length,largest:game.groups.reduce(function(n,g){return Math.max(n,g.ids.length);},0),maxChain:game.maxChain,history:game.history.map(function(p){return {ms:p.ms,score:p.score};})}; + result={reason:game.endReason||game.status,score:game.score,levelName:displayLevelName(),speed:4,bounce:game.bounceIndex,snap:game.snapIndex,speedName:'随心落子',snapName:game.snap.name,bounceName:game.bounce.name,uprightUsed:game.uprightUsed,uprightCount:game.uprightCount,pocketFills:game.pocketFillCount,elapsed:game.clock,dropped:game.dropped,total:level.regions.length,largest:game.groups.reduce(function(n,g){return Math.max(n,g.ids.length);},0),maxChain:game.maxChain,history:game.history.map(function(p){return {ms:p.ms,score:p.score};})}; window.PuzzleResult.render($('result-card'),result,snapshot);snapshot.width=0;snapshot.height=0; + var session=videoCapture;videoSettled=!session;syncVideoUI();if(session)session.finish(canvas,videoMeta()).then(function(){if(videoCapture!==session)return;videoSettled=true;syncVideoUI();}).catch(function(){if(videoCapture!==session)return;videoSettled=true;videoNotice='画面整理失败,可分享成绩图';syncVideoUI();}); screen='result';$('game-screen').hidden=true;$('entry-screen').hidden=true;$('result-screen').hidden=false;$('result-title').textContent=window.PuzzleResult.title(result.reason);window.scrollTo(0,0);layout(); } var exporting=false; async function exportCard(share){ - if(!result||exporting)return;var api=window.xhs&&window.xhs.miniTool,method=share?'postNote':'saveImageToPhotosAlbum'; + if(!result||exporting||videoJob)return;var api=window.xhs&&window.xhs.miniTool,method=share?'postNote':'saveImageToPhotosAlbum'; if(!api||typeof api[method]!=='function'){toast(share?'请在小红书小工具内打开笔记发布页':'请在小红书小工具内保存成绩图');return;} - exporting=true;$('share-note').disabled=true;$('save-card').disabled=true; + exporting=true;syncVideoUI(); var card=result; try{var path=$('result-card').toDataURL('image/png');if(typeof api.writeTempFile==='function'){var out=await api.writeTempFile({data:path});if(!out||!out.filePath)throw Error('临时文件不可用');path=out.filePath;} - if(share){await api.postNote({title:'我的山河拼图旅程',content:'这一程,山河相遇。'+card.levelName+',得分 '+card.score+';下落速度:'+card.speedName+';弹性:'+card.bounceName+';游玩 '+window.PuzzleResult.duration(card.elapsed)+'。来晃一晃,拼出你的山河! #山河拼图',pageType:'photo_publish',mediaInfo:{image_resources:[{url:path}]}});} + if(share){await api.postNote({title:'我的山河拼图旅程',content:'这一程,山河相遇。'+card.levelName+',得分 '+card.score+';吸附难度:'+card.snapName+';弹性:'+card.bounceName+';游玩 '+window.PuzzleResult.duration(card.elapsed)+'。来晃一晃,拼出你的山河! #山河拼图',pageType:'photo_publish',mediaInfo:{image_resources:[{url:path}]}});} else{await api.saveImageToPhotosAlbum({filePath:path});toast('成绩图已保存到相册');} }catch(e){toast(share?'分享未完成,可再次打开笔记发布页':'未能保存,请检查相册授权后重试');} - finally{exporting=false;$('share-note').disabled=false;$('save-card').disabled=false;} + finally{exporting=false;syncVideoUI();} } +// Store compact render states, never compressed screenshots or a rolling tail. +// Geometry and group membership are immutable and shared between samples. +function videoScene(){ + var packed=new Float32Array(game.groups.length*10),ids=[]; + game.groups.forEach(function(g,i){var j=i*10;ids.push(g.ids);packed[j]=g.body.position.x;packed[j+1]=g.body.position.y;packed[j+2]=g.body.angle;packed[j+3]=g.factor;packed[j+4]=g.center.x;packed[j+5]=g.center.y;packed[j+6]=g.hitUntil;packed[j+7]=g.hitStrength;packed[j+8]=g.hitNormal.x;packed[j+9]=g.hitNormal.y;}); + var hints=game.pocketHints().map(function(h){return {anchor:game.groups.indexOf(h.anchor),ids:h.ids};}); + var scene={pockets:hints,transfers:game.pocketTransfers.slice(),packed:packed,ids:ids,clock:game.clock,scale:game.scale,zoom:game.zoom,dangerY:game.dangerY,overflow:game.overflow,celebrations:game.celebrations.slice(),pending:game.pendingView(),impacts:game.impacts.slice(),fx:game.fx.slice(),view:{width:w,height:h,level:level,mode:mode,trace:swipeTrace,obstacles:labelObstacles,replay:true,effectClock:game.clock+victoryAge}}; + scene.bytes=1024+packed.byteLength+ids.length*32+hints.reduce(function(n,h){return n+32+h.ids.length*8;},0)+scene.transfers.length*256+scene.impacts.length*96+scene.fx.length*160+scene.celebrations.length*128;return scene; +} +function renderVideoScene(context,scene){ + var groups=scene.ids.map(function(ids,i){var p=scene.packed,j=i*10;return {ids:ids,body:{position:{x:p[j],y:p[j+1]},angle:p[j+2]},factor:p[j+3],center:{x:p[j+4],y:p[j+5]},hitUntil:p[j+6],hitStrength:p[j+7],hitNormal:{x:p[j+8],y:p[j+9]}};}); + var replay={pocketTransfers:scene.transfers||[],pocketHints:function(){return (scene.pockets||[]).map(function(h){return {anchor:groups[h.anchor],ids:h.ids};});},groups:groups,clock:scene.clock,scale:scene.scale,zoom:scene.zoom,dangerY:scene.dangerY,overflow:scene.overflow,celebrations:scene.celebrations,impacts:scene.impacts,fx:scene.fx,pendingView:function(){return scene.pending;},worldPoint:Engine.Game.prototype.worldPoint}; + drawBoard(replay,context,scene.view); +} +function videoMeta(){var pending=game.pendingView();return {levelName:displayLevelName(),speedName:'随心落子',snapName:game.snap.name,bounceName:game.bounce.name,uprightCount:game.uprightCount,score:game.score,dropped:game.dropped,total:level.regions.length,elapsed:game.clock+(game.endReason==='won'?victoryAge:0),shakeX:game.shake.offset,shakeY:game.shake.y,dangerRatio:game.dangerY/h,countdown:pending?'∞ · 松手落下':game.endReason?'本局已结束':'山河已到齐,继续拼合'};} +function resetVideo(){if(videoJob)videoJob.cancelled=true;videoJob=null;if(videoCapture)videoCapture.dispose();videoCapture=null;videoOutput=null;videoSettled=false;videoNotice='';} +function syncVideoUI(){ + var button=$('video-action'),info=videoCapture&&videoCapture.info(),busy=!!videoJob; + $('share-note').disabled=exporting||busy;$('save-card').disabled=exporting||busy;$('replay').disabled=exporting;$('result-back').disabled=exporting; + button.disabled=exporting||(!busy&&(!videoSettled||!info||!info.supported||!info.frames)); + button.textContent=busy?'取消生成':'发视频';button.title=busy?'点击取消视频生成':'生成并发布游玩视频'; + var message=videoNotice; + if(!message){if(!videoSettled)message='正在整理本局画面…';else if(!info||!info.supported)message='此设备暂不支持生成 MP4,可分享成绩图';else if(!info.frames)message='本局没有可用画面,可分享成绩图';else if(videoOutput)message='完整视频 · 720p / 30帧 · '+videoOutput.seconds.toFixed(1)+' 秒 · '+(videoOutput.blob.size/1024/1024).toFixed(1)+' MB · 无声';else message='完整旅程 · '+Math.max(.1,info.seconds).toFixed(1)+' 秒 · 720p / 30帧 · 无声,附成绩'+(info.sampleFPS<29?' · 长局运动采样 '+info.sampleFPS.toFixed(1)+' 帧/秒':'');} + $('video-status').textContent=message; +} +async function makeVideo(){ + if(videoJob){videoJob.cancelled=true;videoNotice='正在取消…';syncVideoUI();return;} + if(!result||exporting||!videoSettled)return;if(videoOutput){await shareVideo();return;} + var session=videoCapture,card=result,job={cancelled:false,started:Date.now()};videoJob=job;videoNotice='正在生成视频 · 0%';syncVideoUI(); + try{var output=await window.PuzzleVideo.generate(session,$('result-card'),job,function(progress,mode){if(videoJob!==job)return;videoNotice=(mode==='realtime'?'正在合成,约需与视频等长时间 · ':'正在生成视频 · ')+Math.round(progress*100)+'%';syncVideoUI();});if(job.cancelled||videoJob!==job)return;videoOutput=output;videoNotice='';} + catch(e){if(videoJob!==job)return;var code=e&&e.code;videoNotice=code==='background'||job.cancelReason==='background'?'切回后台已中止,可重新生成':job.cancelled||code==='cancelled'?'已取消,可重新生成':code==='size'?'整局视频超过本机安全大小限制(48 MB),未截断,可分享成绩图':code==='timeout'?'生成超时,可重试或分享成绩图':'此设备未能生成 MP4,可重试或分享成绩图';} + finally{if(videoJob===job){videoJob=null;syncVideoUI();}} + if(videoOutput&&videoCapture===session&&result===card&&screen==='result'&&!$('modal').hasAttribute('open'))await shareVideo(); +} +async function shareVideo(){ + if(!result||!videoOutput||exporting||videoJob)return;var api=window.xhs&&window.xhs.miniTool; + if(!api||typeof api.writeTempFile!=='function'||typeof api.postNote!=='function'){toast('视频已生成,请在小红书小工具内打开视频发布页');return;} + exporting=true;syncVideoUI();var card=result,output=videoOutput,encoded=null; + try{encoded=await window.PuzzleVideo.dataURL(output.blob);var video=await api.writeTempFile({data:encoded});encoded=null;if(!video||!video.filePath)throw Error('临时视频不可用');var cover=await api.writeTempFile({data:$('result-card').toDataURL('image/jpeg',.85)});if(!cover||!cover.filePath)throw Error('临时封面不可用'); + await api.postNote({title:'我的山河拼图回顾',content:card.levelName+',得分 '+card.score+';吸附难度:'+card.snapName+';弹性:'+card.bounceName+'。完整游玩过程,附本局成绩。 #山河拼图',pageType:'video_publish',mediaInfo:{video_resources:{video_url:video.filePath,cover_url:cover.filePath}}}); + }catch(e){toast('视频分享未完成,可再次打开发布页或分享成绩图');} + finally{encoded=null;exporting=false;syncVideoUI();} +} +$('video-action').addEventListener('click',makeVideo); $('share-note').addEventListener('click',function(){exportCard(true);});$('save-card').addEventListener('click',function(){exportCard(false);});$('replay').addEventListener('click',start);$('result-back').addEventListener('click',showEntry); window.addEventListener('resize',layout);if(window.visualViewport&&typeof window.visualViewport.addEventListener==='function')window.visualViewport.addEventListener('resize',layout);window.addEventListener('blur',function(){stopInput();pause();}); -document.addEventListener('visibilitychange',function(){if(document.hidden){stopInput();pause();cancelAnimationFrame(rafId);rafId=0;}else{last=0;if(game&&game.status==='playing')schedule();}}); -layout();updateUI();storePromise=initStore(); +document.addEventListener('visibilitychange',function(){if(document.hidden){if(videoJob){videoJob.cancelReason='background';videoJob.cancelled=true;}stopInput();pause();cancelAnimationFrame(rafId);rafId=0;}else{last=0;if(game&&screen==='game'&&(game.status==='playing'||game.endReason==='won'))schedule();}}); +layout();updateUI();writeLoopHealth(true);storePromise=initStore(); // Read-only development diagnostics: interaction is exclusively through the tank controls. -window.shanheDebug={state:function(){return {screen:screen,status:game?game.status:'entry',score:game?game.score:0,level:level.id,speed:speed,bounce:bounce,bounceName:Engine.BOUNCES[bounce].name,history:game?game.history.map(function(p){return {ms:p.ms,score:p.score};}):[],elapsed:game?game.clock:0,result:result,shakeY:game?game.shake.y:0,dropped:game?game.dropped:0,remaining:game?game.queue.length:level.regions.length,groups:game?game.groups.length:0,shakeCount:game?game.shakeCount:0,swipeCount:game?game.swipeCount:0,swiping:!!(tankGesture&&tankGesture.active),hopCount:game?game.hopCount:0,shakeOffset:game?game.shake.offset:0,scale:game?game.scale:0,initialScale:game?game.initialScale:0,zoom:game?game.zoom:1,width:w,height:h,collisionCount:game?game.collisionCount:0,impactCount:game?game.impacts.length:0,contactPulse:game?game.groups.filter(function(g){return g.hitUntil>game.clock;}).length:0,labels:lastLabelBoxes.map(function(b){return {name:b.name,x:b.x,y:b.y,w:b.w,h:b.h};}),regions:game?game.groups.map(function(g){return {ids:g.ids.slice(),x:g.body.position.x,y:g.body.position.y,angle:g.body.angle,vx:g.body.velocity.x,vy:g.body.velocity.y};}):[]};}}; +window.shanheDebug={state:function(){return {screen:screen,entryProvince:selectedProvince,entryCity:selectedCity,mapLoading:pendingCity,entryPlayable:!selectedProvince||detailPlayable(),status:game?game.status:'entry',score:game?game.score:0,level:level.id,speed:4,uprightCount:game?game.uprightCount:0,uprightUsed:game?game.uprightUsed:false,pocketFills:game?game.pocketFillCount:0,pocketHints:game?game.pocketHints().map(function(h){return {anchor:h.anchor.ids.slice(),missing:h.ids.slice()};}):[],snap:game?game.snapIndex:snap,snapName:game?game.snap.name:Engine.SNAP_DIFFICULTIES[snap].name,bounce:bounce,bounceName:Engine.BOUNCES[bounce].name,dangerY:game?game.dangerY:0,pending:game?game.pendingView():null,aiming:!!(tankGesture&&tankGesture.kind==='aim'&&game&&game.pending&&tankGesture.serial===game.pending.serial),history:game?game.history.map(function(p){return {ms:p.ms,score:p.score};}):[],elapsed:game?game.clock:0,result:result,milestones:game?game.milestones.slice():[],celebration:game?activeCelebration(game.celebrations,game.clock+victoryAge):null,victoryAge:victoryAge,video:{capture:videoCapture?videoCapture.info():null,settled:videoSettled,generating:!!videoJob,generated:!!videoOutput,bytes:videoOutput?videoOutput.blob.size:0,seconds:videoOutput?videoOutput.seconds:0,mode:videoOutput?videoOutput.mode:null},shakeY:game?game.shake.y:0,dropped:game?game.dropped:0,remaining:game?game.queue.length:level.regions.length,groups:game?game.groups.length:0,shakeCount:game?game.shakeCount:0,swipeCount:game?game.swipeCount:0,swiping:!!(tankGesture&&tankGesture.kind!=='aim'&&tankGesture.active),hopCount:game?game.hopCount:0,shakeOffset:game?game.shake.offset:0,scale:game?game.scale:0,initialScale:game?game.initialScale:0,zoom:game?game.zoom:1,width:w,height:h,collisionCount:game?game.collisionCount:0,overflow:game?game.overflow:0,magnetPairs:game?game.magnetPairs||0:0,unsupportedWakeups:game?game.unsupportedWakeups:0,impactCount:game?game.impacts.length:0,contactPulse:game?game.groups.filter(function(g){return g.hitUntil>game.clock;}).length:0,labels:lastLabelBoxes.map(function(b){return {name:b.name,x:b.x,y:b.y,w:b.w,h:b.h};}),regions:game?game.groups.map(function(g){return {ids:g.ids.slice(),factor:g.factor,growing:!!g.growth,grounded:g.grounded,settled:!!g.settled,sleeping:g.body.isSleeping,overflow:g.overflow,x:g.body.position.x,y:g.body.position.y,angle:g.body.angle,angularVelocity:g.body.angularVelocity,vx:g.body.velocity.x,vy:g.body.velocity.y};}):[]};}}; })(); diff --git a/src/atlas.js b/src/atlas.js new file mode 100644 index 0000000..3b631b5 --- /dev/null +++ b/src/atlas.js @@ -0,0 +1,28 @@ +(function(root,factory){ + if(typeof module==='object'&&module.exports)module.exports=factory; + else root.PuzzleAtlas=factory(root.MAP_DATA,root.COUNTY_INDEX,function(meta,done){ + var script=document.createElement('script'),finished=false,timer; + function settle(error){if(finished)return;finished=true;clearTimeout(timer);script.onload=null;script.onerror=null;if(script.parentNode)script.parentNode.removeChild(script);done(error);} + script.src=meta.path;script.onload=function(){settle(null);};script.onerror=function(){settle(new Error('Local map unavailable'));}; + timer=setTimeout(function(){settle(new Error('Local map timeout'));},12000);document.head.appendChild(script); + }); +})(typeof window!=='undefined'?window:this,function(data,index,transport){ + 'use strict'; + var base={},metadata={},cache={},pending={},inflightFiles={},recent=[],limit=3; + data.levels.forEach(function(level){base[level.id]=level;}); + (index.levels||[]).forEach(function(meta){metadata[meta.id]=meta;}); + var unavailable={};(index.unavailable||[]).forEach(function(meta){unavailable[meta.id]=meta;}); + var catalog=data.levels.map(function(level){return {id:level.id,name:level.name,province:level.kind==='province'?null:(level.province||level.id),kind:level.kind,playLabel:level.playLabel,count:level.regions.length};}).concat(index.levels||[]); + function touch(id){var at=recent.indexOf(id);if(at>=0)recent.splice(at,1);recent.push(id);while(recent.length>limit)delete cache[recent.shift()];} + function get(id){if(base[id])return base[id];if(cache[id]){touch(id);return cache[id];}return null;} + function register(level){var meta=level&&metadata[level.id];if(!meta||level.province!==meta.province||level.regions.length!==meta.count||!Number.isFinite(level.width)||!Number.isFinite(level.height)||level.width<=0||level.height<=0)throw Error('Invalid county map'); + var ids={};level.regions.forEach(function(r){if(!r.id||ids[r.id]||!r.rings||!r.rings.length)throw Error('Invalid county regions');ids[r.id]=true;}); + cache[level.id]=level;touch(level.id);if(pending[level.id])pending[level.id].value=level; + } + function loadFile(meta){if(inflightFiles[meta.path])return inflightFiles[meta.path];var promise=Promise.resolve().then(function(){return new Promise(function(resolve,reject){transport(meta,function(error){if(error)reject(error);else resolve();});});}).then(function(){delete inflightFiles[meta.path];},function(error){delete inflightFiles[meta.path];throw error;});inflightFiles[meta.path]=promise;return promise;} + function load(id){var existing=get(id);if(existing)return Promise.resolve(existing);if(pending[id])return pending[id].promise;var meta=metadata[id];if(!meta||!/^\.\/county\/\d{6}\.js$/.test(meta.path))return Promise.reject(new Error('Unknown county stage')); + var request={value:null,promise:null};pending[id]=request; + request.promise=loadFile(meta).then(function(){var level=request.value||get(id);if(!level)throw new Error('County map did not register');return level;}).then(function(level){delete pending[id];return level;},function(error){delete pending[id];throw error;});return request.promise; + } + return {catalog:catalog,meta:function(id){return metadata[id]||null;},unavailable:function(id){return unavailable[id]||null;},get:get,load:load,register:register,cacheSize:function(){return recent.length;}}; +}); diff --git a/src/core.js b/src/core.js index 4e46e4d..5685140 100644 --- a/src/core.js +++ b/src/core.js @@ -3,9 +3,32 @@ function rotate(p,a){var c=Math.cos(a),s=Math.sin(a);return {x:p.x*c-p.y*s,y:p.x*s+p.y*c};} function angleDelta(a,b){var d=(a-b)%(Math.PI*2);if(d>Math.PI)d-=Math.PI*2;if(d< -Math.PI)d+=Math.PI*2;return d;} function linked(a,b,edges){for(var i=0;i=0&&b.indexOf(e[1])>=0)||(a.indexOf(e[1])>=0&&b.indexOf(e[0])>=0))return e;}return null;} -function canSnap(a,b,edges,tolerance){var edge=linked(a.ids,b.ids,edges);if(!edge||Math.abs(angleDelta(a.angle,b.angle))>.24)return null;var d=Math.hypot(a.tx-b.tx,a.ty-b.ty);return d<=tolerance?{edge:edge,distance:d}:null;} +function canSnap(a,b,edges,tolerance,angleTolerance,pivot,knownEdge){var edge=arguments.length>6?knownEdge:linked(a.ids,b.ids,edges);if(!edge||Math.abs(angleDelta(a.angle,b.angle))>(angleTolerance===undefined?.28:angleTolerance))return null;var dx=b.tx-a.tx,dy=b.ty-a.ty;if(pivot){var ap=rotate(pivot,a.angle),bp=rotate(pivot,b.angle);dx+=bp.x-ap.x;dy+=bp.y-ap.y;}var d=Math.hypot(dx,dy);return d<=tolerance?{edge:edge,distance:d,dx:dx,dy:dy}:null;} function mergePoints(size,chain,speed,sea){return Math.round((100+40*(size-2))*(1+Math.min(chain-1,4)*.25)*speed*(sea?.8:1));} function shuffle(a,rng){var b=a.slice();rng=rng||Math.random;for(var i=b.length-1;i>0;i--){var j=Math.floor(rng()*(i+1));var t=b[i];b[i]=b[j];b[j]=t;}return b;} -function safeRecord(v){if(!v||typeof v!=='object'||Array.isArray(v))return {};var out={};Object.keys(v).forEach(function(k){if(/^\d+:[0-3](?::[0-2])?$/.test(k)&&typeof v[k]==='number'&&isFinite(v[k])&&v[k]>=0)out[k]=Math.floor(v[k]);});return out;} -return {rotate:rotate,angleDelta:angleDelta,linked:linked,canSnap:canSnap,mergePoints:mergePoints,shuffle:shuffle,safeRecord:safeRecord}; +// Rasterise the source polygons once. Flooding their complement distinguishes +// a sealed pocket from an open bay; holes and unlabelled sea remain traversable. +function pocketAtlas(level){ + var step=Math.max(level.width,level.height)/160,w=Math.ceil(level.width/step)+6,h=Math.ceil(level.height/step)+6,labels=new Int16Array(w*h),cells=level.regions.map(function(){return [];});labels.fill(-1); + level.regions.forEach(function(region,id){var rings=region.rings.concat(region.holes||[]); + for(var row=0;rowy)!==(b[1]>y))crossings.push(a[0]+(y-a[1])*(b[0]-a[0])/(b[1]-a[1]));}}); + crossings.sort(function(a,b){return a-b;});for(var k=0;k+1=0)cells[labels[index]].push(index); + return {w:w,h:h,labels:labels,cells:cells}; +} +function enclosedRegions(atlas,ids){ + var wall=new Uint8Array(atlas.cells.length),seen=new Uint8Array(atlas.labels.length),queue=new Int32Array(atlas.labels.length),head=0,tail=1;ids.forEach(function(id){wall[id]=1;});queue[0]=0;seen[0]=1; + function visit(index){if(index<0||index>=seen.length||seen[index]||(atlas.labels[index]>=0&&wall[atlas.labels[index]]))return;seen[index]=1;queue[tail++]=index;} + while(head0)visit(at-1);if(col