当给定位置有多个代码时,如何计算邮政编码数据库中给定位置的纬度/经度?例如,纽约市有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以东。我走的是正确的道路吗?有一个更好的方法吗?任何帮助将不胜感激。
答案 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')