PHP/MySQL:選択のあり方を一新させる可能性のある与えられた場所からDB
-
23-08-2019 - |
質問
PHP、以下のコードの算定の距離の場所:
<?php
function distance($lat1, $long1, $lat2, $long2) {
// DEGREE TO RADIAN
$latitude1 = $lat1/180*pi();
$longitude1 = $long1/180*pi();
$latitude2 = $lat2/180*pi();
$longitude2 = $long2/180*pi();
// FORMULA: e = ARCCOS ( SIN(Latitude1) * SIN(Latitude2) + COS(Latitude1) * COS(Latitude2) * COS(Longitude2-Longitude1) ) * EARTH_RADIUS
$distance = acos(sin($latitude1)*sin($latitude2)+cos($latitude1)*cos($latitude2)*cos($longitude2-$longitude1))*6371;
return $distance;
}
echo distance(9.9921962, 53.5534074, 9.1807688, 48.7771056); // Hamburg, DE - Stuttgart, DE
?>
しかし、今しなければいけませんこの機会にお気に入りの指定場所によPHPからMySQLデータベース:
- ユーザ故郷
- 私のスクリプトを取得します緯度-経度値のGoogle API
- 私のデータベース、約200箇所の緯度-価値分野の経度値
- いコードでPHPとMySQLを選択し、10箇所に最も近いユーザーのふるさと
かんでいただけたでしょうか助けてくれます。感謝。
解決
MySQLのあなたが必要な正確に何をしの大圏距離(半正矢式)ます。
あなたにもちょうどそれらすべてをロードし、コードでそれらを確認することが唯一の200レコードを持ちます。データセットは、コードまたは他のそのような最適化の対データベースについてはあまり心配することは本当にあまりにも小さいです。
のカップルを有するのPHPで郵便番号との間の距離を計算しますこのアルゴリズムのPHP実装ます。
ジオ近接検索にはかなりあなたが持っているとまったく同じ問題です。
他のヒント
たぶんのようなもの。
SELECT field1, field2, ...,
ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
ORDER BY distance ASC;
または
SELECT field1, field2, ...,
ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
ORDER BY distance ASC;
(直接PHPコードから翻訳される)
:1
と:2
は、それぞれ$lat2/180*pi()
と$long2/180*pi()
である。
これは、半正矢式です。あなたが空間的にデータベースを照会できるように、(代替は、DBの外のすべてのレコードを引っ張るとPHPを介してデータを実行するためにある)SQLに直接PHPを翻訳することができます。 MySQLはあなたが必要なすべての数学関数を提供します。
私は、特定のGIS機能なしでポスト/郵便番号に基づく距離検索を提供する商用ウェブサイトのためにこれをしなかったので、その確かに可能ます。
MySQLの機能が正確にこれを行うために利用可能があります。
http://dev.mysql.com/doc /refman/5.0/en/gis-introduction.htmlする
MySQLは地理空間インデックス行する能力を持っています。 (ちょうどそのことにより、2つの地理オブジェクトとソートの間の距離を計算するためにMySQLを依頼することができます。)あなたは、自分でこの計算を行う必要がないかもしれません。
を参照してください: http://forums.mysql.com/read.php ?23,159205,159205する
ただ、クロスにこのトピックを来ました。多分誰かは、MySQL 5.7でテストこの機能、に興味があるでしょう。
create function GetDistance(lat1 real, lng1 real, lat2 real, lng2 real) returns real no sql
return ATAN2(SQRT(POW(COS(RADIANS(lat2)) * SIN(RADIANS(lng1 - lng2)), 2) +
POW(COS(RADIANS(lat1)) * SIN(RADIANS(lat2)) - SIN(RADIANS(lat1)) *
COS(RADIANS(lat2)) * COS(RADIANS(lng1 - lng2)), 2)),
(SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) + COS(RADIANS(lat1)) *
COS(RADIANS(lat2)) * COS(RADIANS(lng1 - lng2)))) * 6372.795;
呼び出します:
select GetDistance(your_latitude, your_longitude, table_field_lat,
table_field_lng) as dist from [your_table] limit 5;
なぜあなたは、MySQLの地理空間機能を使用していませんか...?いや、冗談ます。
200のレコードは、代替として町、などのような実際の場所である場合には、GeoNames' APIを使用することができます?
以下のWebサービスを提供LATとLNGに10の最も近い場所を提供します
http://ws.geonames.org/findNearby?lat=47.3&lng = 9 の
ソース: http://www.geonames.org/export/web -services.html#findNearbyPlaceNameする