ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

香港区县shp文件实战:从坐标系到空间连接

香港区县shp文件实战:从坐标系到空间连接 简介香港各区县级别shp文件最新版是一套面向GIS使用者、城乡规划师与地理数据分析师的矢量数据集覆盖香港特别行政区最新区县行政边界能够解决制图与空间分析中缺少权威底图的问题支持导入ArcGIS、QGIS等主流软件完成区划地图绘制、人口经济活动分布统计、选址评估、规划辅助及地理教学等多类任务。资源以RAR压缩包形式发布整体体积约170KB内部包含.shp几何主文件、.dbf属性字段表、.shx空间索引、.prj坐标系统文件等Shapefile标准组件其中.dbf字段表记录了区县名称、代码等关键属性.prj保证了数据在不同GIS平台中的位置精确显示解压后即可直接使用。目前已有836人浏览学习适合需要快速获取香港行政区划底图的高校师生、规划从业者和数据分析爱好者。数据经过精心整理免去自行描图与坐标纠偏的麻烦可在QGIS或ArcGIS中直接打开按需提取单个区县边界配合属性字段做分级设色、面积计算、邻接分析也可将人口、GDP等外部数据按区县代码关联后进行专题制图为教学演示或项目研究提供稳定可靠的基础数据。1. 一份能直接用的香港区县shp文件到底长什么样常有人从各种渠道下载香港区县shapefile解压后却连图层都打不开有的在QGIS里是空白有的是属性表乱码有的坐标偏到海里去。问题大多不在数据本身而在下载时没弄清这个shp文件家族的完整性以及它用的是哪个坐标系。香港区县级行政区划矢量边界是GIS分析里最常被当作底图的公共数据之一做人口密度、POI归属也好做活动范围热力也好第一步都是先把点或线落到正确的区县边界上。这份数据覆盖香港18个区县适合做制图、空间连接、教学演示和WebGIS发布前的预处理。2. Shapefile不是单文件文件家族与坐标系选型2.1 shp、shx、dbf、prj、cpg 各自管什么shapefile严格来说不是“一个文件”而是一组配套文件的集合。很多人在压缩包里只看到.shp就把另外几个文件当成没用的附件实际上图层能不能被正确渲染恰恰由这些“附件”决定。以这份香港区县数据为例正常解压后至少应该看到六个文件缺哪一个都会引发不同症状。后缀作用缺失时的表现.shp要素几何面边界坐标图层无法加载.shx几何索引帮助软件快速定位记录部分软件提示文件损坏.dbf属性表存区县名称、统计代码能画出边界但标注和查属性都失败.prj坐标系描述WKT文本软件只能猜测坐标系叠图错位.cpg属性表字符编码通常为UTF-8中文区县名显示为乱码.sbn/.sbx空间索引一般不影响读取只影响大数据量查询速度下载这份“香港各区县级别shp文件”后我建议先做一步完整性检查再放进GIS软件避免加载时被报错打断思路。在终端里执行ls -la hk_district/ # 预期看到同名主文件 HONG_KONG.shp HONG_KONG.shx HONG_KONG.dbf HONG_KONG.prj HONG_KONG.cpg这里最关键的是文件名必须完全一致。很多下载工具会在重名文件后面自动追加(1)导致shp和shx对不上QGIS直接弹出“Invalid Data Source”。遇到这种提示不用怀疑数据坏了先把文件名的括号和序号去掉再重新加载。.cpg文件通常不在下载包里如果属性表里的中文区县名变成“乱码方块”用记事本手动建一个HONG_KONG.cpg内容写UTF-8保存后重开图层即可解决。2.2 坐标系的差异直接决定叠图对不对香港常用的坐标系有两套。第一套是WGS84经纬度EPSG代码为4326适合叠在线底图如OSM、天地图和Web地图服务上第二套是Hong Kong 1980 GridEPSG代码为2326是香港测绘处采用的本地投影坐标单位是米适合做面积计算、缓冲区分析和CAD协同。你下载到的数据如果.prj写的是Hong Kong 1980 Grid直接叠加Web底图时图层会整体偏移到海里原因就是底图默认是Web MercatorEPSG:3857。在QGIS中处理这个问题的标准做法是给图层做重投影而不是改项目坐标系。我一般用处理工具箱里的“Reproject Layer”参数设置如下INPUT: HONG_KONG.shp TARGET_CRS: EPSG:4326 OUTPUT: HONG_KONG_WGS84.shp这里TARGET_CRS决定了输出结果给谁用如果后续要把数据发布成GeoJSON给前端Leaflet调用选4326最省事如果要做面积统计就继续保留2326。注意OUTPUT路径必须写绝对路径写相对路径时QGIS偶尔会生成空文件。重投影完成后打开属性表确认每个区县都有几何信息再叠加底图检查边界是否贴合海岸线。3. QGIS中加载香港区县数据的三道检查3.1 加载后第一眼该看什么在QGIS里加载这份shp文件路径是“图层 - 添加图层 - 添加矢量图层”选择.shp主文件后图层列表里会出现HONG_KONG面要素。这还没完第一件事是双击图层打开属性窗口看“信息”标签页里的坐标参考系统是否与预期一致。如果显示的是EPSG:2326而你的底图是Web墨卡托需要回到第2章的reprojectlayer流程先做统一不要直接在数据属性里手动改CRS那只改标注不改几何。第二件要看的是图层范围。右键图层 - 缩放到图层地图窗口应该恰好框住整个香港区域如果只看到一个小点或者图层跑到坐标原点附近说明shp文件本身没问题但当前项目的CRS设置把图层投影到了错误的位置。这时打开“项目 - 属性 - CRS”勾选“启用实时CRS变换”再把项目坐标系设为EPSG:3857图层就会回到正确位置。3.2 属性表里不能只认区县名称双击打开属性表能看到每个区县对应的记录。香港18区的名称在官方文件里通常是中文加英文字段名可能是NAME、NAME_EN、NAME_CN或DISTRICT。实际做数据分析时我不建议直接用中文名称做连接键因为“湾仔”在有些数据集里写成“Wan Chai”有些写成“湾仔区”一对不上就丢匹配。更稳的做法是找代码字段比如DISTRICT_C或CODE如果没有代码字段可以用英文全名作为外键。字段的具体作用可以通过以下QGIS表达式在字段计算器里检查count_distinct(NAME_EN)count_distinct返回去重后的区县名称数量结果应该是18说明数据里没有重复多边形。如果结果小于18说明某些区县被拆成了多个碎片后面做空间连接时会出现一个点匹配到多个面的情况。3.3 有效几何检查别跳过香港区县边界数据里偶尔会包含一些拓扑问题比如多边形自相交、闭合环方向错误这些问题在显示时看不出来做空间连接时却会出怪事——比如一个点明明在中环却被匹配到离岛。处理办法是使用QGIS的“矢量 - 几何工具 - 检查有效性”功能输入图层选HONG_KONG它会生成一个带错误类型的结果层。看到错误后用“修复几何”工具按错误ID批量处理参数里选“删除环”或“创建新的有效多边形”修复完再另存一份新shp。这一步只对做空间分析有意义如果只是画张静态地图可以不修。4. 把Excel经纬度数据导入ArcMap并归属到区县4.1 Excel表格的字段格式先规范化热搜里经常看到“怎么把excel中经纬度数据导入arcmap中”这类问题实际操作比想象中简单但大部分人在Excel这步就翻车了。ArcMap的“Display XY Data”只能识别十进制度数不能识别度分秒。如果你手里的坐标是22°1639N这种格式得先在Excel里转成22.2775。转换方式是在新列里写公式LEFT(A1,FIND(°,A1)-1)MID(A1,FIND(°,A1)1,FIND(,A1)-FIND(°,A1)-1)/60VALUE(MID(A1,FIND(,A1)1,LEN(A1)-FIND(,A1)-2))/3600这个公式的作用是把度分秒拆成度、分、秒三段分除以60变成度秒除以3600变成度最后相加得到十进制度数。公式里FIND函数负责定位°和的位置MID按位置截取数字段。如果原始数据是十进制度数但带了E和N后缀建议用“查找替换”把字母删掉只留纯数字列。整理好的表格里至少要有三列点编号、经度X、纬度Y注意在ArcMap里定义X和Y时别搞反。4.2 Display XY Data生成临时点图层打开ArcMap在目录面板右键文件夹连接找到Excel文件后双击工作表把它拖到内容列表里。然后右键工作表图层 - 显示XY数据在弹出对话框中X字段: 经度列 Y字段: 纬度列 坐标系: 选择 GCS_WGS_1984X字段对应经度Y字段对应纬度这是ArcMap里最容易被搞反的一步。坐标系选择这里如果Excel里的坐标来自GPS设备基本就是WGS84如果来自某些地图软件可能是GCJ-02加密坐标直接选WGS84会在地图上偏移几百米这种偏移不是坐标系设置能解决的需要在GIS里做坐标纠偏处理。生成的点只是临时图层必须右键该图层 - 数据 - 导出数据选择shp格式保存到本地否则关掉工程后这些点就丢了。4.3 空间连接让每个点带上区县名称点数据生成之后下一步是判断每个点落在哪个区县这步在ArcMap里叫“空间连接”。右键点图层 - 连接和关联 - 连接在对话框里选择“基于空间位置的连接”目标图层选点连接图层选香港区县面匹配选项选“将每个点匹配到其所在面”。输出结果会生成一个新图层属性表里自动带上区县面属性表的所有字段。这里有个参数容易踩坑连接操作默认会保留所有点记录如果有点落在多边形外这些点的区县字段会是空值分析时要用“按属性选择”把这些空值点单独挑出来检查通常它们可能是PDA坐标或海域中的点。如果用的是ArcGIS Pro对应工具叫“Spatial Join”界面逻辑相同只是选项名称变成了“Join one to one”和“Match option”。无论是ArcMap还是Pro做连接前都建议给区县面先建立空间索引右键图层 - 数据 - 添加空间索引否则点数量超过十万时连接会卡到怀疑人生。5. 用geopandas批量做区县归属判断5.1 读取shp并统一坐标系项目里如果有一批坐标数据要反复归属到区县每次都开ArcMap太笨重。我更倾向用Python写一套可复用的脚本逻辑简单且能直接生成shp文件。先读取这份香港区县数据并统一坐标系import geopandas as gpd districts gpd.read_file(HONG_KONG.shp, encodingutf-8) districts districts.to_crs(epsg4326) print(districts.columns.tolist())read_file里的encoding参数影响dbf中文属性的解码不填时geopandas默认走系统的localeWindows上经常出现乱码显式指定utf-8能绕开这个坑。to_crs(epsg4326)把HK1980 Grid的米制坐标转成经纬度方便和GPS采集的WGS84坐标对齐。如果目标坐标系不是WGS84把epsg数字换掉即可比如澳洲的数据用epsg7844国内Web数据用epsg4490。5.2 sjoin空间连接判断点落区县读好区县面之后构造点数据并做空间连接from shapely.geometry import Point points gpd.GeoDataFrame( {name: [A001, A002]}, geometry[Point(114.1694, 22.3193), Point(114.1772, 22.3027)], crsEPSG:4326 ) joined gpd.sjoin(points, districts, howleft, predicatewithin) print(joined[[name, NAME_EN]])gpd.sjoin是空间连接的核心方法predicatewithin意思是判断点是否在面的内部。howleft表示保留左侧点表的全部记录匹配不到区县的点的NAME_EN留空。实际使用中注意predicate还有intersects和contains可选点面关系时用within比intersects更严格后者会把落在边界上的点也计算进去。5.3 导出带区县属性的shp文件最终把结果导出成shp方便直接拖回ArcGIS或QGIS里制图joined.to_file(points_with_district.shp, encodingutf-8, driverESRI Shapefile)driverESRI Shapefile告诉geopandas输出经典shp格式不写这行时它默认按GeoJSON导出。encodingutf-8同时决定了shp的dbf属性表怎么编码保持utf-8才能让导出的文件在QGIS里正常显示中文。如果用户环境必须用GBK编码则改成encodinggbk但ArcMap的默认字符集是系统ANSI两种编码二选一不要混用。导出的shp文件包含points_with_district.shp、.shx、.dbf、.prj四件套直接拖进ArcMap后用“按属性选择”筛选出区县字段为空的行那些就是没有归属到任何区县的点需要回到原始坐标检查精度。本文还有配套的精品资源点击获取
返回列表