ЗАГРУЗИТЕ шейп-файл отсюда https://catalog.data.gov/dataset/tiger-line-shapefile-2019-2010-nation-us-2010-census-5-digit-zip-code-tabulation-area-zcta5-na
Упрощение использования GDAL
Мы можем использовать команду ogr2ogr из библиотеки GDAL для преобразования шейп-файла в geojson, но даже с одним полем и простыми координатами выходной файл превышает 1 ГБ.
ogr2ogr -f GeoJSON -select ZCTA5CE10 -lco COORDINATE_PRECISION=6 zcta.geojson /vsizip/tl_2017_us_zcta510.zip
Я попытался упростить это до topojson, но библиотека topojson задыхается от этого даже на очень мощном MacBook Pro 2017 года.
_2 _ ›› Не хватает памяти для JavaScript
Другой метод, который я пробовал, заключался в использовании параметра -simplify в ogr2ogr. Аргумент упрощения - это единица измерения, основанная на системе пространственной привязки шейп-файла. Поскольку srs для ZCTA - WGS84, единица измерения - это широта / долгота.
ogr2ogr -f "GeoJSON" -lco COORDINATE_PRECISION=6 -select ZCTA5CE10 -simplify 0.006 zcta.geojson /vsizip/tl_2017_us_zcta510.zip
Это создает файл GeoJSON гораздо меньшего размера (30 МБ), который TopoJSON может легко обрабатывать, и в итоге мы получаем более управляемый (но все еще слишком большой) файл topojson размером 13 МБ. Кроме того, топология набора данных очень плохая в средних и крупных масштабах.
npx topojson -q 1e5 -o zcta_topo.json zcta.geojson
Упрощение использования Postgis
Создайте том докера для использования для сохранения тома докера создать postgresql
Запустите докер postgis
docker run --name postgis -p 25432:5432 -it --mount source=postgresql,target=/var/lib/postgresql kartoza/postgis
Загрузите шейп-файл zcta в 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 может выводить TopoJSON прямо из шейп-файла без ошибок кучи памяти JavaScript. Эта команда создает файл topojson размером ~ 6 МБ, который мы можем использовать. Ему также удается очень хорошо поддерживать топологию, предполагая, что очень близкие вершины и ребра должны совпадать.
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
источник: https://github.com/elastic/ems-file-service/issues/6
person
Sahil Kashyap
schedule
26.07.2020