19

是否有服务/API 将采用邮政/邮政编码并返回边界(周长)坐标,以便我可以在 MS SQL 数据库中构建几何对象?

通过边界坐标,我的意思是我想检索构建定义美国邮政编码的多边形的 GPS 坐标列表。

4

5 回答 5

56

详细说明我的评论,邮政编码不是多边形......

我们经常将邮政编码视为区域(多边形),因为我们说,“哦,我住这个邮政编码中......”这给人一种包含区域的印象,也许邮政编码代表“区域改进计划”这一事实有助于与多边形的错误关联。

实际上,邮政编码是在某种意义上代表邮递员路线的行。在几何上,线没有面积。正如线是沿坐标平面的点串一样,邮政编码线是USPS 指定地址的抽象空间中的交货点串。

它们与地理坐标无关。但是,您会发现它们似乎是面向地理的,因为运营商拥有完全与距离和位置无关的路线将是低效的。

这个“USPS 指定地址的抽象空间”是什么?这就是我描述美国邮政局维护的庞大而神秘的可交付地点数据库的方式。地址不是根据地理位置分配的,而是根据运营商旅行的路线分配的,这通常与街道和可旅行性有关。

一些 5 位数的邮政编码只是单个建筑物,或建筑物的综合体,甚至是建筑物的单个楼层(是的,多个邮政编码可以位于一个坐标,因为它们的交付点是垂直分层的)。其中一些——除其他外——是“独特的”ZIP。公司和大学经常为营销或组织目的获取自己的邮政编码。例如,邮政编码“12345”属于位于纽约州斯克内克塔迪的通用电气公司。(编辑:在以前版本的谷歌地图中,​​当您点击该链接时,您会注意到放置标记悬停,因为它指向一个邮政编码,而不是坐标。虽然大多数美国邮政编码用于显示谷歌地图上的一个区域,这些类型不能,因为 USPS 不“拥有”它们,可以这么说,

只是为了好玩,让我们尝试验证一个唯一邮政编码中的地址。前往SmartyStreets并在 12345 中输入一个虚假地址,例如:

街道: 999 Sdf sdf

邮编: 12345

当您尝试验证时,请注意...它是有效的!为什么?USPS 将为该唯一邮政编码的容器提供一块,但此时,由 GE 分发它。邮政编码内部的几乎所有内容都与 USPS 无关,包括街道地址(技术上是“交付线 1”)。许多大学以类似的方式运作。这是有关此的更多信息。

现在,尝试使用相同的虚假地址,但没有邮政编码,而是使用城市/州:

街道: 999 Sdf sdf

城市:斯克内克塔迪

州:纽约

它不验证。这是因为即使 Schenectady 包含 12345,地址是“有效的”,它在几何上与 Schenectady 的“真实”邮政编码相交。

再举一个例子:军事。某些海军舰艇有自己的邮政编码。军事地址是使用相同命名空间的完全不同类别的地址。船只移动。地理坐标没有。

ZIP 精度是另一个有趣的。5 位数的邮政编码是最不“精确”的(尽管“特定”一词在这里可能更有意义,因为邮政编码不能精确定位任何东西)。7 位和 9 位邮政编码是最具体的,在市区通常下至街区或街区级别。但是由于每个邮政编码的大小不同,因此很难说出您所说的实际距离。

一个 9 位数的邮政编码可能会分配到建筑物的一层,因此您可能有数百个地址的重叠邮政编码。

底线:与普遍看法相反,邮政编码不提供地理或边界数据。它们差异很大,实际上非常无用,除非您要运送邮件或包裹……但是 USPS 的工作是设计有效的承运人路线,而不是将人口划分为如此多的协调区域。

这更多的是人口普查局的工作。他们编制了一个制图边界列表,因为邮政编码“方便”使用。为此,他们将成串的地址划分为人口普查块。然后,他们汇总了 USPS 邮政编码数据,以找出他们的人口普查区(有一些粗略的坐标数据)与邮政编码之间的关系。因此,我们对将线绘制为多边形的情况有了近似值。(显然,他们通过根据其内容转换 2D 多边形以适应线性数据——对于每个非唯一的常规邮政编码,将 1D 线转换为 2D 多边形。)

从他们的网站(上面的链接):

邮政编码制表区域 (ZCTA) 是一个统计地理实体,它近似于美国邮政服务五位数或三位数邮政编码的投递区域。ZCTA 是人口普查区块的集合,这些区块具有与美国人口普查局主地址文件 (MAF) 中的地址相关联的相同主要邮政编码。三位数 ZCTA 代码适用于美国人口普查局在其 MAF 中没有五位数邮政编码信息的大片连续区域。ZCTA 并未准确描述邮政编码投递区域,也不包括用于邮件投递的所有邮政编码。美国人口普查局已将 ZCTA 建立为一个新的地理实体,类似于但取代了与 1990 年及更早的人口普查相关的邮政编码数据表。

USCB 的数据集不完整,有时甚至不准确。谷歌的数据仍然存在漏洞(12345 是一个很好的例子)——但谷歌最终会通过手工检查每个地址和邮政编码来修补它。他们已经这样做了,但还没有使他们所有的地图数据变得完美。自然,对这些数据的访问仅限于 API 条款,而且提出这些条款非常昂贵。

呸。我被打败了。我希望这有助于澄清事情。免责声明:我曾经是 SmartyStreets 的开发人员。有关使用地址数据进行地理编码的更多信息。

更多关于邮政编码的信息

于 2012-10-29T00:39:23.763 回答
1

您要求的是提供“免费邮政编码地理编码”的服务。有一些质量参差不齐。由于以下几个原因,您自己编写这样的代码会很糟糕:

  1. 邮政编码可以分配给单个建筑物或邮局。
  2. 邮政编码被视为多边形区域。将邮政编码投影到多边形区域将需要您有根据地猜测一个邮政编码和下一个邮政编码之间的边界在哪里。
  3. 邮政编码地址数据仅指定邮政编码的中心位置。邮政编码数据提供地址的大致附近。一个邮政编码和另一个邮政编码之间存在的邮寄地址可能会对其实际所在的邮政编码存在争议。
  4. 邮寄地址在物理上可能更接近邮政编码 11111,但其官方邮政编码是更远的邮政编码点 11112。

谷歌地图有一个地理编码 API:

谷歌地图 API 是客户端 javascript。您可以使用 http 请求直接从 php 查询地理编码系统。然而,谷歌地图只给你美国邮政服务给他们的东西。表示邮政编码中心的点。

https://developers.google.com/maps/#Geocoding_Examples

使用谷歌地图绘制城市/邮政编码多边形

关于将邮政编码投影到其纬度/经度边界框的思考

美国大约有 43,000 个邮政编码。这个数字每个月都会波动,具体取决于所做的更改次数。USPS 使用的邮政编码不表示为多边形,也没有硬性和快速边界。

USPS(美国邮政服务)是定义每个邮政编码纬度/经度的机构。任何将邮政编码解析为地理位置的软件都需要每周更新。一家名为 alignstar 的公司提供邮政编码的人口统计和 GIS 数据 ( http://www.alignstar.com/data.html )。

给定一个物理(邮寄)地址,找到地理坐标以便在地图上显示该位置。

如果您想可靠地预测邮政编码的形状,您将需要强行使用它并询问:“按邮政编码给我每个街道地址”,然后在那些畸形的斑点周围画框。然后,您可以大致了解邮政编码覆盖的地理区域。

http://vterrain.org/Culture/geocoding.html

如果您将数百万个邮寄地址点投入到将每个地址解析为纬度/经度的算法中,您可能能够构建该邮政编码的基本 blob 边界框。你必须重新运行这个算法,理论上它会在邮政编码移动时自行修复。

其他想法

http://shop.delorme.com/OA_HTML/DELibeCCtpSctDspRte.jsp?section=10075

http://www.zip-codes.com/zip-code-map-boundary-data.asp

于 2012-10-28T21:09:13.283 回答
0

我认为这就是您需要它使用美国人口普查作为存储库:美国邮政编码边界 API:https ://www.mashape.com/vanitysoft/boundaries-io

上面的 API 按邮政编码、城市和州显示美国边界(GeoJson)。您应该以编程方式使用 API 来处理大型结果。

在此处输入图像描述

于 2015-06-02T22:51:27.247 回答
0

第一步:下载cb_2018_us_zcta510_500k.zip

https://www.census.gov/geographies/mapping-files/time-series/geo/carto-boundary-file.html

如果你想把它们保存在 mysql 中

第 2 步:在您的 mysql 中创建一个名为 :spatialdata 的数据库,运行此命令 ogr2ogr -f "MySQL" MYSQL:"spatialdata,host=localhost,user=root" -nln "map" -a_srs "EPSG:4683" cb_2018_us_zcta510_500k.shp -overwrite -addfields -fieldTypeToString All -lco ENGINE=MyISAM

我在 github 上上传了文件(https://github.com/sahilkashyap64/USA-zipcode-boundary/blob/master/USAspatialdata.zip

在您的“空间数据数据库”中,将有 2 个名为 map & geometry_columns 的表。

  1. 在“地图”中会有一个名为“形状”的列。

shape 列属于“几何”类型,它包含多边形/多多边形文件

  1. 在“geometry_columns”中将定义 srid

如何检查点是否落在多边形中

SELECT * FROM map WHERE ST_Contains( map.SHAPE, ST_GeomFromText( 'POINT(63.39550 -148.89730 )', 4683 ) )

并想在地图上显示边界

select zcta5ce10as zipcode, ST_AsGeoJSON( SHAPE) sh from mapwhere ST_Contains( map.SHAPE, ST_GeomFromText( 'POINT(34.1116 -85.6092 )', 4683 ) )

"ST_AsGeoJSON" 这会将空间数据作为 geojson 返回。使用http://geojson.tools/ "HERE maps" 检查geojson的形状

如果你想生成topojson

mapshaper 将 shapefile 转换为 topojson(无需将其转换为 kml 文件) npx -p mapshaper mapshaper-xl cb_2018_us_zcta510_500k.shp snap -simplify 0.1% -filter-fields ZCTA5CE10 -rename-fields zip=ZCTA5CE10 -o format=topojson cb_2018_us_zcta510_500k.json

如果要将 shapefile 转换为 kml

`ogr2ogr -f KML tl_2019_us_zcta510.kml -mapFieldType Integer64=Real tl_2019_us_zcta510.shp

我使用mapbox gl显示 2 个邮政编码

  1. 示例:https ://sahilkashyap64.github.io/USA-zipcode-boundary/
  2. 代码:https ://github.com/sahilkashyap64/USA-zipcode-boundary
于 2020-07-26T12:56:08.407 回答
-2

我认为世界 geoJson 链接和谷歌地图地理编码 api 可以帮助你。示例:您可以使用地理编码 api 对 zip 进行编码,您将获得城市、州、国家,然后,您从世界搜索,我们 geoJson获得边界,我有一个美国州边界的示例,如dsdlink

于 2016-02-24T07:07:31.253 回答