8

PHPでは、2つの場所の間の距離を計算するための次のコードがあります。

<?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
?>

しかし今、MySQLデータベースからPHPを介して特定の場所に近い場所を選択したいと思います。

  • ユーザーが故郷に入る
  • 私のスクリプトは、GoogleAPIを介して緯度/経度の値を取得します
  • 私のデータベースには、緯度値用のフィールドと経度値用のフィールドを持つ約200の場所があります。
  • ユーザーの故郷に最も近い10の場所を選択するためのPHPとMySQLのコードが必要です

あなたが私を助けてくれることを願っています。前もって感謝します!

4

7 に答える 7

8

MySQL大圏距離(Haversine式)は、まさに必要なことを実行します。

ただし、200レコードしかない場合は、すべてをロードしてコードで確認することもできます。データセットは実際には小さすぎて、データベースとコード、またはその他のそのような最適化についてあまり心配することはできません。

PHPで郵便番号間の距離を計算するには、このアルゴリズムのPHP実装がいくつかあります。

Geo Proximity Searchは、あなたが抱えている問題とほとんど同じです。

于 2009-05-24T00:53:34.413 に答える
4

多分何かのような

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()です。

于 2009-05-24T01:41:52.460 に答える
1

それがHaversineの公式です。PHPを直接SQLに変換して、データベースを空間的にクエリできるようにすることができます(代わりに、DBからすべてのレコードを引き出し、PHPを介してデータを実行することもできます)。MySQLは、必要なすべての数学関数を提供します。

これは、郵便番号ベースの距離ルックアップを提供する商用Webサイトで行ったため、特定のGIS機能がなくても確実に可能です。

于 2009-05-23T23:57:13.187 に答える
0

これを正確に行うために利用できるMySQL関数があります。

http://dev.mysql.com/doc/refman/5.0/en/gis-introduction.html

于 2009-05-21T19:41:12.987 に答える
0

MySQLには、地理空間的に行にインデックスを付ける機能があります。この計算を自分で行う必要はないかもしれません(MySQLに2つのgeoオブジェクト間の距離を計算し、それで並べ替えるように依頼することができます)。

参照: http: //forums.mysql.com/read.php?23,159205,159205

于 2009-05-21T19:41:47.573 に答える
0

ちょうどこのトピックを越えて来ました。たぶん誰かがMySql5.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;
于 2018-06-14T13:08:15.373 に答える
-1

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

完全なリスト: http: //www.geonames.org/export/ws-overview.html

于 2009-05-23T23:48:23.500 に答える