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

14

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

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

我正在使用JavaScript编写此代码并使用Google Maps API。我希望用户输入一个邮政编码,然后一个标记会出现在他们的目的地,并以边框表示该邮政编码区域。我发现Google Maps目前在其地图代码中有一个功能,允许人们在maps.google.com上放置邮政编码时查看边界。我已经使用了多边形,但这不能帮助绘制某个特定邮政编码周围的边框。

有什么建议吗?

提前致谢!


你有没有试图观察谷歌是如何使用他们自己的页面和API来完成这个任务的? - Lee Taylor
是的,我找到的很多东西都是文章之类的。另一篇帖子说他们使用Twitter API,但我找不到那个特定的API。 - njavia66
我刚刚与Digital Map Products的销售人员通话,咨询了他们的ParcelStream服务是否可行,并且他们告诉我Google是他们的客户之一(该服务每月约10,000美元)。 - johntrepreneur
3个回答

9
这个问题没有一个简单的答案。但以下是一个高级设计,可以帮助你完成它。
所有邮政编码的形状文件都可以在普查网站上找到,并且可以从此FTP服务器下载。然而,这是大量数据,所以你需要一个地方来存储它。我建议使用PostgreSQL数据库和PostGIS附加组件。它是免费和开源的,通常很棒。它有一个实用程序,可将.shp文件(普查形状文件中的一种类型)转换为PostGIS几何形式。PostGIS让你把形状作为KML检索回来。
你可以要么a)在需要时从数据库中检索形状作为KML并在地图上显示它,或者b)提前为每个邮政编码生成一个kml文件,并在需要时检索文件(这将占用相当多的空间)。

哦,听起来好像是一个漫长的过程!:-/ 我实际上有一个装满邮政编码等内容的 Excel 文件,我可以要求用户输入邮政编码,然后在邮政编码中心放置一个标记。难道没有避免使用 KML 的方法吗? - njavia66
@马克:请注意,美国人口调查局提供的不是USPS定义的邮政编码。而是ZCTA或“邮政编码制表区”。http://www.census.gov/geo/ZCTA/zcta.html - Marcelo
@Mark - 我看到redfin.com(房地产网站)不仅为输入的邮政编码添加边界,而且还以某种方式为单个属性/地块添加边界。在此redfin链接上,单击房屋图钉,然后单击右侧的“快速地图”,然后注意物业地址周围的多边形。推荐的解决方案是否也有用于单个地块/属性的多边形? - johntrepreneur
@Marcelo - 你能否也对我的先前评论发表意见?我也想听听你的反馈。谢谢! - johntrepreneur
1
@Mark - 我在这里发布了另一个问题(https://dev59.com/GHLYa4cB1Zd3GeqPUzZk),如果您想要更多信息或者回答它的话。 - johntrepreneur
显示剩余6条评论

0
你需要熟悉GeoJSON格式的FeatureCollections。你可以使用OpenLayers(或可能也可以使用Google API)在任何一组地图瓦片上呈现它们。
这可能看起来很难,但是完全可行。
如果你搜索一下,你可以购买Zipcodes组的GeoJSON文件。

0

在此处下载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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接