在此处下载shapefilehttps://catalog.data.gov/dataset/tiger-line-shapefile-2019-2010-nation-u-s-2010-census-5-digit-zip-code-tabulation-area-zcta5-na
使用GDAL进行简化
我们可以使用GDAL库中的ogr2ogr命令将shapefile转换为geojson,但即使只有一个字段和简单坐标,输出文件也超过1GB。
ogr2ogr -f GeoJSON -select ZCTA5CE10 -lco COORDINATE_PRECISION=6 zcta.geojson /vsizip/tl_2017_us_zcta510.zip
我试图将其简化为topojson,但即使是在非常强大的2017 MacBook Pro上,topojson库也无法处理它。
npx topojson -q 1e4 -o zcta_topo.json zcta.geojson
>> JavaScript head out of memory
我尝试的另一种方法是使用ogr2ogr中的-simplify选项。简化参数是基于shapefile的空间参考系统的度量单位。由于ZCTAs的srs是WGS84,因此单位是lat/lon度量。
ogr2ogr -f "GeoJSON" -lco COORDINATE_PRECISION=6 -select ZCTA5CE10 -simplify 0.006 zcta.geojson /vsizip/tl_2017_us_zcta510.zip
这将创建一个更小的GeoJSON文件(30MB),TopoJSON可以轻松处理,我们最终得到一个更易于管理(但仍然太大)的13MB topojson文件。此外,在中等到大规模上,数据集的拓扑结构非常差。
npx topojson -q 1e5 -o zcta_topo.json zcta.geojson
使用Postgis进行简化
创建一个docker卷以用于持久性
docker volume create postgresql
运行postgis docker
docker run --name postgis -p 25432:5432 -it --mount source=postgresql,target=/var/lib/postgresql kartoza/postgis
将zcta shapefile加载到postgis中
ogr2ogr -f "PostgreSQL" -progress -select "ZCTA5CE10" -overwrite -lco OVERWRITE=yes -nln zcta -nlt PROMOTE_TO_MULTI -t_srs "EPSG:4326" PG:"dbname='gis' host='localhost' port='25432' user='docker' password='docker'" ~/Downloads/tl_2017_us_zcta510/tl_2017_us_zcta510.shp
使用st_simplifypreservetopology的示例查询(新英格兰地区)。这需要很长时间才能运行整个国家,而且我们仍然会失去很多拓扑结构。
select st_simplifypreservetopology(wkb_geometry, 0.025) as thegeom, zcta5ce10 from zcta where zcta5ce10 like '0%' OR zcta5ce10 like '1%'
使用Mapshaper进行简化(最佳解决方案)
Mapshaper库可以直接从shapefile输出TopoJSON,而不会出现JavaScript内存堆错误。此命令创建一个约6MB的topojson文件,我们可以使用它。它还通过假定非常接近的顶点和边应该是重合的来保持拓扑结构非常好。
npx -p mapshaper mapshaper-xl tl_2017_us_zcta510.shp snap -simplify 0.1% -filter-fields ZCTA5CE10 -rename-fields zip=ZCTA5CE10 -o format=topojson zcta_mapshaper.json
npx -p mapshaper mapshaper-xl tl_2017_us_zcta510.shp snap -simplify 0.1% -filter-fields ZCTA5CE10 -rename-fields zip=ZCTA5CE10 -o format=topojson zcta_mapshaper.json
source:https://github.com/elastic/ems-file-service/issues/6