布)
簡介全國矢量地圖shp格式壓縮包面向GIS數(shù)據(jù)分析、城市規(guī)劃、環(huán)境研究與交通管理等人員提供了一套覆蓋全國范圍的基礎地理數(shù)據(jù)可滿足行政區(qū)劃、道路網(wǎng)絡、水系、地貌及興趣點等多種空間分析需求。包內(nèi)共85個文件以shp幾何文件、dbf屬性文件、shx索引文件和xml元數(shù)據(jù)為主整體大小34.27MB數(shù)據(jù)組織較為規(guī)范便于在ArcGIS、QGIS等常用GIS軟件中直接加載和編輯。目前已有543人學習下載。資源內(nèi)容包含省級、市級等不同行政層級邊界以及道路、河流、建筑、機場車站等點線面要素用戶可以直接用于地圖制圖、緩沖區(qū)分析、疊加統(tǒng)計和路徑規(guī)劃等實際操作對于需要建立全國底圖或開展區(qū)域研究的讀者來說是一套基礎且實用的數(shù)據(jù)素材。使用時注意根據(jù)項目需求核對數(shù)據(jù)精度與更新日期以提高分析結果的可靠性。1. 拿到“全國矢量地圖shp格式.rar”先把坐標、來源和邊界范圍三件事問清楚很多做GIS的人電腦里都有這樣一個壓縮包幾個GB的RAR文件名寫著“全國矢量地圖shp格式”解壓出來是省界、市界、區(qū)縣界、鐵路、河流、居民地年份不明坐標系不明。它的價值很直接——不用從零矢量化全國也不用反復搜“中國行政區(qū)劃shp怎么下載”項目底圖、出圖、空間分析都能靠它起步。但同樣叫“全國矢量地圖”的包坐標系可能是CGCS2000也可能是GCJ-02一份省界文件可能叫“省1”另一份叫“省2”在ArcGIS里打開可能是一片空白屬性表全是亂碼。這些都是真實發(fā)生的現(xiàn)象不是版本玄學。這篇從拿到RAR開始按拆包、轉格式、日常加工、排錯、發(fā)布五個環(huán)節(jié)講一遍爭取讓你當天就把數(shù)據(jù)跑起來。2. RAR里的全國SHP拆包坐標系陷阱、圖層命名差異與GB級數(shù)據(jù)的資源賬2.1 坐標系陷阱CGCS2000與GCJ-02的偏差會讓邊界看起來“錯位”300米打開壓縮包以后我第一件事不是急著拖進ArcGIS而是先查坐標系。全國范圍的shp文件最常見的是CGCS2000EPSG:4490這是當前國內(nèi)測繪成果的標準坐標系。另一個常見的坐標是WGS84和CGCS2000在普通制圖尺度下差別很小。真正讓你翻車的是GCJ-02也就是高德、騰訊這些互聯(lián)網(wǎng)地圖用到的加密坐標系。高德地圖矢量爬取下來的一堆邊界、道路數(shù)據(jù)幾乎都落在GCJ-02里。它和標準SHP疊在一起視覺上會整體偏移幾百米城市里尤其明顯——路網(wǎng)和底圖錯開一條街。這種偏移不是用“平移”能解決的因為GCJ-02是對WGS84做非線性加密后的結果不同區(qū)域偏移量不一樣。我之前接過一個項目甲方拿“高德爬取的行政邊界”當正式界址用疊到1:2000的地形圖上差了半條路最后全部返工?,F(xiàn)在我的原則是凡是涉及面積計算、界址比對、審批出圖一律不用爬取類矢量做分析底圖頂多當展示用。判斷坐標系的方法很簡單用GDAL自帶的ogrinfo看一眼.prj信息ogrinfo -so 全國_district.shp 全國_district命令最后的參數(shù)是圖層名通常和shp主文件名一致。輸出里會有一段Layer SRS WKT看到GCS_China_Geodetic_Coordinate_System_2000就是CGCS2000看到GCS_WGS_1984就是WGS84。GCJ-02的prj文件在標準工具里經(jīng)常顯示為自定義字符串甚至缺失。更保險的辦法是打開shp的.prj文件用記事本看里面寫的坐標系名稱。如果寫的是“GCJ-02”這類非標準名稱那這份數(shù)據(jù)就屬于商業(yè)地圖坐標系不能用國土、規(guī)劃項目里慣用的CGCS2000去套。拿到北京 shp這類城市級數(shù)據(jù)也一樣直接看prj而不是猜后綴。2.2 圖層命名與字段差異同樣叫“省界”為什么會有省1和省2兩份文件解壓出來的文件夾里經(jīng)常能看到一套命名的數(shù)據(jù)省界、市界、區(qū)縣界、鄉(xiāng)鎮(zhèn)界、鐵路、河流、居民地。用詞不統(tǒng)一但結構基本是這個套路。真正讓人困惑的是有時同一個圖層會出現(xiàn)兩份比如“省界線文件省1和省2的shp文件有什么區(qū)別”這個問題我?guī)缀趺恐芏寄茉陧椖咳豪锟吹?。常見情況有兩種。第一種是同一份邊界的不同版本一個含沿海島嶼、飛地另一個做了簡化去掉了圖斑面積特別小的小島。第二種是數(shù)據(jù)來源不同省1來自國家基礎地理信息數(shù)據(jù)省2來自某個行業(yè)專項采集屬性表字段都不一樣。判斷方法是分別跑一次ogrinfo看要素數(shù)和字段名ogrinfo -so 省1.shp 省1 ogrinfo -so 省2.shp 省2 ogrinfo -al -so 省1.shp | head -40ogrinfo -al -so會列出所有屬性字段和類型。對比兩份文件的要素數(shù)、字段名集合再看是否有省代碼字段。通常一份帶6位或12位行政區(qū)劃代碼另一份只有名稱這種優(yōu)先選用帶官方行政區(qū)劃代碼的版本后面做屬性關聯(lián)會省很多事。字段命名也要留意。有的包用英文AREA、PERIMETER、PRV_NAME、PRV_CODE這些寫法很老派有的直接用中文屬性名比如“省名稱”“省代碼”。中文屬性對出圖友好但轉KML、GeoJSON時容易因為編碼出問題這部分在第5章展開。無論什么命名我先記住一點把“省代碼”“PAC”“ADCODE”這類鍵字段找出來它是后續(xù)關聯(lián)統(tǒng)計數(shù)據(jù)的鑰匙比名稱可靠得多。2.3 要素數(shù)量與硬件預算先算資源賬再決定用QGIS還是ArcGIS全國級別的shp包解壓后大小往往以GB計算。雖然文件大小不直接等于加載速度但要素數(shù)量會實實在在影響軟件表現(xiàn)。以區(qū)縣級邊界為例全國有幾千個縣級區(qū)劃光是一個區(qū)縣面圖層加屬性表就有上萬條記錄如果還帶了鄉(xiāng)鎮(zhèn)界、村級點、地名注記要素量輕松到幾十萬甚至百萬級。在這樣的數(shù)據(jù)量下老版本ArcMap打開大shp經(jīng)常轉圈卡死尤其是啟動時就自動識別字段類型的那一下可能等幾分鐘沒反應。我現(xiàn)在的習慣是優(yōu)先用QGIS 3.x打開全國包做瀏覽和檢查。QGIS對大數(shù)據(jù)量shapefile的列表加載更利索內(nèi)存管理也相對穩(wěn)定。如果項目規(guī)范必須用ArcGIS那建議在ArcGIS Pro里操作Pro的64位架構處理大文件比傳統(tǒng)ArcMap好不少。另一個容易忽略的點是DBF屬性表的限制。shapefile的屬性存于.dbf老式dbf單文件上限約2GB字段數(shù)上限255個。全國包如果屬性字段特別多或者要素總量過大寫入時會報錯。遇到這種情況我會把數(shù)據(jù)轉成GeoPackage.gpkg作為工作格式減少DBF帶來的邊界問題。GeoPackage在QGIS和ArcGIS Pro里都能直接讀字段類型也更寬松。資源賬的另一部分是坐標投影。全國矢量shp通常是經(jīng)緯度坐標做長度、面積計算時必須投影到適合所在區(qū)域的地圖投影坐標系。比如只算北京市的面積范圍就用適合北京的投影參數(shù)算全國面積推薦Albers等積投影。很多人拿著WGS84的經(jīng)緯度shp直接算面積結果單位變成平方度數(shù)值小得不正常然后跑來問數(shù)據(jù)是不是壞了。數(shù)據(jù)沒壞是投影沒設置。3. 解壓、校驗與格式轉換從RAR到SHP再到KML與GeoJSON/3D Tiles3.1 用7-Zip命令行解壓RAR并逐文件核驗SHP三件套不少人解壓RAR習慣雙擊用WinRAR的界面點“解壓到”這對單文件沒問題但遇到幾十個分卷、帶路徑的壓縮包我建議用7-Zip命令行命令簡單還能保留目錄結構、避免文件名編碼錯亂7z l 全國矢量地圖shp格式.rar 7z x 全國矢量地圖shp格式.rar -oD:\gis_data -y第一條命令l是列出壓縮包內(nèi)容先確認里面是單個文件夾還是一片散文件能提前看到有沒有分卷、有沒有說明文本。第二條命令x是完整解壓-o指定輸出目錄-y遇到覆蓋詢問直接確認。如果壓縮包設了密碼可以在命令里加-p密碼但我一般先不加等它提示時再輸入避免密碼帶特殊符號時命令行解析出錯。解壓之后不要急著打開先做三件套校驗。shapefile不是單個文件一個完整圖層至少包含三個文件文件后綴作用缺失后果.shp幾何要素本身打開直接報“文件不存在”.shx幾何索引能打開但可能要素殘缺或顯示空白.dbf屬性表要素能顯示但沒有屬性字段.prj坐標系統(tǒng)定義軟件按默認坐標讀坐標可能偏移.cpg屬性編碼聲明中文屬性易亂碼.dbf缺失是最隱蔽的ArcGIS可能照常顯示圖形但屬性表打開是空的等你要用字段做符號化才發(fā)現(xiàn)問題。我習慣先執(zhí)行一次目錄清單檢查ls -l D:\gis_data\*.shp D:\gis_data\*.shx D:\gis_data\*.dbf看到每類文件數(shù)量一致還不夠文件名必須完全匹配。province.shp對應province.shx和province.dbf如果壓縮包里有province.shx.bak這種奇怪后綴多半是別人手工修復過的殘留得小心對待。3.2 SHP轉KMLogr2ogr最小命令和ArcGIS的另存路線把全國或某個省份的shp轉成KML用于谷歌地球、奧維、無人機地面站這類場景是出現(xiàn)頻率很高的需求。網(wǎng)上常搜“arcgis shp轉kml”ArcGIS里確實有專門的工具ArcToolbox里的“圖層轉KML”勾選“將要素限制為感興趣區(qū)域”可以控制輸出范圍。但在沒有ArcGIS的環(huán)境中GDAL的ogr2ogr是最省事的手段ogr2ogr -f KML -dsco NameFieldNAME 全國_省份.kml 全國_省份.shp-f KML指定輸出格式-dsco NameFieldNAME把屬性表里的NAME字段作為KML的標注名稱這樣到了谷歌地球里圖斑顯示的是省名而不是一串ID。如果不寫這個參數(shù)KML里的Placemark名字會變成數(shù)字型要素ID顯示效果很差。轉出來之后KML文件默認是WGS84經(jīng)緯度坐標這符合KML規(guī)范。如果原始SHP是CGCS2000ogr2ogr在轉KML時會自動做坐標系變換不需要手動加參。要注意的是全國級別的KML生成后體積動輒幾十MB以上谷歌地球加載會明顯卡頓。我建議按省級或地市級范圍導出不要一次性輸出全國。反過來做kml轉shp也一樣ogr2ogr -f ESRI Shapefile 輸出目錄/轉換結果.shp 輸入文件.kmlKML轉shp后最好用ogrinfo復查一次幾何類型KML里一個要素可能被讀成Point或Polygon混合一個shapefile圖層不能同時容納兩種幾何類型這種情況下GDAL會報錯需要把點、線、面拆開分別導出。3.3 SHP轉GeoJSON與3D Tiles做Web預覽與三維展示的取舍Web端做可視化GeoJSON是最通用的格式。轉GeoJSON的關鍵是輸出坐標系必須是EPSG:4326不然Leaflet、Mapbox等前端庫不認ogr2ogr -f GeoJSON -t_srs EPSG:4326 全國_省份.geojson 全國_省份.shp-t_srs是重投影參數(shù)把源數(shù)據(jù)從CGCS2000或Web墨卡托轉換到4326。如果源SHP本身就是4326這個參數(shù)寫了也不影響結果但統(tǒng)一寫明更安全。GeoJSON字段名用英文最省事中文字段名在部分前端庫和壓縮傳輸環(huán)節(jié)會出問題。所以我在轉之前會先在QGIS里把屬性字段重命名一遍。現(xiàn)在還有人問“json轉shp網(wǎng)站”常見做法是在瀏覽器用geojson.io這類在線頁面工具做檢查和編輯但全國級別的GeoJSON動輒幾百MB上傳網(wǎng)站既不安全也不現(xiàn)實。我一般做小范圍數(shù)據(jù)核查才用在線工具大批量轉換一律本地ogr2ogr解決數(shù)據(jù)不用離開自己的機器。“shp轉3dtiles”是另一個被問很多的方向。把全國矢量轉3D Tiles用于Cesium場景這個思路沒問題但要注意全國級別的數(shù)據(jù)直接轉3D Tiles會生成一個巨大的數(shù)據(jù)集根節(jié)點加載慢客戶端也扛不住。正確做法是先分層省界單獨一層道路單獨一層建筑單獨一層然后按瓦片范圍分批轉換。Cesium離子平臺可以直接吃GeoJSON/glTF生成3D Tiles本地也可以用py3dtiles這樣的庫跑。無論用哪條路原則是“大切片小粒度”先做輕量化精簡要素再轉三維格式。4. 日常加工需求DWG轉SHP、Excel點數(shù)據(jù)轉SHP與漁網(wǎng)分割實戰(zhàn)4.1 DWG轉SHP圖層篩選、坐標重投影與邊界閉合檢查國土、規(guī)劃行業(yè)經(jīng)常拿到DWG格式的地塊邊界或道路中線要轉成SHP和全國底圖疊在一起。最常見的問題不是“轉不了”而是轉完以后坐標系完全不對位。DWG文件很多是設計院自定義的平面坐標系原點、單位都不標準直接轉SHP后圖形可能出現(xiàn)在完全錯誤的方位。如果DWG是AutoCAD標準文件先另存為DXF再轉換GDAL對DXF的支持比內(nèi)建DWG驅動成熟得多。然后用ogr2ogr做轉換ogr2ogr -f ESRI Shapefile 轉換結果.shp 規(guī)劃地塊.dxf -skipfailures-skipfailures很重要源文件里有些實體類型GDAL不認加了這個參數(shù)就能跳過不至于中途中斷。如果不加可能轉了30%就報錯停掉。轉換后用QGIS加載先查看要素的屬性表確認圖層的幾何類型DWG里的閉合多段線轉進SHP后通常成了Polygon但有很多看起來閉合卻實際沒閉合拓撲上叫“未閉合線”后續(xù)做面積計算時會得到0或報錯。遇到這種情況我的處理是在QGIS里跑一遍“修復幾何”工具或者用PostGIS的ST_MakeValid批量修復。更關鍵的步驟是坐標重投影DWG里如果有控制點坐標用“移動到圖層”工具做仿射變換把整個圖形搬到正確位置。單純在shp里修改prj文件是自欺欺人prj只改變顯示坐標不改變幾何數(shù)值圖形該在哪還在哪。4.2 Excel坐標點轉SHPpandas geopandas批量生成野外調(diào)查、管網(wǎng)普查的數(shù)據(jù)經(jīng)常是Excel表格里面只有點號、經(jīng)度、緯度要落成SHP疊加到全國底圖上。這種情況我用Python的pandas加geopandas幾分鐘搞定幾千個點import pandas as pd import geopandas as gpd from shapely.geometry import Point df pd.read_excel(井位坐標.xlsx, dtype{點號: str}) df[geometry] df.apply(lambda r: Point(r[經(jīng)度], r[緯度]), axis1) gdf gpd.GeoDataFrame(df, geometrygeometry, crsEPSG:4326) gdf.to_file(井位.shp, encodingutf-8, driverESRI Shapefile)dtype參數(shù)把“點號”列強制轉成字符串避免點號以0開頭時被Excel識別成數(shù)值丟掉前導零。crsEPSG:4326是聲明坐標是WGS84經(jīng)緯度如果你的Excel坐標來自實測CGCS2000就改成EPSG:4490。聲明錯誤是最常見的坑坐標數(shù)值完全一樣但聲明成不同坐標系疊圖時就差出一大截。如果坐標是從高德地圖或者手機App里拿的多半是GCJ-02直接轉4326的SHP和標準底圖疊不上。這類數(shù)據(jù)必須先通過坐標糾偏工具把GCJ-02轉回WGS84再進入后續(xù)流程。我的經(jīng)驗是不要指望在shp里做糾偏要在進入SHP之前就把原始Excel坐標處理好。點數(shù)據(jù)分散在幾十個Excel表時可以先用glob把文件全部讀進來合并pandas.concat成一個DataFrame再統(tǒng)一生成SHPimport glob frames [] for f in glob.glob(點位數(shù)據(jù)/*.xlsx): df pd.read_excel(f) frames.append(df) df_all pd.concat(frames, ignore_indexTrue) df_all.to_excel(合并點位.xlsx, indexFalse)合并后先檢查有沒有重復點號、空坐標行再做SHP轉換。Excel里空坐標在轉Point時是致命的會直接拋異常。4.3 漁網(wǎng)分割SHPQGIS網(wǎng)格創(chuàng)建、按位置裁剪與批量輸出把全國或者大流域的矢量范圍按規(guī)則網(wǎng)格切開是生態(tài)、氣象、自然資源調(diào)查里常見的操作。比如手頭有塔里木河流域邊界shp想按1公里網(wǎng)格統(tǒng)計植被指數(shù)就需要先生成漁網(wǎng)再用它裁剪邊界。在QGIS里路徑是“矢量 → 研究工具 → 創(chuàng)建漁網(wǎng)”。關鍵參數(shù)有三個網(wǎng)格間距、網(wǎng)格范圍、輸出類型。網(wǎng)格間距按“米”還是“度”取決于你的坐標系投影坐標系里填“1000米”經(jīng)緯度坐標系里填度比如0.01度約等于1公里。網(wǎng)格范圍可以直接引用另一個圖層比如“塔里木河流域邊界shp”的范圍這樣漁網(wǎng)就只覆蓋流域區(qū)域不會生成一大片空白網(wǎng)格。生成漁網(wǎng)后把漁網(wǎng)圖層和流域邊界做“按位置裁剪”保留邊界內(nèi)部的網(wǎng)格單元再對每個網(wǎng)格單元賦值流域屬性。批量輸出時QGIS處理工具箱里的“按位置選擇”和“分割矢量圖層”是配合使用的先用分割工具按網(wǎng)格字段拆開再逐格導出。要注意的是裁剪后的網(wǎng)格單元數(shù)可能上萬個導出文件時文件命名必須用字段值而不是FID不然順序一亂全對不上。如果想用代碼實現(xiàn)漁網(wǎng)分割可以用geopandas生成網(wǎng)格矩形并做空間連接但代碼量會大不少。QGIS界面操作對多數(shù)人更快建議優(yōu)先走GUI路線除非網(wǎng)格數(shù)超過幾萬個再考慮腳本。順帶說一個相關高頻問題“如何在shp圖中去掉一部分矢量”。例如想把南盤江流域邊界中某個小支流范圍去掉用“矢量 → 地理處理 → 擦除”即可。擦除失敗最常見的原因是邊界圖層有拓撲錯誤工具結果為空第5章會講排查方法。5. SHP打開失敗與屬性異常排查shapechk修復、RAR密碼與編碼亂碼5.1 圖層打開為空或要素殘缺shapechk檢測與修復流程現(xiàn)象在ArcGIS或QGIS里打開某個shp圖層界面完全空白或者只有一部分要素顯示屬性表行數(shù)也少了一截。這種大概率不是數(shù)據(jù)源坐標問題而是shapefile內(nèi)部結構壞了最常見的是.shx索引與實際.shp記錄數(shù)不一致。檢查工具我用shapechk。shapechk是專門用來掃描shp文件完整性的工具打開后選擇要檢測的shp它逐條讀取記錄并報告錯誤類型。使用方法是選擇shp文件點擊“開始”等待掃描結果。常見提示包括“索引文件記錄數(shù)與幾何記錄數(shù)不一致”“幾何類型非法”“shp文件頭描述的文件大小與實際不符”。掃描發(fā)現(xiàn)問題后修復辦法我用GDAL重寫ogr2ogr -f ESRI Shapefile 修復后.shp 損壞.shp -skipfailures這條命令會從損壞文件里把能讀的要素全部讀出再重新生成一套完整的三件套。-skipfailures決定了一個重要行為跳過那些讀不出來的要素。如果沒有這個參數(shù)遇到第一個壞要素就停掉修復文件可能一個要素都沒有。修復完成后再跑一次shapechk確認沒有錯誤報告才進入下一步使用。5.2 屬性表中文亂碼CP936、UTF-8與.cpg文件的關系現(xiàn)象SHP能正常顯示圖形但打開屬性表中文全是“錕斤拷”“燙燙燙”一類的亂碼。這在從網(wǎng)上下載的全國矢量包里太常見了尤其是一些老版本數(shù)據(jù)。原因在于dbf屬性文件的編碼聲明與實際編碼不一致字段值實際是GBK/CP936編碼但.cpg文件寫成了UTF-8或者根本沒有.cpg文件ArcGIS按默認規(guī)則讀成了UTF-8。檢查思路是用記事本打開.cpg文件看內(nèi)容里面是“UTF-8”就是聲明為UTF-8如果是“CP936”或“GBK”那是聲明為中文編碼。然后對比屬性表顯示如果聲明UTF-8但亂碼說明源數(shù)據(jù)實際不是UTF-8。修復方法有個偷懶但有效的做法用geopandas重新指定編碼讀取并轉存import geopandas as gpd gdf gpd.read_file(亂碼.shp, encodingGBK) gdf.to_file(修復編碼.shp, encodingUTF-8, driverESRI Shapefile)encodingGBK保證按正確編碼讀出屬性轉存時寫成UTF-8并讓工具重新生成.cpg文件。轉換后用QGIS復核屬性表字段值正常再歸檔。如果源實測是其他編碼比如CP936實際等于GBK絕大多數(shù)情況下GBK能覆蓋。還有少數(shù)數(shù)據(jù)是Big5或者Shift-JIS那就不能用GBK硬讀先試著讀出正常屬性再轉。5.3 RAR壓縮包帶密碼先找來源別急著用破解工具現(xiàn)象雙擊“全國矢量地圖shp格式.rar”彈窗要求輸入密碼輸不對即使能列出目錄也解不出文件。這種情況第一時間想到“rar密碼移除”“advanced rar password recovery”這類破解工具的人不在少數(shù)但我建議先停一下。多數(shù)帶密碼的國土資源類壓縮包密碼不是隨機加密而是發(fā)布者設置的簡單口令一個網(wǎng)址、一串數(shù)字、或者“1234”。我的處理順序是先返回下載頁面或來源頁面找密碼說明很多包在網(wǎng)盤的描述文字里就寫著“解壓密碼www.xxx.com”。如果找不到試試壓縮包里的說明文檔或文件名本身文件名中用點或橫線分隔的單詞往往就是線索。驗證密碼是否正確的命令是7z t 全國矢量地圖shp格式.rar -p你的密碼t是測試壓縮包完整性密碼正確且壓縮包結構完整時會顯示“全部正常”同時也能順便驗證壓縮包本身有沒有損壞。如果確認密碼錯誤再考慮聯(lián)系方式。網(wǎng)上所謂的“rar password recovery”方案對老版本RAR的加密有可能奏效但遇到RAR5默認的AES-256加密普通電腦跑暴力破解的內(nèi)存和時間成本極高幾天幾夜也未必出結果。更實際的是回來源渠道找回密碼。還有一點要警惕下載所謂“破解版”恢復工具時安裝包經(jīng)常捆綁加載廣告的子程序甚至篡改瀏覽器設置。我在這上面吃過虧現(xiàn)在寧可不解壓也不碰來源不明的破解工具。5.4 拓撲錯誤導致裁剪失敗幾何修復與有效性質檢現(xiàn)象用某個SHP做擦除或裁剪時工具提示“處理失敗”或輸出為空。這種情況常見于邊界不完整的流域shp比如淮河shp文件可能是人工從紙質圖矢量化出來的存在自相交、重復頂點、縫隙等問題。在QGIS里先檢查“矢量 → 幾何工具 → 檢查有效性”它會把無效要素逐條列出來錯誤類型通常包括“自相交”“環(huán)方向錯誤”“重復節(jié)點”。拿到檢查結果后用“修復幾何”工具批量處理。修復算法會把非法的多邊形重新組織成有效多邊形。我在代碼里修復時用shapely的make_validfrom shapely.validation import make_valid import geopandas as gpd gdf gpd.read_file(流域邊界.shp) gdf[geometry] gdf[geometry].apply(make_valid) gdf.to_file(流域邊界_修復.shp, encodingutf-8)修復后注意幾何類型可能變化一個Polygon可能變成MultiPolygon極少數(shù)情況下還會生成LineString。線要素不能和面要素放在同一個shapefile圖層里所以導出前要檢查geometry類型分布如果有線單獨分離出去或者丟棄。修復后的SHP再做擦除、裁剪、拓撲套合基本不會再翻車。6. 把全國SHP用起來行政區(qū)劃代碼關聯(lián)統(tǒng)計表與最小切片發(fā)布6.1 用區(qū)劃代碼做連接主鍵避免地名文字匹配拿到一份全國區(qū)縣SHP下一步往往是和統(tǒng)計年鑒、經(jīng)濟普查數(shù)據(jù)做關聯(lián)。按名稱匹配是新手最愛干的事但“城區(qū)”“郊區(qū)”這種名稱在多個地市重復出現(xiàn)按名稱連會串行。正確做法是用行政區(qū)劃代碼做連接主鍵import pandas as pd import geopandas as gpd gdf gpd.read_file(全國_區(qū)縣.shp, encodingutf-8) stat pd.read_csv(2024年各縣GDP.csv, dtype{區(qū)劃代碼: str}) merged gdf.merge(stat, left_onPAC, right_on區(qū)劃代碼, howleft) merged.to_file(全國_區(qū)縣_帶經(jīng)濟數(shù)據(jù).shp, encodingutf-8, driverESRI Shapefile)dtype{區(qū)劃代碼: str}是必須的12位行政區(qū)劃代碼以數(shù)字形式存在Excel里會被讀成int前導的0會消失與SHP的PAC字段類型不一致導致匹配失敗。howleft保留所有SHP面要素統(tǒng)計表里沒有的可以留空。6.2 設置縣級最小顯示粒度把全國包發(fā)布成XYZ Tiles最后說發(fā)布。把全國SHP發(fā)布成切片底圖時最容易犯的錯是一個圖層從頭到尾只配一種顯示比例。全國范圍在小比例尺下只看省界放大到城市級別才需要區(qū)縣界全部要素無差別輸出會讓切片進程卡死生成的文件也巨大。我現(xiàn)在用GeoServer或QGIS Server做切片預覽一般分三層省界圖層從第2級顯示到第8級市界從第6級顯示到第12級區(qū)縣界從第10級往下顯示。QGIS里“瓦片生成”工具可以設置“最小縮放級別”和“最大縮放級別”直接把全國區(qū)縣包切到適合Web地圖使用的XYZ目錄。輸出前先做一次ogr2ogr簡化邊界保留精度在0.001度左右文件名加_simplify后綴用來發(fā)布原始SHP留作分析。去年做的一個省級項目就是把全省邊界包按這個方式拆了三層發(fā)布后加載速度終于不用等十幾秒轉圈。從那以后我拿到新的全國矢量包第一件事固定是ogrinfo查坐標和字段第二件事是7z t驗證壓縮包完整然后再考慮怎么加工。數(shù)據(jù)不是越全越好而是越貼合使用場景越好。希望我的這些踩坑經(jīng)驗能幫到你。本文還有配套的精品資源點擊獲取