行业资讯
📅 2026/8/31 23:43:09
2020上海建筑面数据详解:shp字段、坐标系与建筑分析实践
简介本资源为2020年上海市全域建筑物面矢量数据集覆盖城市与农村区域以标准Shapefile格式提供适用于城市内涝模拟如SWMM建模、下垫面分析、建筑能源评估、国土空间规划及城乡发展研究等专业场景面向城市规划师、水文工程师、GIS分析师及高校科研人员。压缩包共6个核心文件shp、shx、dbf、prj、cpg、xml完整构成地理空间要素的几何结构、属性表、坐标系统与元数据总大小108.78MB数据粒度精细可直接加载至ArcGIS、QGIS等平台开展空间分析与可视化。已有619人学习下载用户可直接获取含建筑轮廓、建筑面积及人口分布信息的结构化属性表支持按区域统计、缓冲区分析、密度热力图生成等典型应用无需额外清洗或配准显著提升模型构建与课题研究效率。 这两年做城市尺度的建筑分析最难的不是算法而是找一套能同时给建筑边界、面积、人口属性的矢量数据。2020上海建筑物面数据城市农村shp格式就是这么一份让人省心又需要留神的数据。建筑面要素、面积、人口信息三个关键词把建筑分析里最常用的维度凑齐了能做的事从建筑密度、覆盖率测算到人均建筑面积估算、城市更新潜力摸底甚至转成3dtiles做三维场景展示链路都能走通。适合规划、GIS、测绘、城市研究等方向的朋友作为底板数据来用也适合刚接触shp的新手拿来练手。下面我把拿到这份数据之后的完整使用思路写出来字段怎么读、坐标系怎么判断、面积和人口怎么用、常见转换怎么操作、哪些坑我每次都会踩。内容尽量贴近实际操作有命令行、有软件步骤也有我个人的取舍习惯。1. 2020上海建筑物面数据到底是什么我拿到手先看了这些字段1.1 shp格式的“面”不是简单画个框建筑面数据在shp里是一个个多边形要素每个多边形对应一栋建筑的投影轮廓。和百度地图或者高德地图上看到的建筑轮廓相比shp是一种矢量格式几何上记录的是坐标点串属性上则保存了多个字段。也就是说你看到的不是一个“图块”而是一张带数据库属性的地图。我拿到这份数据后第一件事不是打开地图看房子轮廓而是打开属性表先确认字段结构。一般这种建筑物面数据至少会包含几何字段Shape必有的区分面要素。唯一标识FID或者OBJECTID用于要素唯一标识。面积字段常见的有Area、Shape_Area、AREA等记录建筑基底面积。人口字段常见的有Pop、POP、POPULATION等记录与该建筑关联的人口估算值。其他辅助字段楼层数、建筑类型、地址、区属等不一定都有但如果有会非常加分。这里要特别提醒shp的字段名最多10个字符中文命名字段在shp里虽然能显示但是很多早期软件兼容性很差。所以拿到数据以后如果字段名是英文不是不好而是说明这份数据做过标准化处理反而是个好消息。字段名越规范后续做查询、连接、统计的时候越省事。1.2 面积字段背后是投影坐标系的计算结果很多人看到面积字段就抄也不管单位也不管坐标系结果做出来的分析和别人的数据对不上。建筑面数据的面积字段并不是天然存在的它是根据坐标计算出来的。如果数据拿到手是WGS84经纬度坐标也就是常见的EPSG:4326那么表里的面积值可能是经验算法估算的近似面积如果数据已经转到了Web Mercator、上海地方坐标系或者CGCS2000高斯投影那么面积字段才是可靠的投影平面面积。我在用这份上海数据的时候会先看一眼属性表里的面积字段数值量级。如果是几百万级别的说明单位可能是平方米对应几千栋建筑的总量如果是几十那可能是平方公里或者系数换算过。这些都需要结合坐标系一起判断。再说一个高频误区ArcGIS的Shape_Area字段是软件自动维护的它会跟随数据坐标实时更新而你看到的中文字段“面积”可能是数据生产方手工计算并写入的静态值。两者可能出现微小差异因为计算算法和坐标系转换精度不同。只要差异在0.1%以内基本可以忽略如果差很多就要进入排查流程了。1.3 “城市农村”混编数据在使用前要做的第一件事标题里特意写了“城市农村”说明这份上海建筑数据不是只覆盖中心城区而是涵盖城市建筑和农村建筑的混合图层。城市建筑和农村建筑在形态、尺度、人口关联方式上差别很大。城市里的高层塔楼一个建筑底面可能关联几百人农村的一栋自建房可能只关联几口人。如果混在一起直接按面积均匀分配人口结论会失真。所以我的经验是拿到数据后先按行政区或地类进行分组或者按字段里是否有“城市/农村”分类标识做过滤。如果原本没有分类字段可以通过位置关系叠加到上海行政区划上再结合遥感影像判断。别嫌这一步麻烦后续很多分析结果是否可信就取决于这一步做没做干净。2. 打开shp之前的三个基础问题编码、坐标系、软件选择2.1 没有cpg文件为什么会乱码怎样彻底解决打开shp文件时最让人头疼的问题就是属性表中文乱码。这个问题的根源绝大多数情况下是编码识别失败。shp文件的属性信息存储在.dbf文件里.dbf本身带一种编码格式但是怎么告诉ArcGIS或者QGIS它带的是哪种编码靠的就是旁边的.cpg文件。当一份shp文件夹里只有.shp、.shx、.dbf、.prj几个文件偏偏少了.cpg软件就会去猜编码。中文字段在GBK和UTF-8两种编码下显示结果是完全不同的。很多人在网上下载的shp数据压缩包解压后发现属性表全是“锟斤拷”十有八九是缺了cpg文件或者cpg写的编码和dbf实际编码不一致。解决办法有三个方向最省事用QGIS打开设置数据源编码为GBK或UTF-8逐个试。QGIS里在图层属性-数据源-编码设置里改无需改文件。用户强制指定在ArcGIS Pro中可以通过工具“定义投影”或写Python脚本读取dbf时指定编码。重建cpg使用记事本新建一个文本文件内容写GBK或UTF-8保存为文件名与原shp相同、扩展名为.cpg例如上海建筑.shp.cpg。注意不要加换行符保存完重新打开即可。我处理这类问题时优先用Python的pyshp或geopandas直接指定编码读取比如import geopandas as gpd gdf gpd.read_file(上海建筑.shp, encodinggbk) print(gdf.head())如果gbk解不出就换utf-8这个操作比在GUI里反复试要快得多。等确认编码之后再重新导出一次shp把cpg文件补齐后面所有软件打开都不会乱码。2.2 先给数据定个坐标系再谈面积和人口shp数据的坐标系信息记录在.prj文件里。没有.prj文件时软件会把数据当作未知坐标系处理叠加到其他图层上位置会偏到不知道哪里去。上海的数据尤其要小心因为上海既可能用CGCS2000 / 3-degree Gauss-Kruger zone 34或35也可能用上海地方坐标还可能用WGS84。即使都是CGCS2000投影方式和中央经线不同坐标数值也会差很多。我拿到任何shp之后第一件事就是在ArcGIS Pro或QGIS里查看图层属性中的坐标系。如果是未知坐标系我会利用已知的建筑参考点或者与公开影像比对手动分配正确的坐标系。怎么判断呢看坐标值范围如果X坐标是8位数左右通常是投影坐标系如果坐标值很小只有6位或7位也可能是高斯投影的带号处理方式不同如果经纬度形式的坐标值在121°附近那基本就是WGS84或CGCS2000经纬度。上海建筑数据如果做好投影面积计算最靠谱的单位是平方米。做统计分析之前我建议用“投影”工具而不是“定义投影”工具。定义投影只是修改坐标信息不转换几何投影才是真正把数据转换到目标坐标系。这一步错了后面的面积和位置信息会同时出错。2.3 ArcGIS、QGIS和GeoPandas我建议的组合用法针对这份上海建筑shp我平时是三款工具搭配用。ArcGIS Pro适合交互式查看、符号化、制图和空间分析。界面直观选要素、看属性、做缓冲区都很顺手。特别是ArcGIS Pro对大数据量的shp加载性能比老版本ArcMap好很多而且自带“按属性分割图层”等常用工具拆分数据很方便。唯一的门槛是授权如果没有正版License只能用试用版或者换开源工具。QGIS是一款完全免费的开源GIS软件打开shp、编辑属性、转换坐标系、裁剪导出都够用。编码处理方面QGIS比ArcGIS更灵活乱码时随手切编码即可不用改文件。我推荐初学者先装QGIS或者把它作为备用查图工具。GeoPandas更适合批量处理和自动化。如果要做几十个区县的数据清洗、字段计算、批量导出用Python脚本比手动点工具高效得多。比如读取这份建筑数据按区划字段分组统计面积和人口import geopandas as gpd gdf gpd.read_file(上海建筑.shp, encodingutf-8) stats gdf.groupby(district)[[area, pop]].sum() print(stats)三者的定位完全不同不必纠结哪个更好。先学会用QGIS做检查用ArcGIS Pro做重活用GeoPandas做批量处理基本够用。3. 面积和人口字段从“有”到“用”的几个关键判断3.1 Shape_Area到底可不可信建筑面的面积字段通常有几种来源。一种是GIS软件根据坐标自动计算的几何面积另一种是数据生产方通过测绘或遥感解译得到建筑基底后手工赋值还有一种是结合楼层数推算的建筑面积。这三种面积意义完全不同使用时必须分辨清楚。对建筑分析而言我关心的“面积”有两种建筑基底面积也就是建筑在地面上的投影面积直接对应shp几何形状的面积用于算建筑密度。建筑面积通常等于基底面积乘以楼层数用于算容积率或者人均居住面积。如果原始数据只有“面积”一个字段没有楼层数那它是哪种面积就需要看数据说明。为了避免误导我一般会在分析报告中明确标注“本次使用面积为建筑基底面积来源于shp几何面积计算”。这样就算后续被质疑也能说清楚口径。还有一个细节Shape_Area字段在ArcGIS里会自动更新如果你做了坐标转换这个字段会跟着变成新坐标系下的面积。而普通属性表字段里的“面积”不会自动更新。所以最稳妥的方法是复制一份几何面积字段命名成geom_area再拿它和原面积字段做差值检查。3.2 人口字段是给规划用不是给普查抄数用建筑shp里的人口字段几乎不可能是人口普查的逐户登记数据更多是基于房屋面积、容积率、户规模等参数估算出来的格网化人口。它适合做空间分布规律、人口与建筑匹配度、公共服务设施覆盖率这类宏观分析但不适合用于精确到门牌号的户籍管理。在使用人口字段前我会先做两件事查看人口字段是否有负值或0值。很多农村地区建筑可能没有人口赋值或者空值用-9999代替。先过滤掉异常值。对总人口求和与统计年鉴或第七次人口普查数据做对比。如果数量级差很多说明字段的口径是“常住人口”还是“户籍人口”都存在疑问必须调整使用方式。比如我在分析上海某区的人均建筑面积时会用区级总人口作为校准分母而不是直接依赖shp人口字段的汇总值。shp人口字段用来做街区尺度的相对分布是很好的但不能天然当作官方统计数据。3.3 用建筑面数据做密度分析和人均居住估算的套路建筑密度和容积率是城市分析最常用的指标。有了这份shp可以直接计算建筑覆盖率 建筑基底总面积 / 区域土地总面积。在ArcGIS Pro里用“交集制表”工具把建筑面和行政区叠加就能得到每个行政区的建筑覆盖面积和总人口。人均建筑面积的估算方式相对复杂一些。如果shp里没有楼层数但有人口字段可以先用面积字段乘以楼栋高度或楼层近似值得到总建筑面积再除以该区域内的人口字段汇总值。但这样计算对数据要求很高建议先做几个典型区域的抽样验证。比如对比已知的大型居住社区看看计算结果是否在合理范围。我做这类分析时习惯先把建筑按属性分为住宅、商业、工业等类别然后只针对住宅建筑计算人均居住面积。如果原始数据没有分类字段就用面积大小、建筑形态和周边用地混合判断。这个步骤很费时间但只有这样才能避免把厂房也算进居住面积里。4. 基于这份建筑shp的高频处理3dtiles、txt、CAD、拆分4.1 shp转3dtiles让建筑体块直接进入三维场景最近问“shp转3dtiles”的人特别多。3dtiles是Cesium等三维地球引擎常用的数据格式把建筑面数据转成带高度的体块能在网页端做三维漫游和展示。要做这个转换前提是shp里得有建筑高度或楼层数字段否则转出来的只是贴在地面上的一个面片。如果字段里有“楼层数”或“高度”我常用的转换工具是cesiumlab也可以直接用开源工具shp2tiles或者py3dtiles。基本逻辑是把二维shp面根据高度属性拉伸成三维白模再切片为3dtiles。用py3dtiles转换的命令大致如下py3dtiles convert 上海建筑.shp -o output_tiles --srs 4490注意上海建筑数据如果是投影坐标系要先确认--srs参数写对否则生成的3dtiles位置会偏移。如果坐标参考是CGCS2000高斯投影EPSG一般是4490或者4547之类的需要提前查清楚。三维转换过程中的另一个坑是高度单位属性里的高度一般是米但如果原始数据的高度单位是分米整个场景会整体变形。4.2 shp转txt和批量转CAD给同事一个能打开的交付物很多人问shp转txt实际需求有两种。一种是想把属性表里的坐标和字段信息导出成文本方便给不会GIS的同事看。另一种是想提取建筑轮廓坐标用于外部程序处理。如果只是导出属性表ArcGIS Pro里右键图层选择“导出表”保存为dBASE表或csv再把csv用Excel打开另存为txt就行。用GeoPandas更直接import geopandas as gpd gdf gpd.read_file(上海建筑.shp, encodingutf-8) gdf[centroid_x] gdf.geometry.centroid.x gdf[centroid_y] gdf.geometry.centroid.y gdf[[FID, area, pop, centroid_x, centroid_y]].to_csv(上海建筑_中心点.txt, sep\t, indexFalse)这一行代码能生成一个带每栋建筑中心点坐标的文本文件很多做数据对接的同事拿到后非常开心。批量把shp转成CAD我以前也经常做。ArcGIS Pro里没有直接“shp转dwg”的按钮但工具箱自带“CAD转地理数据库”的逆工具可以直接导出到AutoCAD支持的dwg格式。操作路径工具箱 → 转换工具 → 转为CAD → 导出为CAD。在“输出类型”里选DWG_R2018然后输入shp即可。如果有多份shp可以用批量工具遍历文件夹。QGIS里则更简单右键图层 → 导出 → 保存为DXF选择坐标系和选项就能完成。转出来的CAD文件里建筑面会对应封闭多段线面积属性会保留在扩展属性里但中文属性名在CAD里可能显示不正常这一点要有预期。4.3 ArcGIS Pro里按行政区拆分大shp的方法很多数据分析场景不需要全上海的建筑物只需要某个区或某条街道范围。这时就需要把shp拆分。ArcGIS Pro里最直接的工具是“按属性分割图层”在分析工具 → 提取子集里。选择字段为区县名称工具会自动按每个区县生成一个单独的shp图层并输出到指定文件夹。如果你要按其他行政区边界裁剪比如只要黄浦江沿线两公里范围内的建筑用“裁剪”工具输入要素是建筑shp裁剪要素是缓冲后的范围。我们平时经常把“拆分”和“裁剪”混着说但工具上它们是两回事拆分是按属性字段逻辑分组裁剪是按空间范围切割。没有那个更高级关键是看需求。拆分完以后建议统一检查输出图层的字段和坐标系是否完整。因为ArcGIS Pro按属性分割时默认会带上原始字段但如果你原shp缺少.cpg分割后的新图层乱码问题可能继续存在。所以我还是推荐先把原数据编码修好再拆分。5. 实际使用中反复踩到的坑和处理方案5.1 属性表乱码与字段类型错乱的连锁反应属性表乱码不是小事因为一旦中文字段名乱码后面所有按字段名写的脚本、符号化设置、统计操作都会失效。更恼火的是乱码之后字段类型也可能显示错误比如说好的整数型人口字段变成了字符串导致求和为0。原因往往是原始shp的.dbf文件字段定义和实际内容不一致。如果读出的是乱码用GeoPandas读取后用gdf.dtypes检查字段类型。如果看到人口字段是object而不是int或float说明读入时按字符串处理了需要手动转换gdf[pop] pd.to_numeric(gdf[pop], errorscoerce)这一步能把“不知道什么来路”的脏数据清洗成一个可用的数值列。我建议清洗完先看一眼汇总人口总和、面积总和、空值数量。如果总和明显异常回头检查是不是某些字段被错误解析。5.2 几何面积与属性面积对不上怎么排查面积对不上是建筑数据里最常见的问题。我遇到过一份数据属性表里的面积字段比Shape_Area整体大了18%原因是原始数据生产时使用了旧坐标系计算后来数据被转换到了新坐标系但面积字段没有重新计算。另外也可能是建筑面本身带有重叠或缝隙导致几何面积和属性面积不一致。排查步骤可以按这个顺序用ArcGIS Pro的“计算几何”功能生成新的面积字段对比原面积字段。检查数据有没有重叠要素用“检查几何”工具跑一遍有重叠的要素先修正。如果整体比例恒定比如一直是1.18倍那基本可以确定是坐标系或单位换算问题按比值校正即可。如果只是个别要素对不上放大看几何形状可能是原始描绘时存在拓扑错误。面积是建筑数据质量的第一道关我宁可花一小时排查也不愿意把错的面积带进后续所有分析。5.3 大数据量shp在加载和叠加时的提速方法全上海的建筑面数量很大动辄几十万甚至上百万个面要素在ArcGIS Pro里直接缩放、选属性还是会卡。提速有几个土办法。第一给空间索引。右键图层属性 → 索引 → 添加空间索引能显著提升叠加分析速度。第二不必要的字段先删。shp的dbf字段太多会拖慢属性表浏览和导出速度。只保留需要用的字段再另存一份新shp。第三用GeoPandas做批量计算时先只读需要的字段和区域用bbox过滤不要一次性读全量数据import geopandas as gpd gdf gpd.read_file( 上海建筑.shp, bbox(121.2, 30.8, 121.6, 31.4), encodingutf-8 )这个bbox参数只读取指定范围内的数据做单区分析时速度能快几十倍。如果只是做可视化也可以先转成GeoJSON或者gpkg格式读取性能比shp更稳定。5.4 su导入shp和渔网分割这类延伸需求搜索词里出现“su怎么导入shp”估计是有人想把建筑shp导入SketchUp建模。Shp导入SketchUp并不是直接支持的但可以通过中间格式转换。最常用的方法是把shp转成DXF然后SketchUp打开DXF再对建筑平面进行处理。DXF中每栋建筑是一个闭合多段线导入后可直接推拉成体块。不过要注意坐标单位和坐标系上海建筑数据如果是高斯投影导入SU时会变成巨大或极小的坐标一般需要先把坐标系转换成WGS84或Web Mercator并将单位设置为米再做导入。“渔网分割shp”是另一种常见需求就是生成规则格网然后按格网统计建筑面积或人口。ArcGIS Pro里用“创建渔网”工具生成格网面再用“空间连接”或“交集制表”把建筑属性汇总到每个网格里非常适合做热力分析和人口格网化表达。做渔网分析时别忘了先确认格网坐标系与建筑坐标系一致否则格网看起来是正方形实际覆盖范围会变形。5.5 编码和prj文件经常一起丢养成收尾习惯最后说一下压缩包和数据交付的习惯。很多人下载或接收shp数据后只复制了.shp、.shx、.dbf这三个文件把.prj和.cpg丢在一边甚至没有注意它们的存在。等到重新打开发现乱码、坐标系丢失时才悔不当初。所以我现在无论是自己保存还是交付给别人都会检查一下同一个shp名下的全套文件是否齐全文件后缀作用.shp几何信息没有它整个shp就废了.shx几何索引缺失时部分软件能打开但极慢.dbf属性信息缺失时只剩图形没有属性.prj坐标系信息缺失时数据无法正确叠加.cpg编码信息缺失时中文字段大概率乱码.sbn / .sbx空间索引缺失会在ArcGIS中自动重建不用担心另外一个好习惯是把shp和配套说明文件一起打包在说明里写清楚坐标系、面积单位、人口字段口径、数据更新日期。这个动作在项目交付时价值非常大能少挨很多次沟通骂。说到底shp格式虽然老但在GIS数据交换里地位稳固。2020上海建筑物面数据城市农村这份数据真正用好的关键在于理解字段口径、修好编码和坐标系、明确面积和人口的含义再配合批量转换工具就能在城市分析和三维展示里发挥很大的价值。我自己在使用中更倾向于把最终清洗后的数据转成GeoPackage或3dtiles归档因为加载性能更好、字段兼容性更强但shp作为交换格式仍然是最通用的选项。如果你也正准备用这份数据建议先花一个晚上把编码和坐标系彻底理清楚后面的路会顺很多。本文还有配套的精品资源点击获取