当位置有多个代码时,需要从邮政编码数据库计算纬度经度

时间:2013-10-07 22:06:43

标签: sql database tsql geocoding postal-code

当给定位置有多个代码时,如何计算邮政编码数据库中给定位置的纬度/经度?例如,纽约市有165个邮政编码。

SQL示例(表格中还有纬度经度列):

SELECT City, [State], StateAbbr, Country, COUNT(*) AS ctCodes
FROM PostalCodes
WHERE (City = 'New York City' AND StateAbbr = 'NY')
GROUP BY City, [State], StateAbbr, Country
ORDER BY ctCodes DESC

返回:

City          | State    | StateAbbr | Country | ctCodes
New York City | New York | NY        | US      | 165

我考虑过计算边界中心的纬度/经度,这有点复杂。请考虑以下问题:

SELECT City, [State], StateAbbr, Country, 
    COUNT(*) AS ctCodes, 
    MIN(Latitude) AS south, 
    MAX(Latitude) AS north,
    MIN(Longitude) AS west,
    MAX(Longitude) AS east
FROM PostalCodes
WHERE (City = 'New York City' AND StateAbbr = 'NY')
GROUP BY City, [State], StateAbbr, Country
ORDER BY ctCodes DESC

返回:

City          | State    | StateAbbr | Country | ctCodes | south  |  north |   west  |  east
New York City | New York | NY        | US      | 165     |40.69640|40.86620|-74.02530|-73.67310

获取边界矩形适用于北美洲,但它显然不适用于南半球或Prime Meridian以东。我走的是正确的道路吗?有一个更好的方法吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

计算边界框或平均纬度坐标对于不在180th meridian上的位置或多或少有效;也就是说,除了在斐济之外,它几乎都在。

包括斐济在内的全球任何地方都可以使用的方法是将坐标转换为3D球体上的点,计算中点,并将中点投影到球体表面。这当然会在计算上更加昂贵。

首先将每个lat-lng对转换为3D笛卡尔坐标:

x = cos(lat)*cos(lng)
y = cos(lat)*sin(lng)
z = sin(lat)

然后通过平均坐标计算中点,得到(x', y', z')。现在将其转换回lat-lng,您将获得中心点的坐标:

  r  = sqrt(x'² + y'² + z'²)
lat' = asin(z'/r)
lng' = atan2(y', x')