在Google Map API中创建邮政编码边界

时间:2012-07-13 13:30:04

标签: javascript google-maps google-maps-api-3 zipcode

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

我的任务是获取邮政编码,并在Google地图上向用户显示相应的边界,例如this example

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

有关如何获得此项的任何建议吗?

提前致谢!

3 个答案:

答案 0 :(得分:9)

我知道这并不是一个简单的答案。但这是一个如何做的高级设计。

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

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

答案 1 :(得分:0)

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

这可能看起来很难,但完全平易近人。

如果您搜索,可以为Zipcodes组购买GeoJSON文件。

答案 2 :(得分:0)

从此处https://catalog.data.gov/dataset/tiger-line-shapefile-2019-2010-nation-u-s-2010-census-5-digit-zip-code-tabulation-area-zcta5-na

加载shapefile

使用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的空间参照系的度量单位。由于ZCTAs的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卷创建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

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