14

我已经看到了对类似问题的所有回复,但是,它们要么都是旧的,要么没有人回答过。

我的任务是获取邮政编码并在谷歌地图上向用户显示其对应的边界,就像在这个例子中一样。

我正在用 Javascript 编写此代码并使用 Google Maps API。我希望用户输入一个邮政编码,然后一个标记下拉到他们的目的地,并带有一个代表该邮政编码区域的边框。我看到谷歌地图目前在他们的地图代码中有一些东西,如果有人在 maps.google.com 上输入邮政编码,就可以看到边界。我使用过多边形,但这无助于在某个邮政编码周围制作边框。

关于如何获得这个的任何建议?

提前致谢!

4

3 回答 3

9

据我所知,对此没有一个简单的答案。但这里是如何做到这一点的高级设计。

邮政编码的所有形状文件都可以在人口普查网站上找到,并且可以从这个 ftp 服务器下载。但是,这是大量数据,因此您需要一个地方来存储它。我建议使用带有 PostGIS 插件的 PostgreSQL 数据库。它是免费和开源的,而且通常很棒。它具有将 .shp 文件(人口普查形状文件中的类型)转换为 PostGIS 几何形式的实用程序。PostGIS 让您以 KML 形式检索形状。

您可以 a) 在需要时以 KML 形式从数据库中检索形状并将其显示在地图上,或者 b) 提前为每个邮政编码预先生成一个 kml 文件并在需要时检索一个文件(这将占用相当多的空间)。

于 2012-07-13T13:56:39.197 回答
0

您需要熟悉 GeoJSON 格式的 FeatureCollections。您可以使用 OpenLayers(或者也可能是 Google API)在任何一组地图图块上渲染它们

这可能看起来很难,但完全可以接受。

如果您四处搜索,您可以购买邮政编码组的 GeoJSON 文件。

于 2016-02-24T11:33:25.190 回答
0

从这里下载 shapefile https://catalog.data.gov/dataset/tiger-line-shapefile-2019-2010-nation-us-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 内存不足

我尝试的另一种方法是在 ogr2ogr 中使用 -simplify 选项。简化参数是基于 shapefile 的空间参考系统的测量单位。由于 ZCTA 的 srs 是 WGS84,因此单位是纬度/经度度量。

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

来源:https ://github.com/elastic/ems-file-service/issues/6

于 2020-07-26T09:33:02.647 回答