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

Posted

技术标签:

【中文标题】当位置有多个代码时,需要从邮政编码数据库中计算纬度经度【英文标题】:Need to calculate latitude longitude from postal code database when location has multiple codes 【发布时间】:2013-10-07 22:06:43 【问题描述】:

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

SQL示例(表中还有LatitudeLongitude列):

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

获取边界矩形适用于北美,但显然不适用于南半球或本初子午线以东。我走在正确的道路上吗?有一个更好的方法吗?任何帮助将不胜感激。

【问题讨论】:

你能平均给定城市的所有坐标吗?这在全球任何地方都行不通吗? 有趣...我不确定这会奏效如何,我不得不承认我从未想过。 我曾经经历过这种痛苦……你会发现建筑物的不同楼层会有自己的邮政编码。有一些“形状”文件将这些区域(或类似的区域细分)包含为多边形,这些多边形比这样的边界框工作得好得多……当它已经免费存在于网络上时,为什么还要工作? :) 然后你在多边形中找到一个点。您在哪个数据库中工作?...地理编码因数据库而异。 我不记得我在哪里得到了数据库...几年前我免费下载了它,它在全球范围内。我只需要让某些东西工作起来,直到我们有时间更好地拨入它,或者可以将其卸载到服务中。 【参考方案1】:

计算边界框或平均经纬度坐标或多或​​少适用于不在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')

【讨论】:

好的,所以如果我明白这一点,我将获取每个坐标(NW、NE、SE、SW)并将它们转换为 3D 笛卡尔坐标(看起来很简单)。但是你所说的“平均坐标,给出(x',y',z')”是什么意思,我是否对 4 个点中的每一个点的 X 进行平均,并对其他 3 个点做同样的事情,这会给我 X( 1), Y(1), Z(1)? 是:分别平均 x、y 和 z。如果您计算所有点的平均值,而不仅仅是边界框的 4 个角点,您可能会得到更好的结果。 您的意思是计算每个邮政编码的笛卡尔坐标? 是的;您可以在数据库中完成所有这些操作。

以上是关于当位置有多个代码时,需要从邮政编码数据库中计算纬度经度的主要内容,如果未能解决你的问题,请参考以下文章

计算我的位置与多个位置之间的距离

如果我有他们的纬度/经度位置,我如何找出用户的邮政编码?需要帮助编写查询

如何从当前位置找到最近的经纬度?

从纬度,经度获取邮政编码

Tableau 地图

Tableau 地图