前面介紹了mapshaper的輸入/輸出命令,本節介紹mapshaper的核心內容:編輯命令。編輯命令有很多,下面一一介紹。
1. -clip<裁剪>
移除裁剪范圍外的要素或部分要素。有如下參數:
source:數據源,通過裁剪多邊形的文件名或圖層id指定裁剪的多邊形要素數據集;
bbox=<xmin,ymin,xmax,ymax>:通過bbox指定裁剪的范圍,刪除bbox范圍外的要素或部分要素;
remove-slivers:移除由裁剪產生的極小長條形多邊形;
其他可選項:name和target。
#示例: 使用land-area.shp裁剪usa_counties.shpmapshaper usa_counties.shp -clip land-area.shp -o2. -dissolve<合并>
以指定的屬性合并一組要素,若沒有指定屬性字段,則合并所有要素。對于多邊形圖層,-dissolve 在合并相鄰多邊形時會刪除公共邊界;對于點圖層,-dissolve 合并后得到一組點的質心;-dissolve 不支持線圖層。
<field> :合并依賴的屬性名稱;
weight= :(針對點圖層)指定屬性名稱或JS表達代表各點在生成質心中的權重。例如,如下命令估算美國人口分布的質心:
mapshaper census_tracts.shp -points -dissolve weight=POPULATIONplanar:(針對點圖層)在計算合并后的質心時,將十進制的度坐標當作平面直角坐標看待。默認情況下,mapshaper在3D空間中計算經緯度點的質心);calc=:在合并后的圖層中使用構建的JS函數來創建屬性,詳情參見下面的示例,也可參考 -calc支持的一系列函數;
sum-fields=:合并時求和的字段名稱,多個用逗號分隔;
copy-fields=:合并時復制(保留)的字段,多個用逗號分開;字段值來源于待合并的一組要素中第一個要素的值;
其他可選項:name= 和 target=
# 示例:以屬性STATE合并要素mapshaper counties.shp -dissolve STATE -o states.shp# 示例: 以屬性STATE合并要素,同時計數要素個數、總人口、最大人口和最小人口mapshaper counties.shp -dissolve STATE calc='n = count(), total_pop = sum(POP), max_pop = max(POP), min_pop = min(POP)'3. -dissolve2<合并>
與dissolve類似,但可以用來合并相鄰或重疊的多邊形(考慮拓撲關系),若多邊形不相交且數據量很大,使用dissolve。
4. -each
將JS表達式應用于圖層中的每個要素,用來創建、更新和刪除數據項。數據屬性向本地屬性一樣使用,其他要素級的屬性作為只讀屬性通過this獲取。
建議:當使用bash shell(Mac和linux)時,用單引號(' ')將JS表達式括起來以免shell表達式中的"!”和其他特殊字符。在WIndows中使用命令語句時,用雙引號(" ")將JS表達式括起來。
<exPRession>:應用于每個要素的JS表達式;
where=:用于篩選要素子集的二級JS表達式;
target=:目標圖層;
this屬性:除非特殊說明,否則this屬性只能讀??;
以下適用于所有圖層類型:
this.id:要素的id(數組型,從0開始);
this.properties:要素屬性(可以像本地變量一樣讀寫);
以下只適用于點要素圖層:
this.coordinates:一個或多個由[x,y]構成的數組;
this.x: 點的X坐標,若幾何對象為空則為null,若為多個點的要素,則返回第一個點的X坐標;
this.y: 點的Y坐標或null;
以下只適用于多邊形要素圖層:
this.area:多邊形要素進行任何簡化后的面積;
this.originalArea:多邊形要素沒有進行簡化前的面積;
this.centroidX :質心的X坐標;
this.centroidY: 質心的Y坐標;
this.innerX:內心的X坐標;
this.innerY: 內心的Y坐標;
以下適用于多邊形和線要素圖層:
this.partCount:要素由幾部分構成,單部件要素為1,多部件要素 >1,沒有要素(null)為0;
this.isNull:如果要素沒有幾何要素返回true;
this.bounds:要素的外接多邊形坐標數組,[xmin, ymin, xmax, ymax]的形式;
this.width:bbox的寬度;
this.height:bbox的高度;
說明:1)對于多部件的多邊形,計算的質心是最大環的質心,且不考慮環中的空洞;2)除未投影多邊形的面積利用球面幾何以平方米為單位計算外,其他多邊形的幾何屬性均以平面幾何為基礎進行計算。
示例:
# 創建STATE_FIPS和AREA兩個字段mapshaper counties.shp -each 'STATE_FIPS=COUNTY_FIPS.substr(0, 2), AREA=this.area'# 刪除STATE_NAME和GEOID兩個字段mapshaper states.shp -each 'delete STATE_NAME, delete GEOID'# 字段重命名mapshaper states.shp -each 'STATE_NAME=NAME, delete NAME'# 打印NAME屬性mapshaper states.shp -each 'console.log(NAME)'# 為每個要素指定一個新的數據項mapshaper states.shp -each 'this.properties = {FID: this.id}'5. -erase<擦除>
移除落在多邊形范圍內的要素或部分要素。
<source>:包含移除多邊形的文件或圖層,以文件名或圖層id代表移除多邊形;
bbox=<xmin,ymin,xmax,ymax>:通過bbox指定擦除的范圍,刪除bbox范圍內的要素或部分要素;與 -clip bbox= 類似;
remove-slivers:移除由擦除產生的極小長條形多邊形;
其他可選項:name和target。
#示例: 刪除usa_counties.shp中在lakes.shp范圍內的要素mapshaper usa_counties.shp -erase lakes.shp -o6. -explode<打散>
將多部件要素拆分成幾個獨立的要素。
7. -filter<過濾要素>
使用boolean類型的JS表達式移除不滿足條件的要素。
<expression>:結果為true或false的JS表達式,與 -each的使用場景一致;
remove-empty:刪除幾何要素為空的要素,可以單獨使用或與expression組合使用;
其他可選項:name 和 target。
#示例: 從usa_counties.shp中選擇 STATE字段中包含 ME、VT、NH、MA、CT、RT的要素,并輸出為ne_counties.shpmapshaper usa_counties.shp -filter '"ME,VT,NH,MA,CT,RI".indexOf(STATE) > -1' -o ne_counties.shp8. -filter-fields<過濾屬性>刪除屬性表中的屬性,保留列出的屬性,多個屬性之間用逗號分隔。
其他可選項:<fields> target=
# 示例: 刪除states.shp中的屬性,只保留FID和NAMEmapshaper states.shp -filter-fields FID,NAME9. -filter-islands<過濾孤島/環>移除小的獨立的環狀多邊形或孤島。
<min-area>=:移除小面積的孤島設置的閾值;
<min-vertices>:移除節點數量少的孤島設置的閾值;
<remove-empty>:刪除幾何對象為空的要素。
10. -filter-silvers<過濾面積>
通過面積過濾多邊形小碎片。
min-area=:移除的面積閾值;
remove-empty:刪除幾何對象為空的要素。
11. -graticule<格網>
創建以經度0度為中心、覆蓋全球的格網圖層。
12. -innerlines<共享邊界>
創建由共享邊界構成的線裝圖層,沒有屬性數據。
其他可選項: name= 和 target=
# 示例: 提取兩個州共享的邊界mapshaper states.shp -filter 'STATE=="OR" || STATE=="WA"' -innerlines -o未完待續...
新聞熱點
疑難解答