mapshaper系列之四 - 编辑命令
前面介绍了mapshaper的输入/输出命令,本节介绍mapshaper的核心内容:编辑命令。编辑命令有很多,下面一一介绍。
1. -clip<裁剪>
移除裁剪范围外的要素或部分要素。有如下参数:
source:数据源,通过裁剪多边形的文件名或图层id指定裁剪的多边形要素数据集;
bbox=<xmin,ymin,xmax,ymax>:通过bbox指定裁剪的范围,删除bbox范围外的要素或部分要素;
remove-slivers:移除由裁剪产生的极小长条形多边形;
其他可选项:name和target。
#示例: 使用land-area.shp裁剪usa_counties.shp
mapshaper usa_counties.shp -clip land-area.shp -o
2. -dissolve<合并>
以指定的属性合并一组要素,若没有指定属性字段,则合并所有要素。对于多边形图层,-dissolve 在合并相邻多边形时会删除公共边界;对于点图层,-dissolve 合并后得到一组点的质心;-dissolve 不支持线图层。
<field> :合并依赖的属性名称;
weight= :(针对点图层)指定属性名称或JS表达代表各点在生成质心中的权重。例如,如下命令估算美国人口分布的质心:
mapshaper census_tracts.shp -points -dissolve weight=POPULATION
planar:(针对点图层)在计算合并后的质心时,将十进制的度坐标当作平面直角坐标看待。默认情况下,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)'
与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 -o
6. -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.shp
mapshaper usa_counties.shp -filter '"ME,VT,NH,MA,CT,RI".indexOf(STATE) > -1' -o ne_counties.shp
8. -filter-fields<过滤属性>
删除属性表中的属性,保留列出的属性,多个属性之间用逗号分隔。
其他可选项:<fields> target=
# 示例: 删除states.shp中的属性,只保留FID和NAME
mapshaper states.shp -filter-fields FID,NAME
9. -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
13. -join<连接>
将源图层或文件的属性数据连接到目标图层,如果 为连接字段关键字(keys=)指定有值,mapshaper通过匹配关键字的值进行记录连接,如果没有指定值,mapshaper执行点到多边形或多边形到点的空间连接。
<file|layer>: 包含属性数据记录的文件或图层;
keys:目标图层和源数据连接的关键字,用逗号分隔,目标图层的关键字在前,数据源的关键字在后;如果没有指定连接关键字,则执行空间连接;
calc=:使用JS表达式和内置函数对源数据表中的值进行计算后填入目标数据表格中;支持的计算函数详见命令 -calc,这对处理多对一的连接非常有用;
where=:使用返回值为boolean的JS表达式过来源数据表中的记录,与 命令-filter中的表达式有相同的语法;函数 isMax(<field>)、isMIn(<field>)和isMode(<field>)可在多对一的连接中对源数据记录进行筛选;
fields=:从外部数据表中复制到目标图层中的字段集合,多个用逗号分隔;如果fields= 选项缺失,除连接字段外的所有属性均复制到目标图层中;
sum-fields:若源数据表中的多个记录对应相同的目标记录,需要求和的字段,多个用逗号分隔;
field-types:当连接的数据源是csv或其他限定的文本数据文件时,字段数据类型提示信息,以逗号分隔,可参考前文 -i中的 field-types=;
force:若目标数据表与源数据表有同名的属性,允许使用源数据表中的值覆盖目标数据表中同字段的属性值;
unjoined:将源数据表中未连接的记录复制到命名为 unjoined 的图层中;
unmatched:将目标数据表中未匹配上的记录复制到命名为 unmatched 的图层中;
其他可选项: encoding= 和 target=。
#示例:将点图层与多边形图层进行空间连接,使用 calc= 对多对一的情况进行处理
mapshaper states.shp -join points.shp calc='median_score = median(score), mean_score = average(score), join_count = count()'
#示例:将txt文本中的数据连接到states.shp的属性表中,连接字段为STATES_FIPS和文本中的FIPS(字符串)
mapshaper states.shp -join demographics.txt keys=STATE_FIPS,FIPS:str
14. -lines<边界>
提取多边形的边界(包含拓扑关系)。如果没指定参数,外部边界(不共享部分)在属性表中的TYPE属性中标记为0,内部边界(共性部分)标记为1。...
<fields>:(可选属性)逗号分隔的属性集;
其他可选项:name= 和 target=。
# 示例:提取并区分国界、州界和县界
mapshaper counties.shp -lines STATE_FIPS -o boundaries.shp
15. -merge-layers<融合>
将几个图层的多个要素融合到一个图层中,仅适用于具有相同几何类型和属性表的图层。
其他可选项:name= 和 target=。
#示例:将分离的多个州图层文件融合到太平洋州图层中, -i combine-files用来说明图层文件在默认情况下是单独处理的
mapshaper -i OR.shp WA.shp CA.shp AK.shp combine-files \
-merge-layers \
-o pacific_states.shp
16. -point-grid<格网点>
17.-points<点图层>
#示例
#以每个多边形的内心创建点图层
mapshaper counties.shp -points inner -o points.shp
# 以每个多边形的内心创建点图层 (-each方法可选)
mapshaper counties.shp -each 'cx=this.innerX, cy=this.innerY' -points x=cx y=cy -o points.shp
#示例
# 利用proj4字符串,将geojson文件转换为New York Long Island飞机坐标
mapshaper nyc.json -proj +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 \
+lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m \
-o
# 将投影的shapefile文件转换为WGS84
mapshaper area.shp -proj wgs84 -o
重命名数据属性名称,需要重新命名的多个属性之间用逗号分隔,将属性A重命名为B,使用等号表达式:B=A。
#示例:
#: 将STATE_FIPS重命名为 FIPS ,STATE_NAME重命名为NAME
mapshaper states.shp -rename-fields FIPS=STATE_FIPS,NAME=STATE_NAME
#示例
# 重命名图层名称,并将两个图层合并后数据输出为topojson文件mapshaper ne_50m_rivers_lake_centerlines.shp ne_50m_land.shp combine-files \ -rename-layers water,land -o layers.topojson
21. -simplify<简化>
#示例
# 使用默认的简化方法,保留10%的可移除点mapshaper counties.shp -simplify 10% -o# 使用Douglas-Peucker简化,阈值设置为100.mapshaper states.shp -simplify dp interval=100 -o simplified/
#示例
# 依据字段STATE对要素进行分类并分别输出成geojson文件,输出图层的名称为:源数据层名称-属性值
#如states-AK.json, states-AL.json等mapshaper states.shp -split STATE -o format=geojson# 依据字段STATE对要素进行分类并分别输出成geojson文件,输出图层的名称为为:属性值.# 如 AK.json, AL.json等mapshaper states.shp name='' -split STATE -o format=geojson# 将所有要素拆分成独立的要素并输出层geojson文件 (没有指定属性名称),输出图层的名称为为:图层名称-升序数字,#如states-1.json, states-2.json等.mapshaper states.shp -split -o format=geojson
#示例
#将人口普查数据集聚成人口数量大于1000000,面积大于00 sq km -subdivide "sum('POPULATION') >= 1000000 && sum('this.area') > 1e8" \ -dissolve sum-fields=POPULATION -o merge-layers tract_groups.shp -i census_tracts.shp
#示例
#保留多部件中面积最大的部分mapshaper polygons.shp \ -each 'fid = this.id' \ -explode \ -sort 'this.area' descending \ -uniq 'fid' \ -o