我正在創建一個簡單的腳本,需要按用戶的位置查找用戶當前的郵政編碼。我有一個包含所有郵政編碼及其坐標的龐大資料庫。我需要找到離他們位置最近的郵政編碼。該網站是一個 wordpress 網站,所以我正在使用它們的功能。
我嘗試了以下代碼,但不夠準確。它偏離了大約 15-20 英里,并且選擇了錯誤的郵政編碼。
$SQL = $wpdb->prepare(
"SELECT zip, ( abs(lat - %d) abs(lon - %d) ) as distance ".
"FROM {$wpdb->prefix}zipcodes ORDER BY distance LIMIT 1",
$data['lat'], $data['lon']
);
$closest = $wpdb->get_results( $SQL );
uj5u.com熱心網友回復:
如果你有 v5.7 ,那么你可以使用 ST_Distance_Sphere:
https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html#function_st-distance-sphere
我將猜測一個小提琴的實作。看看這個。這些是隨機拉鏈,我只是選擇了一個隨機拉鏈來計算距離。我沒有調整你的php代碼,因為看起來你已經知道如何準備一個陳述句,所以我只是提供了SQL。
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=a851a6539bfd5028c53cf5ad0e1a1f1f
SELECT zip, lon, lat,
ST_Distance_Sphere(
POINT(-86.558882, 34.668212), POINT (lon, lat)
) as dist
FROM zipcodes ORDER BY 4 DESC;
其中 POINT 的引數是 (lon, lat)。
這里是點參考:https : //dev.mysql.com/doc/refman/5.7/en/gis-point-property-functions.html
如果這有幫助,請告訴我。
為了將來參考,您可以在 mysql 編輯器中找到表的 CREATE 陳述句(或者,如果需要,您可以從命令列獲取它們,但誰在使用命令列?)。如果您在問題中提供這些和包含一些示例資料的 INSERT 陳述句以及預期結果,那將使人們更深入地了解您的問題。另外,請提供您的 sql 版本和引擎,因為有些內容是特定于引擎和版本的。
你也可以用這些陳述句設定一個小提琴,讓人們先發制人,但你也應該在問題中包含這些陳述和資料,以防萬一小提琴網站出現故障。
請參閱有關 SQL 問題的最小可重現示例的討論:
為什么我應該為一個非常簡單的 SQL 查詢提供一個最小的可重現示例?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/361091.html
