1

特定の場所に複数のコードがある場合、郵便番号データベースから特定の場所の緯度/経度を計算するにはどうすればよいですか? たとえば、ニューヨーク市には 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

北アメリカでは外接する長方形を取得できますが、南半球や本初子午線の東では明らかに機能しません。私は正しい道を進んでいますか?これを行うより良い方法はありますか?どんな助けでも大歓迎です。

4

1 に答える 1

2

境界ボックスの計算または緯度と経度の座標の平均化は、 180 度子午線上にない場所に対して多かれ少なかれ機能します。つまり、フィジー以外のほとんどどこにでもあります。

フィジーを含む地球上のどこでも機能するアプローチは、座標を 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')
于 2013-10-08T00:06:02.877 に答える