避坑)
簡(jiǎn)介滹沱河流域 shp 面文件是一份可直接用于 ArcGIS 等地理信息軟件的矢量數(shù)據(jù)包主要反映流域范圍與邊界特征。資源面向水文學(xué)、地理學(xué)、城鄉(xiāng)規(guī)劃以及環(huán)境保護(hù)工作者解決這類(lèi)使用者缺少基礎(chǔ)流域底圖、需要手工勾畫(huà)或采集矢量邊界的問(wèn)題。壓縮包共 8 個(gè)文件完整覆蓋 Shapefile 格式的主要組成部分.shp 存儲(chǔ)面要素幾何坐標(biāo).dbf 保存屬性信息.prj 記錄投影坐標(biāo)系.sbn、.sbx、.shx 等承擔(dān)空間索引與幾何加速讀取功能還附有 .xml 元數(shù)據(jù)和 .cpg 編碼聲明包體僅 36KB數(shù)據(jù)輕便規(guī)范。已有 396 人學(xué)習(xí)瀏覽說(shuō)明該資源對(duì)入門(mén)級(jí) GIS 用戶有一定參考價(jià)值。加載后可快速查看滹沱河流域邊界也可疊加土地利用、氣象、水文觀測(cè)等數(shù)據(jù)進(jìn)行空間分析或作為底圖制作專(zhuān)題地圖同時(shí)可直接用于流域面要素的裁剪、疊加、提取等常見(jiàn)操作適合課堂教學(xué)、區(qū)域研究和項(xiàng)目演示等多種用途。1. 滹沱河流域shp格式面文件想做流域分析先從這張“面”說(shuō)起滹沱河流域shp格式面文件是水利、環(huán)保和規(guī)劃項(xiàng)目里非常常見(jiàn)的一份基礎(chǔ)底圖。它的核心不是那幾條河道線而是一張完整的、閉合的流域邊界多邊形你可以在ArcGIS里直接疊加到DEM、行政區(qū)、土地利用或者遙感影像上。拿到這張面文件后最直接的用處就是圈定研究范圍算流域面積、統(tǒng)計(jì)高程分布、跟縣界做相交分析、裁出子流域這些操作都建立在“面SHP能被正確處理”的前提下。這篇筆記我會(huì)按自己拆數(shù)據(jù)的習(xí)慣來(lái)寫(xiě)先說(shuō)怎么在ArcGIS里把它加載成一份“能信任”的圖層再講裁剪、疊置、格式轉(zhuǎn)換、修復(fù)以及真正容易翻車(chē)的幾個(gè)地方。適合剛接觸SHP的水利從業(yè)者也適合被各種流域邊界數(shù)據(jù)折磨過(guò)的老手看看有沒(méi)有哪條坑你沒(méi)踩過(guò)。2. 把SHP面文件導(dǎo)入ArcGIS加載前的三件套檢查和坐標(biāo)識(shí)別2.1 打開(kāi)前先確認(rèn)是“三件套”不是單個(gè)文件很多新手拿到SHP文件后習(xí)慣只看后綴帶.shp的那個(gè)文件雙擊或者拖進(jìn)ArcMap結(jié)果提示“不能打開(kāi)”第一反應(yīng)是數(shù)據(jù)壞了。這里要先補(bǔ)一個(gè)基礎(chǔ)認(rèn)知Shapefile不是一個(gè)文件而是一組文件。最少要有.shp幾何信息、.shx索引、.dbf屬性表這三個(gè)少任何一個(gè)都打不開(kāi)或丟屬性。你在微信、QQ或者網(wǎng)盤(pán)里接收這種文件時(shí)如果對(duì)方只發(fā)了一個(gè).shp那基本等于沒(méi)發(fā)。我一般會(huì)把SHP文件單獨(dú)放在一個(gè)文件夾里比如D:\hutuo_data\然后通過(guò)ArcCatalog連接到這個(gè)文件夾先在“預(yù)覽”頁(yè)簽里看一眼圖形確認(rèn)它是不是面文件。為什么不推薦直接在ArcMap里拖因?yàn)锳rcMap的圖層加載失敗時(shí)報(bào)錯(cuò)信息很籠統(tǒng)你在里面分辨不出是文件缺失、坐標(biāo)系統(tǒng)未知還是幾何本身有問(wèn)題。而ArcCatalog的預(yù)覽視圖可以快速區(qū)分“點(diǎn)、線、面”三種ShapeType。這一點(diǎn)對(duì)流域數(shù)據(jù)尤其關(guān)鍵因?yàn)橛行﹣?lái)源會(huì)把流域邊界做成線文件把流域畫(huà)成閉合線框看起來(lái)是面積實(shí)際上只是線要素后面做面積統(tǒng)計(jì)就徹底沒(méi)法用。在ArcGIS里也可以用一小段Python來(lái)快速判斷SHP的基本情況import arcpy arcpy.env.workspace rD:\hutuo_data shp hutuo_river_basin.shp desc arcpy.Describe(shp) print(要素類(lèi)型, desc.shapeType) # 輸出 Polygon 才是面文件 print(空間參考, desc.spatialReference.name) print(是否含投影, desc.spatialReference.type) # Projected 或 Geographic這段代碼用arcpy.Describe讀取SHP文件的元數(shù)據(jù)。shapeType返回Polygon說(shuō)明這是面圖層后面空間分析工具才認(rèn)spatialReference.name會(huì)告訴你坐標(biāo)系名稱(chēng)比如“WGS_1984_UTM_Zone_50N”或者“CGCS2000_3_Degree_GK_CM_114E”。如果這里顯示Unknown說(shuō)明.prj文件缺失這種情況下做面積計(jì)算和投影轉(zhuǎn)換都會(huì)出問(wèn)題。2.2 坐標(biāo)系怎么選滹沱河流域適合用什么投影面文件的坐標(biāo)系決定了你算面積、量距離、做Buffer時(shí)結(jié)果對(duì)不對(duì)。滹沱河流域大部分位于山西省東部到河北省中西部東西跨度大約在112.5°E到115.5°E之間南北約38°N到39.5°N。這個(gè)范圍用經(jīng)緯度地理坐標(biāo)顯示沒(méi)問(wèn)題但如果直接用SHAPE.AREA字段計(jì)算面積或者用“測(cè)量工具”去量距離你得到的數(shù)值會(huì)非常奇怪因?yàn)榻?jīng)緯度不是等距投影。最穩(wěn)妥的做法是在分析前把SHP轉(zhuǎn)換到合適的高斯-克呂格投影。這個(gè)流域的經(jīng)度范圍適合用CGCS2000坐標(biāo)系下的3度分帶中央經(jīng)線114°E。在ArcGIS里打開(kāi)“投影”工具輸入圖層選擇“CGCS2000_3_Degree_GK_CM_114E”輸出即可。轉(zhuǎn)換完成后如果單位變成米坐標(biāo)值會(huì)出現(xiàn)“3開(kāi)頭”或者“4開(kāi)頭”的大數(shù)那就說(shuō)明投影生效了。有些場(chǎng)合別人會(huì)發(fā)給你“北京54”或者“西安80”坐標(biāo)系的數(shù)據(jù)。遇到這種情況不要直接拿來(lái)做疊加先通過(guò)“定義投影”弄清楚原始數(shù)據(jù)到底是哪一種再借助ArcGIS自帶的轉(zhuǎn)換參數(shù)轉(zhuǎn)到CGCS2000。這里特別提醒如果SHP文件沒(méi)有.prj文件ArcGIS無(wú)法自動(dòng)識(shí)別坐標(biāo)系你需要先手工把正確的坐標(biāo)系定義進(jìn)去否則后續(xù)做動(dòng)態(tài)投影會(huì)遇到圖層明明在附近卻對(duì)不齊的情況。2.3 屬性表里能挖到什么先看字段再談分析面SHP的價(jià)值不止在邊界還在屬性表。打開(kāi)屬性表后常見(jiàn)字段有OBJECTID、Shape_Leng、Shape_Area以及河流名稱(chēng)、流域編碼、所屬水系這類(lèi)業(yè)務(wù)字段。不同的制圖單位給出的字段命名差異很大有的叫NAME有的叫XZQMC。你在做字段關(guān)聯(lián)或制圖標(biāo)注前必須先確認(rèn)字段名的含義不要拿OBJECTID去關(guān)聯(lián)外部Excel表那幾乎一定會(huì)錯(cuò)位。下面是一個(gè)典型的流域?qū)傩员斫Y(jié)構(gòu)示例字段名類(lèi)型說(shuō)明OBJECTID長(zhǎng)整型系統(tǒng)唯一IDShape_Area雙精度投影平面面積NAME文本河流或流域名稱(chēng)BASIN_CODE文本流域編碼SOURCE文本數(shù)據(jù)來(lái)源單位注意Shape_Area字段的值會(huì)隨當(dāng)前圖層坐標(biāo)系變化而變。如果圖層是地理坐標(biāo)這個(gè)字段的值不是平方米只有投影坐標(biāo)下它才接近真實(shí)的平方米數(shù)值。所以我的習(xí)慣是在開(kāi)始任何分析前給SHP增加一個(gè)自己的面積字段用Geometry Calculator計(jì)算一次正式面積后面不管坐標(biāo)系怎么折騰都以這個(gè)字段為準(zhǔn)。3. 把流域SHP變成能分析的圖層裁剪、分區(qū)統(tǒng)計(jì)和關(guān)聯(lián)屬性3.1 用Clip工具提取子流域或局部范圍拿到完整的滹沱河流域面SHP后你可能只需要滹沱河石家莊段的匯水范圍或者只想保留某個(gè)水文站以上的區(qū)域。最常用的操作就是用另一個(gè)面圖層去做裁剪即ArcToolbox里的“分析工具→提取→裁剪”。裁剪相當(dāng)于拿一個(gè)“餅干模子”去摳原始面輸出結(jié)果只保留模子內(nèi)的部分幾何邊界自動(dòng)更新。操作上需要給“裁剪要素”提供一個(gè)閉合面這個(gè)面可以是你手工繪制的矩形也可以是按字段篩選后的子集。如果你已經(jīng)有子流域邊界直接用那個(gè)子流域面去裁剪如果沒(méi)有可以先用“按位置選擇”把主流域SHP里跟某條河流相交的面選中然后導(dǎo)出新圖層。這里要注意很多人喜歡先“合并”再裁剪但如果數(shù)據(jù)量大合并會(huì)帶來(lái)不必要的性能損耗和幾何重疊問(wèn)題慎用。用ArcPy也能完成同樣的裁剪操作方便批量跑多個(gè)流域import arcpy arcpy.env.workspace rD:\hutuo_data arcpy.analysis.Clip( in_featureshutuo_river_basin.shp, clip_featuressjz_section.shp, out_feature_classhutuo_sjz_clip.shp ) print(裁剪完成)這里的in_features是被裁剪的流域面clip_features是裁剪范圍out_feature_class是輸出文件名。ArcGIS的Clip對(duì)輸入和裁剪要素必須是同類(lèi)幾何面裁面沒(méi)有問(wèn)題但如果你拿一個(gè)線圖層去裁剪面結(jié)果會(huì)什么也不剩。報(bào)錯(cuò)時(shí)先檢查這兩個(gè)參數(shù)的幾何類(lèi)型是否匹配這是最常見(jiàn)的翻車(chē)原因。3.2 讓流域SHP和DEM說(shuō)上話分區(qū)統(tǒng)計(jì)面SHP放入ArcGIS后單獨(dú)看邊界意義有限真正能出成果的是把流域范圍作為掩膜去統(tǒng)計(jì)它覆蓋的柵格數(shù)據(jù)。比如你有滹沱河流域的30米DEM想知道流域內(nèi)平均高程、最高點(diǎn)、最低點(diǎn)不必手動(dòng)描范圍直接用空間分析工具里的“分區(qū)統(tǒng)計(jì)”即可。分區(qū)統(tǒng)計(jì)的核心邏輯是把面SHP的每個(gè)要素當(dāng)作一個(gè)“區(qū)”對(duì)落入該區(qū)內(nèi)的所有柵格像元做統(tǒng)計(jì)輸出一個(gè)dbf表格。這個(gè)工具的輸入?yún)?shù)有兩個(gè)關(guān)鍵點(diǎn)柵格數(shù)據(jù)或要素區(qū)域數(shù)據(jù)選擇SHP面文件區(qū)域字段選一個(gè)唯一ID字段。下面這段腳本演示批量場(chǎng)景import arcpy from arcpy.sa import * arcpy.env.workspace rD:\hutuo_data arcpy.env.extent hutuo_river_basin.shp arcpy.env.snapRaster dem30.tif outTable ZonalStatisticsAsTable( hutuo_river_basin.shp, FID, dem30.tif, basin_zonal.dbf, DATA, ALL ) print(分區(qū)統(tǒng)計(jì)結(jié)果, outTable)FID是原始SHP里的唯一編號(hào)用它做區(qū)域字段最保險(xiǎn)因?yàn)椴粫?huì)出現(xiàn)同名要素導(dǎo)致統(tǒng)計(jì)結(jié)果被合并的情況。DATA參數(shù)表示忽略柵格中的NoData值A(chǔ)LL表示輸出平均值、最大值、最小值、標(biāo)準(zhǔn)差等全部統(tǒng)計(jì)項(xiàng)。統(tǒng)計(jì)完成后把輸出的basin_zonal.dbf通過(guò)公共字段連接回原SHP屬性表就能在圖層上按平均高程做符號(hào)化。3.3 給面文件補(bǔ)屬性計(jì)算面積和手工新建SHP有時(shí)候你拿到的SHP屬性表非常簡(jiǎn)陋沒(méi)有面積字段甚至連坐標(biāo)信息都不完整。我的習(xí)慣是先給原文件做一個(gè)備份然后添加一個(gè)雙精度字段專(zhuān)門(mén)用來(lái)記錄正式面積。這里有一個(gè)容易踩的坑如果你直接在SHP上添加字段并計(jì)算可能會(huì)把原始數(shù)據(jù)改壞所以更規(guī)范的做法是先復(fù)制一份再在副本上操作。復(fù)制SHP并計(jì)算面積可以用Python腳本import arcpy src rD:\hutuo_data\hutuo_river_basin.shp dst rD:\hutuo_data\hutuo_area.dbf arcpy.Copy_management(src, rD:\hutuo_data\hutuo_copy.shp, ) arcpy.AddField_management(dst, AREA_KM2, DOUBLE, 10, 2) arcpy.CalculateField_management( dst, AREA_KM2, !SHAPE.GEODESICAREA! / 1000000, PYTHON3 )SHAPE.GEODESICAREA是ArcGIS的Python表達(dá)式表示要素在橢球體上計(jì)算的測(cè)地面積單位是平方米除以1000000后得到平方千米。這里之所以不用!Shape_Area!是因?yàn)镾hape_Area可能受當(dāng)前坐標(biāo)系影響當(dāng)圖層處于經(jīng)緯度坐標(biāo)時(shí)Shape_Area的數(shù)值會(huì)失真而GEODESICAREA只跟要素的真實(shí)幾何位置相關(guān)不受地圖投影影響。如果你工作區(qū)域跨度不大兩者差異不明顯如果做跨帶的大流域分析這個(gè)細(xì)節(jié)就可能決定數(shù)據(jù)是否可信。如果你沒(méi)有現(xiàn)成的SHP想從零開(kāi)始新建一個(gè)流域面文件在ArcGIS里用“創(chuàng)建要素類(lèi)”可以完成選擇面幾何類(lèi)型指定坐標(biāo)系然后打開(kāi)編輯器繪制邊界。但手工繪制流域邊界精度很低我一般不推薦除非你只是做一個(gè)示意草圖。真實(shí)項(xiàng)目里還是以水文部門(mén)提取的流域SHP為準(zhǔn)手工繪制僅用于快速演示。4. 格式轉(zhuǎn)換與修復(fù)DWG轉(zhuǎn)SHP、SHP轉(zhuǎn)KML和ShapeCHK修復(fù)實(shí)操4.1 DWG轉(zhuǎn)SHPCAD線稿要變成面先解決閉合問(wèn)題很多歷史資料里滹沱河的河道和流域邊界都是DWG格式的CAD圖紙。要把DWG轉(zhuǎn)成SHP面文件不是簡(jiǎn)單地“另存為”就能完成。CAD里的流域邊界通常是多段線如果這條多段線沒(méi)有完全閉合ArcGIS轉(zhuǎn)換后只會(huì)生成線要素不會(huì)生成面要素。這個(gè)坑在我過(guò)去處理河道邊界時(shí)幾乎每次都遇到。常見(jiàn)做法分兩步第一步把DWG導(dǎo)入ArcGIS用“CAD到地理數(shù)據(jù)庫(kù)”工具轉(zhuǎn)換成要素類(lèi)第二步打開(kāi)屬性表查看要素的幾何類(lèi)型。如果導(dǎo)入后是Polyline需要用“要素轉(zhuǎn)面”工具把閉合線轉(zhuǎn)換成面。但“要素轉(zhuǎn)面”有個(gè)前提線要素不能有懸掛點(diǎn)和自相交否則生成的面會(huì)破碎。在CAD里先處理好數(shù)據(jù)比ArcGIS里補(bǔ)救高效得多。我會(huì)在CAD中用BOUNDARY命令對(duì)閉合區(qū)域重新生成面域或者用PEDIT命令檢查多段線是否閉合。確保每條邊界終點(diǎn)和起點(diǎn)重合后再導(dǎo)入ArcGIS。這個(gè)經(jīng)驗(yàn)幾乎是處理“dwg轉(zhuǎn)shp”唯一可靠的路徑。下面是一個(gè)參考操作流程1. CAD中打開(kāi)原圖凍結(jié)無(wú)關(guān)圖層只保留流域邊界線。 2. 全選邊界線執(zhí)行 PEDIT - 輸入 J 合并 - 閉合檢查。 3. CAD另存為 R2010 以下版本避免高版本不兼容。 4. ArcToolbox - 轉(zhuǎn)換工具 - CAD轉(zhuǎn)地理數(shù)據(jù)庫(kù)。 5. 對(duì)生成的線要素執(zhí)行要素轉(zhuǎn)面。 6. 用第七章提到的 ShapeCHK 檢查面文件。4.2 SHP轉(zhuǎn)KML把流域邊界拿到Google Earth里看很多非GIS專(zhuān)業(yè)的同事習(xí)慣把SHP轉(zhuǎn)成KML放到Google Earth里查看。ArcGIS里最常用的工具是“圖層轉(zhuǎn)KML”但SHP文件不能直接作為輸入它需要先有一個(gè)圖層文件或者地圖文檔。所以我一般先給SHP做一個(gè)簡(jiǎn)單的符號(hào)化然后在內(nèi)容列表里右鍵圖層選擇“屬性→圖層屬性→圖層轉(zhuǎn)KML”。如果寫(xiě)成Python邏輯是這樣import arcpy arcpy.MakeFeatureLayer_management( rD:\hutuo_data\hutuo_river_basin.shp, hutuo_lyr ) arcpy.LayerToKML_conversion( hutuo_lyr, rD:\hutuo_data\hutuo_basin.kmz, MAP_BOUNDARY, clampedToGround, COMPOSITE, 1024, 96, PNG8 )MAP_BOUNDARY表示只導(dǎo)出圖層可見(jiàn)范圍clampedToGround表示把要素貼在地面上而不是懸浮在某個(gè)高度。輸出文件后綴可以用.kmz壓縮包Google Earth能直接讀取。需要注意圖層里如果有中文標(biāo)注導(dǎo)出前字體要選擇支持中文的字體否則KML在手機(jī)上打開(kāi)會(huì)出現(xiàn)方塊字。反過(guò)來(lái)KML轉(zhuǎn)SHP也很常見(jiàn)。用“KML轉(zhuǎn)圖層”工具導(dǎo)入后輸出的是一個(gè)要素圖層但KML里的面可能被拆成了多個(gè)片段原因是Google Earth里的多邊形如果中間有鏤空或者復(fù)雜邊界轉(zhuǎn)成SHP后會(huì)生成多部件面。多部件面雖然也是合法SHP但做面積統(tǒng)計(jì)和拓?fù)錂z查時(shí)容易忽略?xún)?nèi)部孔洞。處理這類(lèi)數(shù)據(jù)時(shí)我一般先用“多部件轉(zhuǎn)單部件”把幾何拆開(kāi)再逐塊檢查。4.3 修復(fù)損壞的SHP用ShapeCHK檢查幾何和索引Shapefile是上世紀(jì)九十年代的老格式結(jié)構(gòu)簡(jiǎn)單但也脆弱。文件斷電、非法關(guān)機(jī)、U盤(pán)拷貝中斷都可能讓SHP產(chǎn)生幾何錯(cuò)誤、.shx索引和.shp內(nèi)容不匹配。ArcGIS打開(kāi)時(shí)報(bào)“創(chuàng)建要素類(lèi)失敗”或者“無(wú)法識(shí)別文件”大概率是SHP本身?yè)p壞了。這里強(qiáng)烈建議使用ShapeCHK這個(gè)老牌命令行工具。它是Esri圈子里流傳很廣的SHP診斷修復(fù)工具專(zhuān)門(mén)檢查.shp、.shx、.dbf三者一致性、幾何記錄長(zhǎng)度、記錄頭是否完整。使用方法也不復(fù)雜打開(kāi)命令行窗口把ShapeCHK和要修復(fù)的SHP放在同一目錄然后執(zhí)行shapechk hutuo_river_basin.shp工具會(huì)逐條掃描文件中的幾何記錄發(fā)現(xiàn)錯(cuò)誤時(shí)輸出錯(cuò)誤類(lèi)型和大致位置。部分版本支持參數(shù)自動(dòng)修復(fù)shapechk hutuo_river_basin.shp /fix/fix參數(shù)會(huì)嘗試重建索引文件并修正頭部信息但如果幾何本身已經(jīng)破損修復(fù)程度有限。所以我通常把ShapeCHK當(dāng)作“體檢工具”而不是“萬(wàn)能后悔藥”跑一遍沒(méi)報(bào)錯(cuò)說(shuō)明文件基礎(chǔ)結(jié)構(gòu)沒(méi)問(wèn)題報(bào)了錯(cuò)趕緊找原始備份不要抱著修復(fù)后的文件繼續(xù)做分析。順帶一提如果你想把SHP屬性表轉(zhuǎn)成txt用于核對(duì)可以在ArcGIS里右鍵屬性表選擇“導(dǎo)出”把dbf內(nèi)容另存為CSV或文本文件。CSV文件用Excel打開(kāi)時(shí)字段編碼經(jīng)常亂我會(huì)選擇用VSCode或Notepad打開(kāi)并切換到UTF-8編碼查看。5. 實(shí)操避坑滹沱河流域SHP處理時(shí)的五個(gè)高頻問(wèn)題5.1 計(jì)算面積偏差大數(shù)值小得不像流域現(xiàn)象面SHP明明是完整流域用面積字段統(tǒng)計(jì)結(jié)果只有幾千平方米跟真實(shí)流域面積差了至少三個(gè)數(shù)量級(jí)。原因圖層坐標(biāo)系處于經(jīng)緯度地理坐標(biāo)狀態(tài)SHAPE.AREA按度計(jì)算不是平方米。在沒(méi)有投影的情況下Shape_Area字段不具備實(shí)際物理意義。解決先確認(rèn).prj內(nèi)容通過(guò)“投影”工具把SHP轉(zhuǎn)到適合滹沱河流域的高斯-克呂格投影。滹沱河流域我常用CGCS2000_3_Degree_GK_CM_114E。轉(zhuǎn)換完成后重新計(jì)算SHAPE.AREA得到的數(shù)值才接近真實(shí)平方米。如果不想動(dòng)原數(shù)據(jù)計(jì)算字段時(shí)用!SHAPE.GEODESICAREA!也能繞開(kāi)投影問(wèn)題。5.2 面重疊和自相交做裁剪時(shí)報(bào)錯(cuò)或結(jié)果為空現(xiàn)象用流域SHP去裁別的數(shù)據(jù)系統(tǒng)提示“幾何未正確初始化”或者輸出空?qǐng)D層打開(kāi)屬性表發(fā)現(xiàn)要素?cái)?shù)為0。原因SHP里的多邊形存在自相交、重復(fù)節(jié)點(diǎn)、懸空邊界等拓?fù)鋯?wèn)題。面文件在Web端下載或者從CAD轉(zhuǎn)換時(shí)沒(méi)有經(jīng)過(guò)拓?fù)錂z查這樣的幾何在ArcGIS的許多分析工具中會(huì)被判定為不可信。解決用“數(shù)據(jù)管理工具→要素→修復(fù)幾何”工具跑一遍。修復(fù)幾何時(shí)勾選“刪除重復(fù)節(jié)點(diǎn)”和“修復(fù)自相交”。修復(fù)前先備份因?yàn)檫@類(lèi)工具對(duì)數(shù)據(jù)有侵入性。如果修復(fù)后還有問(wèn)題用ArcGIS的“拓?fù)洹惫ぞ呒ㄒ粋€(gè)拓?fù)湟?guī)則指定“不能重疊”再逐個(gè)檢查。5.3 屬性連接總是匹配不上中文名稱(chēng)對(duì)不上號(hào)現(xiàn)象把Excel統(tǒng)計(jì)表按鄉(xiāng)鎮(zhèn)名稱(chēng)連接到流域SHP屬性表結(jié)果大量記錄顯示“空”明明兩個(gè)表里都有同一個(gè)鄉(xiāng)鎮(zhèn)名。原因最常見(jiàn)的是兩個(gè)表里鄉(xiāng)鎮(zhèn)名存在不可見(jiàn)字符Excel從其他系統(tǒng)導(dǎo)出時(shí)字符串字段前面或后面帶著空格。另一個(gè)原因是SHP的.dbf文件編碼是GBK而Excel另存為UTF-8連接時(shí)字符不一致。解決連接前先用“表轉(zhuǎn)Excel”導(dǎo)出SHP屬性表然后跟外部Excel對(duì)比特別注意字段長(zhǎng)度和空格。Excel里用TRIM()函數(shù)清理兩邊的空格再用VLOOKUP人工核對(duì)一遍。對(duì)編碼問(wèn)題檢查SHP目錄下是否有.cpg文件如果沒(méi)有用QGIS打開(kāi)原SHP并另存為UTF-8編碼的新SHP再回到ArcGIS里做連接。5.4 拷貝到別人電腦上打不開(kāi)提示文件缺失現(xiàn)象把SHP從自己電腦傳到同事電腦對(duì)方說(shuō)圖層能加載但屬性表空白或者干脆報(bào)“打開(kāi)SHP文件失敗”。原因只拷貝了.shp文件.shx和.dbf沒(méi)跟上。更隱蔽的是三個(gè)文件名被改了其中一部分比如.shp叫“hutuo.shp”.shx卻叫“hutuo_new.shx”引擎按文件名匹配不到索引文件。解決傳輸SHP時(shí)把文件夾整體壓縮打包不要單獨(dú)拖一個(gè)文件。如果已經(jīng)有散亂的三件套改用“ArcCatalog→復(fù)制粘貼”方式重新生成一套確保命名統(tǒng)一。我的習(xí)慣是每次發(fā)送前用ShapeCHK檢查一遍確認(rèn)三個(gè)文件齊全再發(fā)。5.5 省界線文件省1和省2的SHP有什么區(qū)別疊加時(shí)對(duì)不齊現(xiàn)象拿到國(guó)家基礎(chǔ)地理數(shù)據(jù)里的省1和省2兩個(gè)SHP加載到同一地圖中發(fā)現(xiàn)滹沱河流域附近的省界線條并不完全重合做疊加分析后出現(xiàn)很窄的縫隙或重疊。原因省1和省2是不同生產(chǎn)精度的界線數(shù)據(jù)。省1一般指經(jīng)過(guò)概化、用于中小比例尺制圖的省級(jí)行政區(qū)界線省2是更精細(xì)的邊界包含更復(fù)雜的細(xì)節(jié)和國(guó)界要素。兩者比例尺和拓?fù)湟?guī)則不同幾何自然不完全一致。解決做流域空間分析時(shí)只選一套省界作為底圖不要同時(shí)疊加兩套并直接做Union。要以省2即精度更細(xì)的版本作為參考邊界省1可以用來(lái)做示意但不要參與拓?fù)溆?jì)算。如果你發(fā)現(xiàn)流域SHP邊界和省界有沖突優(yōu)先以流域?qū)嶋H地貌范圍為準(zhǔn)行政界線只是參考圖層。6. 再用深一點(diǎn)漁網(wǎng)分割、邊界簡(jiǎn)化與三維場(chǎng)景過(guò)渡6.1 用“創(chuàng)建漁網(wǎng)”把大流域切成分塊有時(shí)你不需要整個(gè)滹沱河流域作為一個(gè)面做分析而需要把它劃分成2公里×2公里的網(wǎng)格逐格統(tǒng)計(jì)土地利用類(lèi)型或者做水環(huán)境評(píng)價(jià)。手動(dòng)畫(huà)方格不現(xiàn)實(shí)正確做法是用ArcGIS的“創(chuàng)建漁網(wǎng)”工具。漁網(wǎng)工具的本質(zhì)是生成一個(gè)規(guī)則的格網(wǎng)覆蓋指定范圍。關(guān)鍵參數(shù)有三個(gè)漁網(wǎng)原點(diǎn)、像元寬高和模板范圍。模板范圍直接選擇SHP面文件時(shí)漁網(wǎng)輸出邊界會(huì)跟流域的范圍框一致。下圖場(chǎng)景里我創(chuàng)建2公里格網(wǎng)然后與流域SHP疊加保留與流域相交的網(wǎng)格import arcpy arcpy.env.workspace rD:\hutuo_data arcpy.management.CreateFishnet( out_featuresgrid_2km.shp, origin_coord490000 4250000, y_axis_coord490000 4250010, cell_width2000, cell_height2000, number_rowsNone, number_columnsNone, labelsNO_LABELS, templatehutuo_river_basin.shp, geometry_typePOLYGON )參數(shù)origin_coord是漁網(wǎng)左下角的投影坐標(biāo)y_axis_coord決定網(wǎng)格旋轉(zhuǎn)方向通常讓它與正北方向一致。template填流域SHP生成的漁網(wǎng)會(huì)自適應(yīng)流域的最大外接矩形。生成網(wǎng)格后還要用“相交”工具把漁網(wǎng)和流域SHP相交這樣網(wǎng)格邊緣就貼合流域邊界而不是簡(jiǎn)單的矩形外框。這一步如果不做你統(tǒng)計(jì)的格網(wǎng)會(huì)有一大半在流域外結(jié)果毫無(wú)意義。6.2 面邊界簡(jiǎn)化與三維場(chǎng)景過(guò)渡流域SHP從專(zhuān)業(yè)水文機(jī)構(gòu)下載時(shí)邊界往往包含海量節(jié)點(diǎn)一個(gè)流域面可能帶著幾萬(wàn)個(gè)點(diǎn)。這種精細(xì)數(shù)據(jù)在小比例尺出圖時(shí)不僅讓電腦卡頓還讓ArcMap的符號(hào)化變得遲鈍。我的經(jīng)驗(yàn)是保存兩套數(shù)據(jù)一套原始精度用于分析一套簡(jiǎn)化版用于制圖和發(fā)布。ArcGIS有條“簡(jiǎn)化面”工具位于制圖工具箱中import arcpy arcpy.cartography.SimplifyPolygon( in_featureshutuo_river_basin.shp, out_feature_classbasin_simplify.shp, algorithmPOINT_REMOVE, tolerance50 Meters, minimum_area0 SquareMeters )POINT_REMOVE算法通過(guò)刪除與相鄰點(diǎn)夾角接近直線的點(diǎn)來(lái)降低節(jié)點(diǎn)密度50 Meters的容差表示小于50米的邊界彎曲會(huì)被忽略。簡(jiǎn)化閾值不是越大越好如果設(shè)成500米流域邊界的細(xì)小河道特征會(huì)全部丟失。出圖給領(lǐng)導(dǎo)看容差可以放寬做水文分析保持原始精度不要隨意簡(jiǎn)化。如果你準(zhǔn)備把流域SHP推送到三維場(chǎng)景比如生成3DTiles做Web端可視化水汽效果會(huì)清楚反映出模型對(duì)流域面的支撐力。基本原理是把面SHP先轉(zhuǎn)成GeoJSON再疊加上高程數(shù)據(jù)最后切片成b3dm。ArcGIS里可以用“轉(zhuǎn)出至GeoJSON”工具后續(xù)步驟交給開(kāi)源工具完成。注意SHP屬性表里的中文名稱(chēng)在GeoJSON里可能編碼錯(cuò)亂轉(zhuǎn)之前先在屬性表里增加一個(gè)英文字段。我從實(shí)際項(xiàng)目里積累的習(xí)慣是拿到任何SHP第一件事復(fù)制一個(gè)原版?zhèn)浞萑缓笥肧hapeCHK檢查文件結(jié)構(gòu)用arcpy.Describe確認(rèn)坐標(biāo)系和幾何類(lèi)型再檢查屬性表最后才開(kāi)始裁剪和轉(zhuǎn)換。這套流程看起來(lái)繁瑣但確實(shí)幫我避免了很多在交付前一刻才發(fā)現(xiàn)幾何錯(cuò)誤的窘境。尤其是滹沱河流域這類(lèi)邊界跨度較大的面文件坐標(biāo)系和拓?fù)鋯?wèn)題幾乎是必然存在的早檢查早安心。希望這篇筆記里的“三件套檢查投影確認(rèn)幾何修復(fù)”能幫到你至少下次再遇到“面文件算不出面積”的怪事時(shí)你知道該往哪幾個(gè)方向排查。本文還有配套的精品資源點(diǎn)擊獲取