各郵便番号の中央の緯度と経度を含む郵便番号の表があります。私はそれを使用して、任意のポイントから半径1マイル以内の郵便番号のリストを取得します。
ジッパーの中心点が特定の半径内にないからといって、ジップ自体が半径内にないということにはならないということが、私に思い浮かんだばかりです。
超高度なアートスキルを使用して、ここでポイントを説明しました。
緑のストライプのブロブは、郵便番号A、B、Cを表しています。
赤い汚れは各郵便番号の地理的中心です
フクシアドットはターゲットの場所です。
でこぼこの青い円は、ターゲットの場所から半径1マイルです。
ピンク色の汚れから半径1マイル以内のすべての郵便番号に対してクエリを実行すると、ピンク色の汚れ自体であっても、郵便番号BとCのみが返されます。郵便番号Aの中心点は半径1マイル以内にないためです。明らかに郵便番号Aです。
SELECT *,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.y))
* COS(RADIANS(p.longpoint) - RADIANS(z.x))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.y)))) AS dist
FROM standard_zip AS z
JOIN ( /* these are the query parameters */
SELECT $lat AS latpoint, $lng AS longpoint,
$miles AS radius, 69 AS distance_unit
) AS p ON 1=1
WHERE z.y
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint + (p.radius / p.distance_unit)
AND z.x
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY dist
結果にzip Aを含めるクエリを作成するにはどうすればよいですか。
必要に応じてテーブルに追加できる郵便番号ごとに空間/ジオメトリにアクセスできますが、MySQLでこの目的にどのように使用するかわかりません。
編集:空間データのOracleとMySQLのドキュメントを1日読んで、空間データをMySQLに正常に変換することができました。緯度と経度の代わりにジオメトリ列を使用する同様のクエリを作成するにはどうすればよいですか?2Dデータを使用しています。ジオメトリはポリゴンとマルチポリゴンのみです。
私はそれを理解したと思う。
select
*
from
(
select
MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
zip
from
zip_spatial
group by
zip
order by
miles asc
) d
where
d.miles < 5
誰かがより良い、より効率的なソリューションを持っている場合に備えて、私は今のところバウンティを開いたままにしておきます。