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)'


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 -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<格网点>

创建一个矩形格网点图层。
<cols, rows>:设置网格行列数,如-points-grid 100,100;
interval=:相邻点间的距离,单位与数据源单位保持一致(是设置行列数的备选方案);
bbox=:设置格网点的范围(xmin,ymin,xmax,ymax)。默认为其他数据图层的范围,若没有数据层则为全球范围;
name=:设置各网点图层名称。

17.-points<点图层>

从几何多边形或属性表的值中创建点图层。
x=:包含x坐标值的列名称;
y=:包含y坐标值的列名称;
centroid:以每个多边形要素最大环的质心创建点,点的位置一般不受洞的影响;
inner:以每个多边形要素最大环的内心创建点,内心点远离多边形边界;
其他可选项:name= + target=
#示例
#以每个多边形的内心创建点图层 
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
18. -proj<投影>
使用proj4字符串或别名投影数据集(可以利用-projections命令列出所有可用的投影方式),这个命令对数据集中的所有图层均有影响。
densify:沿直线段插值节点以拟合近似曲线;
from=:如果源数据的坐标系未知,可预定义其坐标系统,如果源数据的坐标系统已通过一个 .proj文件定义,或是WGS84坐标,则该选项不需要。
#示例
# 利用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
19.-rename-fields<重命名字段名>

重命名数据属性名称,需要重新命名的多个属性之间用逗号分隔,将属性A重命名为B,使用等号表达式:B=A。

其他可选项:<field> target=
#示例:
#: 将STATE_FIPS重命名为 FIPS ,STATE_NAME重命名为NAME
mapshaper states.shp -rename-fields FIPS=STATE_FIPS,NAME=STATE_NAME
20.-rename-layers<重命名图层名>
为图层指定新的名称,如果给定的名字少于图层数,列出的最后一个名字以数字结尾的方式重复。
<names>:一个或多个图层名称,多个名称之间以逗号分隔;
target=:重命名数据集的所有图层。
#示例
# 重命名图层名称,并将两个图层合并后数据输出为topojson文件mapshaper ne_50m_rivers_lake_centerlines.shp ne_50m_land.shp combine-files \  -rename-layers water,land -o layers.topojson 
21. -simplify<简化>
Mapshaper支持Douglas Peucker简化和两种折线简化。
Douglas-Peucker通过保留距离原始线一定距离的线的方式产生简化线,它对于缩减高密度节点非常有效,但在高度简化中可能形成尖角。
折线简化以迭代的方式从线上移除最不重要的点。点的重要性通过非端点与两条相邻边形成的几何三角形来度量。折线简化选项使用有效面积度量——形成更小面积三角形的点首先被移除
Mapshaper的默认使用Visvalingam简化,但度量每个点的有效面积使小角度的顶点首先被移除,达到平滑的效果。
当作用于多个多边形和线图层时,simplify命令作用于所有图层。
可选项:
<percentage>:移除点的比例,有效值在0%-100%或0-1范围内;
dp:使用Douglas Peucker简化;
visvalingam:使用visvalingam简化,利用有效面积度量;
weighted:使用权重visvalingam简化(这是默认选项),为了达到平滑的效果,更多锐角位置的点首先被移除;
weighting=:visvalingam简化的加权系数(默认值0.7),值越大平滑效果越好,weighting=0等价于没有加权的visvalingam简化;
resolution=:控制简化数量的输出分辨率,如1000*800;
interval=:以距离为单位指定简化数量,在3D空间中简化未投影的数据集时以米为单位,否则单位与源数据一致;
planar:默认情况下,在3D空间中(使用地理x,y,x坐标),mapshaper使用十进制度进行简化,在笛卡尔平面坐标中,将lng、lat坐标当成x,y坐标来处理。
keep-shapes:在高度简化中,防止多边形失去原有形状,在多部件要素中,mapshaper通过最大原始范围保留各个部分;
no-repair:默认的,mapshaper简化的回滚是沿着相交的一对直线段进行,通过重新引入移除的点直到相交点消失或没有更多点添加,这个选项禁止交叉修复。
stats:显示简化路径几何的摘要统计。
#示例
# 使用默认的简化方法,保留10%的可移除点mapshaper counties.shp -simplify 10% -o# 使用Douglas-Peucker简化,阈值设置为100.mapshaper states.shp -simplify dp interval=100 -o simplified/
22.-sort<排序>
使用JavaScript表达式对数据图层中的要素进行排序。
<expression> 将JavaScript表达式应用于每个要素,利用结果对要素排序。与命令-each有相同的执行环境。
ascending:升序排列(默认);
descending:降序排列。
target
23.-split<分类输出>
依据属性表中的值对目标图层中的要素进行分类并输出到不同的图层中,如果没有指定属性字段,每个要素都被拆分到独立的图层中。
<field>:属性字段名称;
其他选项:+ target=
#示例
# 依据字段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
24. -split-on-grid<格网分开输出>
利用指定行列数的格网单元将要素分成不同的图层,在大数据量的数据集划分成较小的数据文件时非常实用,这样可以动态地图交互部分的数据。使用 -o bbox-index从shape中导出一个包含名称和范围文件。
<cols, rows>:格网的大小,如 -split-on-grid 12,10
其他可选项:target=
25.-subdivide<分类要素>
使用结果为boolean型的JavaScript表达式递归地分离图层。JS表达式首先对图层中的所有要素进行评估,如果返回true,依据集聚范围(bbox)是相对的高度或宽度,对要素在水平或垂直方向想进行空间分段。
表达式可以调用几个函数作用于一组要素,sum()函数将要素级表达式作为参数,并在将表达式应用于每个要素后返回合计的结果。相似函数包括min()、max()、average()和median()。
其他可选项:<expression> target=
#示例
#将人口普查数据集聚成人口数量大于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
26.-svg-style
为SVG输出和Web UI中的展示增加普通的样式属性,样式选项采用原意的值或JS表达式,JS表达式的帮助参见-each命令。
class=:一或多个css类,用空格分开,如 class="light semi-transparent";
fill=:填充颜色,如 #eee pink rgba(0, 0, 0, 0.2);
stroke=: 边框颜色;
stroke-width=:边框宽度;
opacity=:符号透明度,如 opacity=0.5;
r=:圆半径(点要素作为圆导出);
其他可选项: target=
27.-target
设置默认的目标图层。
<target>:名称或图层id,第一个图层id为1.
28.-uniq<删除重复>
删除与前面要素具有相同id的要素。
<expression>:获取要素id的JS表达式,与-each具有相同的语法。
target=
#示例
#保留多部件中面积最大的部分mapshaper polygons.shp \    -each 'fid = this.id' \    -explode \    -sort 'this.area' descending \    -uniq 'fid' \    -o
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
类似mapshaper的网站有很多,以下是几个常用的: 1. Mapbox Studio:Mapbox Studio是一个专业级在线地图制作工具,它允许用户加载和编辑地理数据,创建自定义的地图样式,并在网页上进行可视化显示。它提供了许多类似于mapshaper的功能,例如矢量数据的导入和导出、数据简化、拓扑修复等。 2. QGIS Cloud:QGIS Cloud是一个基于QGIS的在线地理信息系统,它提供了类似于mapshaper的数据处理和地图制作功能。用户可以上传矢量数据,并使用其中的工具对数据进行编辑、简化、裁剪等操作,并生成自定义样式的地图。 3. ArcGIS Online:ArcGIS Online是由Esri开发的一个在线地理信息系统平台,它提供了丰富的地理数据处理和地图制作功能。用户可以利用ArcGIS Online上传、编辑、分析和可视化地理数据,并生成定制化的地图。其中的ArcGIS Pro软件还提供了类似于mapshaper的数据编辑和简化工具。 4. Carto:Carto是一个在线地图制作和数据分析平台,它提供了类似于mapshaper的数据导入、编辑和简化功能。用户可以在Carto上上传矢量数据,并使用其中的工具对数据进行处理和可视化,其中的SQL分析功能还可以对数据进行查询和筛选。 以上只是一些常用的类似于mapshaper的网站,根据具体的需求和使用习惯,用户可以选择适合自己的平台进行地图制作和数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值