據(jù)實操指南:從加載到轉(zhuǎn)換全解析)
簡介地理信息系統(tǒng)GIS中矢量數(shù)據(jù)以點線面精確表達地理要素而Shapefileshp是應用最廣泛的矢量格式之一。通過理解shp的文件結(jié)構(gòu)、坐標系與屬性編碼可以高效處理基礎地理數(shù)據(jù)。例如全國地貌shp數(shù)據(jù)可作為國土空間規(guī)劃、生態(tài)評價等分析的底圖顯著減少預處理成本。在實際應用中常需進行shp轉(zhuǎn)3dtiles以進入三維場景或通過漁網(wǎng)分割shp實現(xiàn)網(wǎng)格化統(tǒng)計。此外shp轉(zhuǎn)CAD、shp轉(zhuǎn)txt等格式轉(zhuǎn)換也屬高頻需求而中文亂碼、坐標偏移等問題則需借助cpg文件與投影轉(zhuǎn)換解決。掌握這些方法能大幅提升GIS數(shù)據(jù)使用效率。1. 項目概述這份全國地貌shp數(shù)據(jù)到底能干什么做GIS這行繞不開一份能直接用的基礎地理數(shù)據(jù)。以前想在項目里加一層地貌底圖要么去各種數(shù)據(jù)網(wǎng)站東拼西湊要么拿著柵格DEM自己分類提取費時費力還不一定準。直到我拿到這份“全國地貌分布shp矢量圖層數(shù)據(jù)”才算是真正省下了一大半的預處理時間。它把全國范圍的地貌類型按面要素整整齊齊地切好平原、丘陵、山地、高原、盆地這些大類以及對應的亞類全部落到矢量圖層里直接用ArcGIS或者QGIS打開就能疊圖、統(tǒng)計、出圖。這份數(shù)據(jù)適合誰用如果你是做國土空間規(guī)劃、生態(tài)評價、農(nóng)業(yè)區(qū)劃、地質(zhì)災害風險評估或者單純想在項目里加一層全國尺度的地貌底圖那它非常合適。做地理教學、區(qū)域研究的人也一樣能拿它當基礎底圖。它對新手很友好——不需要懂遙感分類不需要寫代碼拿到shp拖進軟件里就能看到結(jié)果對老手來說它又是一個可以省掉大量重復工作的基礎數(shù)據(jù)源。這份數(shù)據(jù)的價值在于不需要再為“全國地貌”這件事專門跑一次數(shù)據(jù)生產(chǎn)流程直接在此基礎上做分析、出成果。好下面我把拿到這份數(shù)據(jù)后的完整實操過程、技術(shù)細節(jié)和踩坑記錄都寫出來。從數(shù)據(jù)包結(jié)構(gòu)講到字段含義從加載到轉(zhuǎn)換從統(tǒng)計到拆分盡量把能想到的都覆蓋到尤其是那些網(wǎng)上資料很少講但實際經(jīng)常出的問題。2. 數(shù)據(jù)整體設計與結(jié)構(gòu)拆解2.1 shp文件包里的基礎構(gòu)成很多人拿到shp文件看到一坨后綴不同的文件就懵了。這里必須先把Shapefile的文件結(jié)構(gòu)說清楚因為接下來所有操作都離不開這個基礎認知。一份完整的Shapefile至少由三個文件組成.shp幾何信息記錄每個面要素的坐標和形狀、.shx索引文件讓軟件能快速定位幾何記錄、.dbf屬性表記錄每個面要素的字段值。這三個文件缺一不可缺了任何一個shp都打不開或顯示不全。除了這三個基礎文件我這份地貌數(shù)據(jù)還帶了幾個額外的輔助文件.prj投影信息文件記錄坐標系和投影參數(shù)。沒有它軟件會默認用WGS84經(jīng)緯度坐標來讀很可能讓要素位置跑偏。.cpg字符編碼聲明文件里面寫的是UTF-8或者GBK告訴軟件用哪種編碼去讀dbf里的中文屬性。這個文件特別容易被忽略但恰恰是中文亂碼問題的根源。.sbn/.sbx空間索引文件能加快大數(shù)據(jù)量的查詢速度。.xml元數(shù)據(jù)文件記錄了數(shù)據(jù)的來源、修訂日期、坐標系等說明信息。我把這份數(shù)據(jù)包里的字段列了個表方便對照理解字段名類型說明FID整型要素編號軟件自動生成Shape幾何面要素Polygon類型一級代碼文本地貌大類編碼如P表示平原、Q表示丘陵、M表示山地一級類型文本地貌大類中文名如平原、丘陵、山地、高原、盆地二級代碼文本細分地貌編碼如P1表示沖積平原、M2表示中低山二級類型文本細分地貌中文名面積_km2雙精度該面要素的面積單位平方公里周長_km雙精度該面要素的周長單位公里這里要特別說一下“面積_km2”這個字段。有些朋友拿到shp以后喜歡直接打開屬性表把那列“面積_km2”加起來作為某個區(qū)域的地貌總面積這個做法在這份數(shù)據(jù)里問題不大因為數(shù)據(jù)生產(chǎn)者已經(jīng)做好了面積預計算。但如果你自己從別的數(shù)據(jù)源轉(zhuǎn)過來的shp沒有這個字段那我建議用軟件自帶的計算幾何功能重新算一遍千萬別用默認的Shape_Area字段——那個字段使用的是數(shù)據(jù)自身的投影坐標系單位不一定是平方公里尤其是經(jīng)緯度坐標系下它算出來的是度不是米數(shù)值完全不能用。2.2 坐標系與投影這份數(shù)據(jù)用的是哪一種打開我這份全國地貌數(shù)據(jù)默認加載進來后我建議第一時間查看它的坐標系。正常情況下這份數(shù)據(jù)應該采用CGCS2000國家大地坐標系投影是蘭伯特等角圓錐投影Lambert Conformal Conic中央經(jīng)線105°E標準緯線25°N和47°N。這套參數(shù)是全國尺度數(shù)據(jù)常用的配置因為蘭伯特投影在中緯度地區(qū)變形小特別適合像中國這樣跨緯度范圍大的國家。有朋友拿到shp之后發(fā)現(xiàn)右下角沒有顯示坐標或者顯示的是度分秒就以為是數(shù)據(jù)亂了。其實不是這是軟件讀取方式的問題。你在ArcGIS里右鍵圖層選擇“屬性—源”就能看到完整的坐標系描述。如果這里顯示的是GCS_WGS_1984那說明這份數(shù)據(jù)在發(fā)布時保留了原始經(jīng)緯度坐標沒有套投影。我給兩個選擇一是直接沿用WGS84經(jīng)緯度適合做全國范圍的小比例尺概覽圖二是自己重新投影到蘭伯特或阿爾伯斯Albers等積圓錐投影適合做面積統(tǒng)計和區(qū)域分析。實際操作中我踩過一個坑有段時間我拿這份數(shù)據(jù)跟縣域邊界做疊加統(tǒng)計發(fā)現(xiàn)面積總是對不上后來檢查了一下問題出在兩者坐標系不一致——地貌數(shù)據(jù)是WGS84經(jīng)緯度縣域邊界是CGCS2000高斯投影ArcGIS雖然能實時投影但計算面積時如果沒統(tǒng)一坐標系結(jié)果就會偏差很大。所以跨數(shù)據(jù)疊加之前先統(tǒng)一坐標系是鐵律。shp數(shù)據(jù)做投影轉(zhuǎn)換我一般用這兩條路在ArcGIS Pro里用“投影”工具選好目標坐標系注意要選“投影”不是“定義投影”——“定義投影”只是給數(shù)據(jù)打一個坐標系的標簽并不會改變坐標數(shù)值用錯的人實在太多了。在QGIS里右鍵圖層選擇“導出—要素另存為”在CRS那欄選目標坐標系QGIS會自動做坐標轉(zhuǎn)換比ArcGIS的流程更直觀。2.3 數(shù)據(jù)精度與切割粒度我特別想強調(diào)一點這是一份全國范圍的中比例尺數(shù)據(jù)不是高精度地籍數(shù)據(jù)。它的空間分辨率屬于“宏觀分析可用微觀定位不夠”的級別。用它在全國尺度上看地貌格局沒問題做地級市級別的粗略統(tǒng)計也能接受但你要是想拿它去分析一個村莊或者一塊具體的地塊那就不合適了——邊界會和實際地形差得比較遠因為制圖綜合已經(jīng)把很多小圖斑合并掉了。數(shù)據(jù)里的面要素切割粒度挺講究的。地貌類型的邊界不像行政區(qū)劃那樣有明顯的界碑它更多是依據(jù)坡度、海拔、起伏度這些地形指標劃出來的。比如平原和丘陵的界限通常是按海拔200米左右來切丘陵和山地的界限通??聪鄬Ω卟詈推露?。不同數(shù)據(jù)源的劃分標準有細微差異所以如果你拿這份地貌數(shù)據(jù)和其他單位的地貌圖對比會發(fā)現(xiàn)邊界位置不完全一樣這是正?,F(xiàn)象不是數(shù)據(jù)錯了。3. 拿到shp后第一時間要做的三件事3.1 正確打開shp文件的方式先說ArcGIS怎么打開shp。有朋友雙擊shp文件卻沒反應或者系統(tǒng)彈出“找不到可打開的程序”就來問我。實際上ArcGIS打開shp的正確方式不是雙擊而是先啟動軟件再在“目錄”面板里定位到shp文件所在文件夾把它拖到地圖窗口里?;蛘哂谩疤砑訑?shù)據(jù)”按鈕選擇shp文件。ArcGIS作為ESRI的軟件對雙擊打開這個操作默認支持得不好。QGIS打開shp就友好得多可以直接把shp文件拖進QGIS窗口它會自動加載并匹配坐標系沒有那么多限制。如果拖進來之后圖形位置不對多半是prj文件缺失或損壞手動設置圖層坐標系選擇WGS84或者CGCS2000就可以。打開以后先別急著分析我習慣先做一個目視檢查按屬性表里的“一級類型”字段渲染一下看看平原、山地這些類型是否分布合理——東部平原、西部高原山地這是大格局如果顏色分布亂七八糟比如平原出現(xiàn)在青藏高原腹地那就要懷疑數(shù)據(jù)源或者投影出問題了。3.2 中文亂碼問題的根源與處理打開屬性表發(fā)現(xiàn)中文全是“錕斤拷”或者“問號”這是很多初學者的噩夢。這個問題基本出在cpg文件上。dbf文件本身自帶一個編碼標記但如果cpg文件缺失或者內(nèi)容寫錯了軟件就不知道怎么解碼中文。我以前處理過一份從網(wǎng)上下載的shp屬性表全是亂碼。排查過程是這樣的先用記事本打開cpg文件發(fā)現(xiàn)里面寫的是“ANSI”但實際數(shù)據(jù)是UTF-8編碼所以怎么讀都是亂的。把cpg改成UTF-8重新打開屬性表恢復正常。如果你手上那份shp連cpg文件都沒有有兩個處理辦法在QGIS里打開shp時會彈出“選擇編碼方式”的窗口手動選UTF-8或GBK試到屬性表顯示正常為止。在ArcGIS里沒有可視化的編碼選擇但可以先把dbf用Excel打開Excel能按編碼讀dbf亂碼時用WPS或記事本改編碼后另存。這個方法不如在QGIS里處理來得直接所以遇到亂碼我第一個想到的還是QGIS。3.3 屬性表與字段檢查清單打開屬性表后我建議按這個清單過一遍總要素數(shù)量是否跟數(shù)據(jù)說明一致。比如說明里寫了全圖7850個面要素結(jié)果你一數(shù)只有7600個那可能是加載時被過濾了或者是原數(shù)據(jù)本身有問題。每個字段是否都有值有沒有大量Null。特別是“一級類型”“二級類型”這些核心字段如果出現(xiàn)大面積空值對后續(xù)統(tǒng)計就是災難。檢查面積字段的最大最小值是否在合理范圍。比如最小值是0或者負值說明有些面要素的自相交或拓撲錯誤需要修復。用“修復幾何”工具可以批量處理這一類問題。做完這三步數(shù)據(jù)基本處于可用的狀態(tài)接下來才進入真正的分析和應用環(huán)節(jié)。4. 地貌數(shù)據(jù)的典型應用實操4.1 按行政區(qū)統(tǒng)計地貌面積占比這是GIS工作里最常見的需求想知道某個省、某個市或者某條河流流域范圍內(nèi)各種地貌類型各占多少面積。操作邏輯不復雜但步驟里有不少細節(jié)值得注意。我習慣用ArcGIS Pro的工具箱完成這個任務。先加載行政區(qū)劃邊界和地貌數(shù)據(jù)然后執(zhí)行“相交Intersect”工具。注意這里的“相交”不是簡單地把兩個圖層疊在一起看而是生成一個新圖層這個圖層把兩個輸入圖層的屬性都保留下來幾何上按邊界重新切割。舉個例子如果一個縣域邊界橫跨了平原和低山丘陵兩種地貌相交之后這個縣會變成兩個面要素一個標注平原一個標注低山丘陵面積也按實際切割后的大小重新計算。相交完成之后在結(jié)果圖層上右鍵打開屬性表你會發(fā)現(xiàn)FID、一級類型、縣名這些字段都在一起。接下來做一個匯總統(tǒng)計我一般用“按屬性選擇”加“匯總統(tǒng)計數(shù)據(jù)”的組合在“摘要統(tǒng)計”工具里選擇“一級類型”作為分組字段選擇“面積_km2”作為統(tǒng)計字段統(tǒng)計類型選“總和”。輸出的表格里就會列出每種地貌類型在該區(qū)域內(nèi)的總面積。如果想按縣域分別統(tǒng)計那分組字段就不只選“一級類型”而是先按“縣名”分組再按“一級類型”分組輸出結(jié)果就是每個縣每種地貌的面積矩陣。這個操作里的關(guān)鍵點是統(tǒng)計之前一定要確保數(shù)據(jù)在等積投影坐標系下。我前面提過如果數(shù)據(jù)是WGS84經(jīng)緯度直接用面積字段會出問題。在相交之前先把源數(shù)據(jù)用“投影”工具轉(zhuǎn)成Albers等積投影再用投影后的數(shù)據(jù)做相交和統(tǒng)計這樣面積結(jié)果才可信。我的習慣參數(shù)是中央經(jīng)線105°E標準緯線25°N和47°N。4.2 用漁網(wǎng)分割shp做局部網(wǎng)格化統(tǒng)計“漁網(wǎng)分割shp”在熱搜詞里出現(xiàn)次數(shù)不少這其實是一個很實用的空間分析手段。比如你想把全國地貌數(shù)據(jù)按1公里乘以1公里的網(wǎng)格切分統(tǒng)計每個網(wǎng)格內(nèi)的主要地貌類型或者為后續(xù)建模準備網(wǎng)格化的特征輸入。漁網(wǎng)工具在ArcGIS里叫“創(chuàng)建漁網(wǎng)Create Fishnet”在QGIS里叫“創(chuàng)建網(wǎng)格Create Grid”。操作步驟在ArcToolbox里找到“數(shù)據(jù)管理工具—采樣—創(chuàng)建漁網(wǎng)”。設置漁網(wǎng)范圍。這里有技巧最好選擇“與圖層范圍相同”讓漁網(wǎng)完全覆蓋地貌數(shù)據(jù)的邊界范圍不要手動輸入坐標范圍否則容易留白。設置像元寬度和高度。注意這里單位是地圖單位如果你的數(shù)據(jù)是投影坐標系那單位是米如果是經(jīng)緯度那單位是度。1公里乘以1公里的網(wǎng)格在投影坐標系下就是寬高均設1000。生成漁網(wǎng)后用“面相交”工具把漁網(wǎng)和地貌數(shù)據(jù)做疊加輸出結(jié)果就是每個網(wǎng)格碎片上的地貌類型。最后用“匯總統(tǒng)計”能算出每個網(wǎng)格里不同地貌的面積比例或者用“標識Identity”工具直接把地貌類型賦給每個網(wǎng)格。實際使用中我提醒一句創(chuàng)建漁網(wǎng)的時候留意“創(chuàng)建標注點”那個選項默認是勾選的會同時生成一個點圖層如果不需要就取消勾選否則輸出里多一堆沒用的點要素。4.3 全國地貌圖的制圖技巧拿到好數(shù)據(jù)不出圖就虧了。地貌制圖其實很有講究我這里說幾個我實際操作中驗證過比較管用的技巧第一分類渲染時用“一級類型”字段選擇冷色和暖色對比方案。比如平原用綠色系丘陵用黃色系山地用棕色系高原用紅色系盆地用灰色系。這種配色符合地圖學的視感習慣也容易被領導和甲方接受。ArcGIS的符號系統(tǒng)里符號庫自帶一套“地貌”分類樣式但說實話那套配色偏老氣我一般自己手動調(diào)。第二如果想要更精細的效果可以用“二級類型”渲染但圖例會非常長。我的做法是出兩級比例尺圖小比例尺全國圖用一級類型大比例尺局部圖再用二級類型。第三圖層疊加順序上地貌數(shù)據(jù)作為底圖應該放在行政邊界之下、遙感影像之上。這樣能保證邊界線清晰又不會蓋住地貌面要素的底色。再配合一個半透明效果把等高線或者水系疊上去整張圖會很有層次感。第四導出圖片時分辨率至少300dpi否則地貌邊界放大看全是鋸齒。在ArcGIS Pro里“布局—導出”時記得把“抗鋸齒”質(zhì)量調(diào)到高。5. 系列格式轉(zhuǎn)換實操記錄5.1 shp轉(zhuǎn)3dtiles把地貌數(shù)據(jù)拉進三維場景熱搜詞里“shp轉(zhuǎn)3dtiles”排在第一位。確實現(xiàn)在傾斜攝影、三維GIS項目越來越多很多單位想把二維的shp數(shù)據(jù)變成三維場景里能疊加的圖層。shp轉(zhuǎn)3dtiles的思路不復雜就是把面要素抽稀成三角網(wǎng)并附帶屬性信息再按LOD金字塔方式切片輸出成3dtiles格式供Cesium等前端加載。我的操作流程是先用QGIS把shp投影到Web Mercator坐標系EPSG:3857因為3dtiles場景里經(jīng)常配合在線影像底圖在線底圖普遍是這個坐標系。進入CesiumLab的“通用切片”模塊選擇“矢量數(shù)據(jù)”輸入選擇剛才那個投影后的shp文件。設置切片參數(shù)。LOD層級一般從0到16地貌數(shù)據(jù)是大范圍面數(shù)據(jù)起始層級可以設置得低一些比如從4開始減少瓦片數(shù)量。選擇屬性字段輸出。切片時可以把“一級類型”和“面積_km2”寫成屬性前端點擊每個面就能彈出屬性框。切片完成后把輸出的tileset.json和一個瓦片目錄發(fā)布到靜態(tài)服務器在Cesium里用Cesium3DTileset加載就好。如果你不想裝桌面工具純命令行也有辦法可以用shp2tiles這類開源工具直接轉(zhuǎn)換但參數(shù)調(diào)整的靈活度不如桌面工具出圖效果看運氣。我的建議是只轉(zhuǎn)一個省級或者小范圍區(qū)域時可以直接命令行處理全國范圍的數(shù)據(jù)建議用桌面工具因為瓦片數(shù)量大命令行工具的默認抽稀設置容易讓邊界變模糊。5.2 批量shp轉(zhuǎn)CAD做規(guī)劃、設計這行的人經(jīng)常會碰到“把shp轉(zhuǎn)成CAD”的需求。規(guī)劃局給的成果是shp但設計院的小伙只用CAD格式必須轉(zhuǎn)換。ArcGIS自帶“導出至CAD”功能但這個功能一次只能導出一個圖層。如果你有幾十個shp文件手動一個個導會崩潰。批量操作我建議用Python腳本在ArcGIS Pro的Python窗口里直接寫循環(huán)import arcpy import os in_folder rD:\shp_data # 存放shp的文件夾 out_folder rD:\cad_output # 輸出CAD的文件夾 os.makedirs(out_folder, exist_okTrue) for shp in arcpy.ListFeatureClasses(*.shp, , in_folder): out_dwg os.path.join(out_folder, os.path.basename(shp).replace(.shp, .dwg)) arcpy.ExportCAD_conversion(shp, DWG_R2018, out_dwg, OVERWRITE_EXISTING) print(f轉(zhuǎn)換完成: {os.path.basename(shp)})跑一遍下來文件夾里所有shp就都變成dwg了。這里提醒幾個點導出CAD的版本參數(shù)“DWG_R2018”要根據(jù)你目標CAD的版本選。選太低版本高版本CAD打開沒問題但會丟失一些細節(jié)選太高版本低版本CAD打不開。CAD里默認沒有“面”概念shp里的面要素轉(zhuǎn)過去后會變成閉合的多段線LWPOLYLINE填充和圖案都沒有需要自己在CAD里補。屬性字段轉(zhuǎn)過去后CAD里默認不會顯示文字標注。想在CAD里直接看到地貌類型名稱可以用“注記”方式導出但會生成大量文本對象文件體積會大不少。我的建議是導出CAD后在CAD里用“提取線”加“標注”兩步補充。5.3 shp轉(zhuǎn)txt/測定界shp轉(zhuǎn)txt工具“測定界shp轉(zhuǎn)txt工具.tbx”是地籍測量領域經(jīng)常會用到的東西。土地勘測定界的時候測量單位通常需要提交txt格式的界址點坐標成果表而采集數(shù)據(jù)往往是用shp存的面狀宗地。txt里要的內(nèi)容一般是點號、X坐標、Y坐標、邊長、角度。手動從shp屬性表復制坐標到txt那是“身體在地獄”的活兒尤其是幾百個界址點的情況下。我找到一個比較靠譜的辦法在ArcGIS Pro里先用“要素折點轉(zhuǎn)點”工具把面要素的每個頂點提取成點要素。用“添加Geometry屬性”工具給這些點添加經(jīng)緯度坐標字段。然后打開屬性表全選右鍵復制粘貼到Excel里整理再導出為txt。這個流程能跑通但有點繞步驟多容易出錯。更正規(guī)的做法是直接用ArcGIS的“Excel表格轉(zhuǎn)文本”配合VB腳本或者直接寫Python讀取面要素的幾何坐標輸出為標準的TXT格式。我分享一個Python片段它可以遍歷每個面要素的頂點點位按“點號 X Y”的格式寫入txtimport arcpy fc rD:\data\界址.shp out_txt rD:\data\界址.txt with open(out_txt, w, encodingutf-8) as f: with arcpy.da.SearchCursor(fc, [SHAPE]) as cursor: for row in cursor: geom row[0] for part in geom: for point in part: if point: f.write(f{point.ID}, {point.X:.3f}, {point.Y:.3f}\n) print(轉(zhuǎn)換完成)如果你連Python也不想寫有的GIS論壇里能搜到“shp轉(zhuǎn)txt.tbx”這種現(xiàn)成工具箱下載下來放到ArcToolbox里直接掛載使用本質(zhì)上是封裝好的腳本我用過一次能用但處理大數(shù)據(jù)量時速度偏慢。5.4 dxf轉(zhuǎn)shp反向操作也常見說完shp轉(zhuǎn)CAD反向的dxf轉(zhuǎn)shp也經(jīng)常碰到。有些人從設計院拿到的圖是CAD格式CAD里的地塊是閉合多段線但沒有屬性字段要轉(zhuǎn)成shp用來做空間分析。QGIS里處理這個最方便直接把dxf拖進QGIS它會識別出多個圖層選擇你需要的那個面圖層右鍵導出為shapefile。如果CAD里的閉合多段線在導出后被識別成線而不是面需要先運行“修復幾何”工具或者使用“多邊形化Polygonize”工具把閉合線轉(zhuǎn)成面。這里有個老生常談的坑CAD文件里如果有多層嵌套塊引用直接導入QGIS時塊里的圖形不會自動展開。你需要先在CAD里用“分解”Explode命令把塊炸開再存成dxf再導入QGIS這樣才能轉(zhuǎn)出干凈的shp。5.5 SU導入shpSketchUp里的地形底圖“su怎么導入shp”這個搜索詞說明還真有不少人在SketchUp里用GIS數(shù)據(jù)。做法也不復雜SketchUp本身不直接支持shp需要借助插件。網(wǎng)上比較流行的做法是裝“SketchUp ESRI”插件或者用QGIS先把shp導出為KML/KMZ格式然后在SketchUp里用“導入KML”功能加載。KML導入后面要素會變成帶紋理的閉合面可以在上面繼續(xù)建模。如果你的目標是生成三維地形那直接用DEM數(shù)據(jù)轉(zhuǎn)成TIN再導入SketchUp會更靠譜。shp地貌數(shù)據(jù)更適合當“貼圖底圖”用——先把地貌shp轉(zhuǎn)到KML加載到SketchUp里定位然后在上面畫建筑輪廓。這個工作流用到不少項目里算是比較成熟的組合。6. 常見問題與排查技巧實錄6.1 問題速查表平時在群里被問到最多的問題都是shp文件操作里的通病我整理了一個速查表按癥狀找藥癥狀原因解決辦法文件拖進軟件但不顯示圖形缺少shx或dbf文件或者shp坐標范圍異常檢查三個基礎文件是否齊全用“數(shù)據(jù)檢查”工具掃描屬性表中文全是亂碼cpg文件缺失或編碼聲明錯誤用QGIS重新選擇編碼打開或用記事本檢查cpg內(nèi)容顯示位置偏移至非洲/海上prj文件缺失或坐標系定義錯誤手動設置正確的坐標系不要輕易選“定義投影”面積統(tǒng)計結(jié)果明顯偏小/偏大坐標系是經(jīng)緯度使用了錯誤的面積字段投影到等積坐標系后重新計算面積面要素邊界有自相交或縫隙原始數(shù)據(jù)拓撲錯誤用“修復幾何”工具批量修復導出CAD后要素屬性丟失CAD格式不支持dbf屬性直接嵌入用注記方式導出或在CAD中手動標注6.2 ArcGIS Pro里怎么把shp按屬性拆分“arcgispro怎么把shp拆分”在熱搜里的熱度不低。拆分需求通常是這樣的一份全國地貌shp想按省、按市、或者按地貌類型拆分成多個獨立文件。拆分有幾種思路我按推薦程度排按屬性拆分為多個文件用“按屬性分割Split by Attributes”工具輸入shp選擇拆分字段比如“一級類型”工具會為字段里的每個唯一值生成一個新shp文件。比如“一級類型”里有5種地貌就會輸出5個shp。這是最簡單的方法我常用。按位置裁剪拆分如果你有一張縣級邊界想裁剪出本縣域的地貌數(shù)據(jù)用“裁剪Clip”工具輸入要素是地貌shp裁剪要素是縣域邊界輸出只保留縣域范圍內(nèi)的部分。按范圍拆分成區(qū)塊如果數(shù)據(jù)量巨大分析時內(nèi)存不夠可以先用“創(chuàng)建漁網(wǎng)”生成網(wǎng)格然后用“裁剪”工具把數(shù)據(jù)按網(wǎng)格切成多個小塊分塊處理?!鞍磳傩苑指睢崩镉袀€小細節(jié)輸出命名規(guī)則默認是“原文件名_字段值.shp”但字段值如果是中文在部分操作系統(tǒng)上文件名會出亂碼建議在運行前把字段值替換為拼音或數(shù)字編碼導出后再映射回中文名稱。6.3 shp文件導出時缺失cpg文件的處理熱搜詞里有一條很具體“shp文件導出的時候沒有cpg文件是怎么回事”。這個現(xiàn)象在ArcMap里導出國標數(shù)據(jù)時很常見。原因其實不復雜ArcMap在導出shp時如果源數(shù)據(jù)的dbf字符編碼是雙字節(jié)或者中文字符集它會自動生成cpg文件但如果源數(shù)據(jù)的dbf字符編碼在它眼里是“系統(tǒng)默認ANSI”它就可能不生成cpg。解決辦法手動補一個cpg文件。在你導出shp的文件夾里新建一個文本文件改名為和shp同名、后綴為.cpg用記事本打開寫入“UTF-8”并保存。要注意文件名必須和shp主文件一致。比如shp叫“地貌分布.shp”cpg就得叫“地貌分布.cpg”。用QGIS代替ArcGIS導出。QGIS導出shp時會強制讓你選擇編碼如果選了UTF-8它就會生成對應的cpg文件穩(wěn)定可靠。補完cpg后重新打開shp屬性表中文基本就恢復正常。如果還是亂碼那就說明dbf里的實際編碼和cpg聲明的不一致這時要反向排查先確定dbf是哪種編碼再改cpg。6.4 圖層不顯示先檢查坐標范圍還有一類打開shp后地圖上什么都沒有的問題不是文件壞了而是數(shù)據(jù)坐標范圍跟當前地圖范圍離得太遠。比如你在WGS84經(jīng)緯度地圖里加載一份以米為單位的投影坐標數(shù)據(jù)數(shù)據(jù)范圍可能是X: 500000, Y: 4000000這種大數(shù)值而當前地圖范圍默認是經(jīng)緯度X: 73, Y: 26左右差了十萬八千里自然看不到圖形。解決辦法是右鍵圖層選擇“縮放至圖層”軟件會直接飛到數(shù)據(jù)所在的正確范圍。這幾個問題看起來不大但實際工作中幾乎天天碰到多花兩分鐘排查能省下后面分析時的大麻煩。7. 寫在最后的一點個人體會做了這么多年GIS數(shù)據(jù)處理我越來越覺得一份干凈、結(jié)構(gòu)合理、字段齊全的數(shù)據(jù)本身就是最大的財富。數(shù)據(jù)格式轉(zhuǎn)換、坐標系統(tǒng)一、拓撲修復這些活兒說難不難說簡單也不簡單關(guān)鍵是要有耐心遇到問題不慌一步步排查。拿到任何一份shp數(shù)據(jù)我建議都按這個流程過一遍先查文件完整性再查坐標系然后看屬性表最后才開始分析。順序錯了后面全得返工。這份全國地貌分布shp數(shù)據(jù)我實際用了大半年從全國尺度的專題制圖到幾個省份的地貌統(tǒng)計再到三維場景的疊加展示都在用。平時積累的那些轉(zhuǎn)換工具和腳本我也順手整理在了一個文件夾里每次遇到新項目都能拿出來復用。希望這篇記錄能幫你少走一些彎路。本文還有配套的精品資源點擊獲取