如何获取美国邮政(zip)代码的边界坐标?

时间:2012-10-28 20:48:59

标签: sql-server geocoding geospatial

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

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

5 个答案:

答案 0 :(得分:48)

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

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

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

它们与地理坐标相关联。但是,你会发现它们出现是地理位置的,因为载体的路线与距离和位置完全无关,效率低。

这是USPS指定地址的抽象空间"?这就是我如何描述由美国邮政局维护的大型神秘的可交付地点数据库。地址不是根据地理位置分配的,而是根据航空公司旅行的路线分配的,这些路线通常与街道和可行驶性有关。

一些5位数的邮政编码只是一栋建筑物或一幢建筑群。这些是"独特的"拉链。公司和大学经常出于营销或组织目的获得自己的邮政编码。例如,the ZIP code "12345" belongs to General Electric在纽约州斯克内克塔迪市。 (编辑:在以前版本的Google地图中,当您点击该链接时,您会注意到展示位置标记正在悬停,因为它指向的是邮政编码,而不是坐标。虽然使用了大多数美国邮政编码要在Google地图上显示某个区域,这些类型不能,因为USPS不会拥有"它们,可以这么说,它们没有区域。)

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

  

街道: 999 Sdf sdf

     

邮政编码: 12345

当您尝试验证时,请注意......它有效!为什么? USPS将为插件提供一个独特的邮政编码,但在那时,由GE来分发它。邮政编码内部的任何内容都与USPS无关,包括街道地址(技术上和#34;交付线1和#34;)。许多大学以类似的方式运作。 Here's more information regarding that.

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

  

街道: 999 Sdf sdf

     

城市: Schenectady

     

状态:纽约

它没有验证。这是因为即使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

答案 1 :(得分:1)

您要求的是提供“免费邮政编码地理编码”的服务。有一些有不同的质量。由于一些原因,你自己编写类似这样的东西的时间会很糟糕:

  1. 邮政编码可以分配到单个建筑物或邮局。
  2. 邮政编码 NOT 被视为多边形区域。将邮政编码投影到多边形区域将需要您进行有根据的猜测,其中边界位于一个邮政编码和下一个邮政编码之间。
  3. 邮政编码地址数据仅指定邮政编码的中心位置。邮政编码数据提供地址的一般附近。一个邮政编码与另一个邮政编码之间存在的邮件地址可能与它实际所在的邮政编码存在争议。
  4. 邮寄地址可能在物理上更靠近邮政编码11111,但其官方邮政编码是一个更远的邮政编码点11112。
  5. Google地图具有地理编码API:

    google maps API是客户端javascript。您可以使用http请求直接从php查询地理编码系统。但是,谷歌地图只能为您提供美国邮政服务所提供的服务。代表邮政编码中心的一个点。

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

    map city/zipcode polygons using google maps

    关于将邮政编码投影到其纬度/长边框的想法

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

    USPS(美国邮政服务)是定义每个拉链码lat / long的权限。任何将邮政编码解析到地理位置的软件都需要每周更新。一家名为alignstar的公司提供了人口统计信息和zipcodes的GIS数据(http://www.alignstar.com/data.html)。

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

    如果你想要可靠地预测邮政编码的形状,你需要强行说出来并问:“通过邮政编码给我每个街道地址”,然后在那些错误的blob周围画框。然后,您可以全面了解邮政编码覆盖的地理区域。

    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

答案 2 :(得分:0)

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

以上API按邮政编码,城市和州显示US Boundaries(GeoJson)。您应该以编程方式使用API​​来处理大量结果。

enter image description here

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

步骤1:下载cb_2018_us_zcta510_500k.zip

documentation

如果要将它们保留在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://www.census.gov/geographies/mapping-files/time-series/geo/carto-boundary-file.html

在您的“ spatialdata db”中,将有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 ) )

并想在地图上显示边界

选择zcta5ce10作为zipcode,从SHAPE中选择ST_AsGeoJSON(map),其中ST_Contains(map.SHAPE,ST_GeomFromText('POINT(34.1116 -85.6092)',4683 )

“ ST_AsGeoJSON”将空间数据作为geojson返回。 使用https://github.com/sahilkashyap64/USA-zipcode-boundary/blob/master/USAspatialdata.zip “ HERE地图”检查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. 示例:http://geojson.tools/
  2. 代码:https://sahilkashyap64.github.io/USA-zipcode-boundary/