有没有一项服务/API可以获取邮政/邮编并返回边界(周长)坐标,以便我可以在MS SQL数据库中构建几何对象?
通过边界坐标,我指的是想要检索构成美国邮政编码定义多边形的GPS坐标列表。
有没有一项服务/API可以获取邮政/邮编并返回边界(周长)坐标,以便我可以在MS SQL数据库中构建几何对象?
通过边界坐标,我指的是想要检索构成美国邮政编码定义多边形的GPS坐标列表。
仅供娱乐,让我们尝试验证一个独特邮政编码中的地址。前往SmartyStreets,输入12345中的虚假地址,例如:
街道地址:999 Sdf sdf
邮政编码:12345
当您尝试验证它时,请注意...它是有效的!为什么?美国邮政服务(USPS)将把一件物品递送到该独特邮政编码的接收器中,但此时,就由GE来分发了。在邮政编码内部的任何内容对USPS都不重要,包括街道地址(技术上称为“交付线1”)。许多大学也以类似的方式运作。这里有更多相关信息。
现在,尝试相同的虚假地址,但不使用邮政编码,而是使用城市/州:
它无法验证。这是因为尽管Schenectady包含12345,地址是“有效的”,但它在几何上与Schenectady的“真实”邮政编码相交。街道地址:999 Sdf sdf
城市:Schenectady
州:NY
美国人口普查局的数据集不完整,有时也不准确。Google的数据仍然存在漏洞(12345是一个比较好的例子),但是Google最终将通过手动检查每个地址和邮政编码来解决这个问题。他们已经在做这件事,但还没有使他们的地图数据完美。自然地,访问此数据受到API条款的限制,并且提高这些费用非常昂贵。
哎呀,我累坏了。希望这能澄清事情。免责声明:我曾经是SmartyStreets的开发人员。有关使用地址数据进行地理编码的更多信息。
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
如果您将数百万个邮寄地址点投入算法中,将每个点解析为纬度/经度,您可能能够构建该邮政编码的基本边界框。您需要重新运行此算法,并且理论上它会在邮政编码数字移动时自我修复。
其他想法
http://shop.delorme.com/OA_HTML/DELibeCCtpSctDspRte.jsp?section=10075
我认为这是你需要的,它使用美国人口普查作为存储库:US Zipcode
边界 API: https://www.boundaries-io.com
上述 API 按邮政编码、城市和州显示美国边界(GeoJson)。你应该以编程方式使用 API 来处理大量结果。
声明:我在这里工作
步骤1:下载cb_2018_us_zcta510_500k.zip文件
https://www.census.gov/geographies/mapping-files/time-series/geo/carto-boundary-file.html
步骤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)
在您的“spatialdata db”中,将有两个名为map和geometry_columns的表。
形状列的类型为“几何”,其中包含多边形/多边形文件
如何检查点是否落在多边形内
SELECT * FROM map WHERE ST_Contains( map.SHAPE, ST_GeomFromText( 'POINT(63.39550 -148.89730 )', 4683 ) )
想要在地图上显示边界
选择zcta5ce10
作为zipcode
,从map
中选择ST_Contains(map.SHAPE, ST_GeomFromText('POINT(34.1116 -85.6092)', 4683))的ST_AsGeoJSON(SHAPE
) sh。
"ST_AsGeoJSON"将空间数据返回为geojson格式。 使用 http://geojson.tools/ "HERE maps" 检查geojson的形状。
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
`ogr2ogr -f KML tl_2019_us_zcta510.kml -mapFieldType Integer64=Real tl_2019_us_zcta510.shp
我使用mapbox gl来显示两个邮政编码区域
SQL Server解决方案
DECLARE @polygon GEOMETRY;
DECLARE @isValid bit = 0;
DECLARE @p nvarchar(2048) = 'POLYGON((-120.1547 39.2472,-120.3758 39.1950,-120.2124 38.7734,-119.6590 38.8162,-119.6342 39.3672,-120.1836 39.2525,-120.1547 39.2472))'
SET @polygon = GEOMETRY::STPolyFromText(@p,4326)
SET @isValid = @polygon.STIsValid()
IF (@isValid = 1)
SET @polygon = @polygon.MakeValid();
SET @isValid = @polygon.STIsValid()
IF (@isValid = 1)
BEGIN
SELECT * FROM cb_2019_us_zcta510_500k
WHERE geom.STIntersects(@polygon) = 1
END
ELSE
SELECT 'Polygon not valid'
我认为世界GeoJson链接和谷歌地图Geocode API可以帮助你。 例如:您可以使用Geocode API对邮政编码进行编码,您将获得城市、州、国家,然后,您可以从世界和美国GeoJson中获取边界,我有一个美国州边界的示例,如dsdlink。