【问题标题】:How to get the bounding coordinates for a US postal(zip) code?如何获取美国邮政编码的边界坐标?
【发布时间】:2012-10-18 06:03:13
【问题描述】:

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

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

【问题讨论】:

  • 您想要一个 API 来获取美国各州或国家/地区的邮政编码边界吗?
  • 状态将无关紧要 - 我正在寻找定义给定邮政编码的坐标序列 - 以便我可以构建一个多边形。
  • 好的...所以用多边形代替线条。我希望每个人都能了解我想要完成的工作。
  • 不方便的是,邮政编码在技术上不是多边形,它们是线......我们绘制的多边形实际上是经常存在缺陷的人工表示。我与 USPS 授权的公司合作以验证地址,我们还进行地理编码。我们不做您正在寻找的事情的一个原因是因为它有时会产生误导。
  • 只是阅读更多内容我只是假设邮政编码代表区域,实际上它们没有。感谢您为我指明正确的方向。如果您将此作为答案发布,我想标记为已解决。

标签: sql-server geocoding geospatial


【解决方案1】:

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

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

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

它们与地理坐标相关。不过,您会发现,它们似乎是按地理定位的,因为如果运营商拥有一条完全与距离和位置无关的路线,那将是低效的。

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

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

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

街道: 999 Sdf sdf

邮政编码: 12345

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

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

街道: 999 Sdf sdf

城市:斯克内克塔迪

州:纽约

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

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

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

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

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

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

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

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

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

呸。我被打败了。我希望这有助于澄清事情。免责声明:我曾经是 SmartyStreets 的开发人员。 More information on geocoding with address data.

Even more information about ZIP codes.

【讨论】:

  • 看起来美国人口普查局改变了您可以获取制图边界的位置。现在可用here
  • @Matt 是否有任何 API 可以从邮政编码/邮政编码返回建筑物的名称。我想只允许住在有公寓的建筑物中的用户在我的应用中注册。
  • @bibscy 如果企业名称已在 USPS 注册,则 CASS 认证的 API 将拥有该信息;不确定建筑名称。如果您只想知道地址是否有次要单元(如公寓、盒子或套房),那么 API 也应该有这些信息。我以前工作的公司有这样一个包含这些信息的 API。
【解决方案2】:

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

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

Google 地图有一个地理编码 API:

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

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

map city/zipcode polygons using google maps

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

美国大约有 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

【讨论】:

  • 感谢您的建议 - 但我并不是真的希望自己构建此服务。我认为也许美国邮政服务(或某些第 3 方)可能会提供一种方法来跟踪邮政编码范围。我找不到它,并希望其他人之前正在调查这个。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    第一步:下载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 zcta5ce10 as zipcode, ST_AsGeoJSON(SHAPE) sh from map where ST_Contains( map.SHAPE, ST_GeomFromText( 'POINT(34.1116 -85.6092 )', 4683 ) )

    "ST_AsGeoJSON" 这会将空间数据作为 geojson 返回。 使用http://geojson.tools/ “这里地图”检查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

    我使用 ma​​pbox gl 显示 2 个邮政编码

    1. 示例:https://sahilkashyap64.github.io/USA-zipcode-boundary/
    2. 代码:https://github.com/sahilkashyap64/USA-zipcode-boundary

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 2019-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多