做成北京村界地图:8,021个村级面一包拿齐
技术专栏 · 数据产品 · 2026-10-22
在北京,村界数据得换个问法:城六区的行政村大多已撤村建街,原来的村域地块在数据里叫「街坊」;真正的村界要到郊县去找。这份北京市村界包把两种面装在了一起——8,021 个村级面、16 个区无缺席,6.99MB 的 gz 一包下载。拆开后第一个反直觉:村级单元最多的区不在山区,而在西城,1,427 个。
城里是街坊,郊区才是村:一个包两种面
把 8,021 个面的村名按后缀过一遍:以「村」结尾的 3,697 个,社区 16 个、居委会 23 个,剩下 4,285 个「其他」里绝大多数是街坊数字名——「展览路街道076街坊」「金融街街道177街坊」「苹果园街道第六街坊」这一类。街坊是撤村建街的产物:行政村建制撤销后划入街道,村域边界以地块形式保留下来。西城、东城、海淀、石景山的面几乎全是街坊,朝阳、丰台则新旧混合——朝阳 527 个面里还能翻到「东辛店村」「北皋村」这样的真村名,丰台王佐镇有「魏各庄村」「怪村」。
西城区单元数全市第一(1,427 个)是两件事叠加的结果:原宣武区 2010 年并入带来的存量,加上核心区街坊划得细。面积只有密云几十分之一的城区,村级单元数反而是密云的三倍——做分区统计时如果按单元数上色,第一眼会得出「西城最乡村」的错误印象,先看形态再下结论。
8,021 个面铺开:16 区一份清单
全域预览。北部军都山、燕山沿线(怀柔、密云、延庆)村界大而疏,南部平原(大兴、通州、房山)小而密,城区一片细碎的街坊:
| 区 | 村级单元 | 区 | 村级单元 | 区 | 村级单元 |
|---|---|---|---|---|---|
| 西城区 | 1,427 | 顺义区 | 452 | 石景山区 | 303 |
| 东城区 | 839 | 延庆区 | 427 | 平谷区 | 297 |
| 大兴区 | 755 | 怀柔区 | 321 | 门头沟区 | 200 |
| 房山区 | 579 | 昌平区 | 319 | 丰台区 | 154 |
| 朝阳区 | 527 | 合计 8,021 | |||
| 通州区 | 518 | 密云区 | 468 | 海淀区 | 435 |
几何体量:7,995 个 Polygon 加 26 个 MultiPolygon(山区整村跨沟、飞地造成的多面情况集中在怀柔、密云、门头沟),压缩包 6.99MB,解压 30.1MB。全市范围在东经 115.416° 至 117.508°、北纬 39.442° 至 41.059° 之间,西南到房山十渡一带,东北顶到密云雾灵山脚下。
老码不算错:1,297 个面挂在撤并前的区划上
按村级码前 6 位分组,出来的不是 16 组,是 18 组。多出来的 4 个前缀都是历史区划码:
| 历史前缀 | 原区划 | 面数 | 归并去向 |
|---|---|---|---|
| 110103 | 崇文区(2010 年撤销) | 87 | 东城区 |
| 110104 | 宣武区(2010 年撤销) | 315 | 西城区 |
| 110228 | 密云县(2015 年撤县设区) | 468 | 密云区 |
| 110229 | 延庆县(2015 年撤县设区) | 427 | 延庆区 |
合计 1,297 个面,占全市 16.2%。这不是数据错了——村级码一旦发放不随上级行政区划调整而重编,延庆撤县设区快十年,村里的代码还是「110229」开头。全国任何城市的老城区都可能遇到这种情况,北京因为撤并动作近、体量大,格外显眼。12 位码的逐段读法见《12位村级代码怎么读:逐段拆解与真数据验证》。
区县字段全空:20 行前缀映射补归属
这个包的属性表有 7 个字段:省、市、区县、乡镇、村名、村级码、类型。实测省、市、村名、村级码、类型五项填满(类型统一为「行政村」),区县与乡镇两列 8,021 行全空。补归属不必做空间连接——村级码前 6 位就是区县代码,一张映射表解决,连历史码一起归并:
const DIST = {
'110101':'东城区','110102':'西城区','110103':'东城区','110104':'西城区',
'110105':'朝阳区','110106':'丰台区','110107':'石景山区','110108':'海淀区',
'110109':'门头沟区','110111':'房山区','110112':'通州区','110113':'顺义区',
'110114':'昌平区','110115':'大兴区','110116':'怀柔区','110117':'平谷区',
'110118':'密云区','110119':'延庆区','110228':'密云区','110229':'延庆区',
};
for (const f of gj.features) {
f.properties['区县'] = DIST[String(f.properties['村级码']).slice(0, 6)] || '未知';
}
20 行跑完,8,021 个面全部落进 16 区,零落空。西安那份数据字段同样全空,当时用的是点位与区县面包围盒的空间连接(《下载西安村界geojson:空间连接补全13区县》);北京这种前缀完整、区划变更明确的情况,映射表比空间计算更快也更可控。还有个细节值得留意:村名书写口径不统一,房山、昌平、门头沟、延庆的村名常带全路径——「房山区周口店镇西庄村」「延庆县珍珠泉乡孟官屯村」,而大兴、通州就是裸村名——「河北头村」「小香仪村」。做名称匹配前先剥前缀,或者干脆以村级码为键,别拿村名直接 join。
购买入口:已预选北京市
下面的入口与「村界数据 · 按市」页同一购物通道,已替你选中北京市,也可以改选其他地市:
已为你选中北京市,支付后即时获得下载链接。
正在加载地市清单…
付款后下载 北京市_村界_WGS84.geojson.gz,坐标 WGS84(EPSG:4326),叠加国际底图与卫星影像无偏移。只要一个区的(比如做密云水库流域、通州副中心项目),不必买整市——「村界数据 · 按区县」按县计价更省;要京津冀全域做底账则看「村界数据 · 按省」的河北、天津包,同批次同口径直接拼接。
做成图:全市填色图与奥维的正确姿势
解压后 30MB,桌面 GIS 全量加载无压力,浏览器端就别硬扛——先按区裁剪再上前端,单区多在 1–3MB,加载体验完全不同。QGIS 做北京市域填色图:按区县字段符号化(上一节补出来的那列),市区用分类渲染、山区单色垫底,出图顺序先面后界。进奥维走 KML:按需筛出目标区另存 KML,收藏管理导入,WGS84 无偏移直接对图;出 SHP 同样在 QGIS 或 ArcGIS 里另存,选 UTF-8 编码。
数据到手先跑一遍缝隙与重叠体检,《边界数据拓扑检查:一段脚本查出缝隙与重叠》的脚本直接可用;要不要给村面配标注点、放哪里,看《村面标注点放哪才准:三种质心算法实测》。注意街坊面片是管理边界的示意表达,不能当权属界线用于征拆或确权场景。
常见问题
- 北京市村界数据在哪里下载?
- 本文页内的购买入口已预选北京市,支付宝付款后立即出现下载链接,与「村界数据 · 按市」页是同一份商品的两个入口。gz 压缩 GeoJSON 约 6.99MB,解压约 30MB,链接长期有效。
- 包里覆盖北京哪些区?城六区有吗?
- 16 个区一个不缺:西城区 1,427 个村级单元、东城区 839、大兴区 755、房山区 579、朝阳区 527、通州区 518、密云区 468、顺义区 452、海淀区 435、延庆区 427、怀柔区 321、昌平区 319、石景山区 303、平谷区 297、门头沟区 200、丰台区 154。城六区都在包里,只是形态以街坊面片为主。
- 街坊是什么?为什么西城区的村级单元这么多?
- 城六区大量行政村已撤村建街,原来的村域地块划入街道管理后,数据里保留为「街坊」面片,如「展览路街道076街坊」「苹果园街道第六街坊」。西城区 1,427 个单元里大部分是街坊,加上原宣武区并入,单元数反超所有郊区;郊县(大兴、房山、通州等)则是标准村界。
- 数据里有崇文、宣武这些已经撤销的区,会影响使用吗?
- 不影响使用,但按村级码前 6 位分组时会多出 4 个历史前缀:110103(原崇文区,87 个面)、110104(原宣武区,315)、110228(原密云县,468)、110229(原延庆县,427),合计 1,297 个面。归并关系固定:前两个并入东西城,后两个对应现在的密云区、延庆区。用文中的 20 行前缀映射一次归并即可。
- 区县字段是空的,怎么按区分组?
- 拿 12 位村级码的前 6 位对照区划代码表映射。北京的情况要留意两处:一是历史码归并(上一条),二是村名的书写口径不统一——房山、昌平、门头沟、延庆的村名常带「区县+乡镇」全路径前缀,大兴、通州则是裸村名,做名称匹配前先统一口径,或直接以村级码为键。
- 能导入奥维吗?SHP 怎么出?
- 能。奥维不直读 GeoJSON,先在 QGIS 里按需筛选后另存 KML,再经收藏管理导入,坐标 WGS84 无偏移铺图即对;SHP 用 QGIS 或 ArcGIS 另存导出、选 UTF-8 编码。包解压约 30MB,建议先按区裁剪再做市级出图,全量加载会慢。
另外,如果你需要的是北京市的可编辑矢量 PPT 模板,请到:北京市可编辑地图PPT模板。