PHP/MySQL: Select locations close to a given location from DB

后端 未结 7 1538
隐瞒了意图╮
隐瞒了意图╮ 2021-02-02 03:15

In PHP, I have the following code for calculating the distance between two locations:



        
相关标签:
7条回答
  • 2021-02-02 03:48

    Just came a cross this topic. Maybe someone will be interested in this function, tested in 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;
    

    Calling:

    select GetDistance(your_latitude, your_longitude, table_field_lat,
                       table_field_lng) as dist from [your_table] limit 5;
    
    0 讨论(0)
  • 2021-02-02 03:50

    Maybe something like

    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;
    

    or

    SELECT field1, field2, ...,
        ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
        ORDER BY distance ASC;
    

    (directly translated from the PHP code)

    :1 and :2 is $lat2/180*pi() and $long2/180*pi() respectively.

    0 讨论(0)
  • 2021-02-02 03:51

    MySQL Great Circle Distance (Haversine formula) does exactly what you need.

    With only 200 records however you may as well just load them all and check them with code. The data set is really way too small to be worrying too much about database vs code or any other such optimizations.

    Calculating distance between zip codes in PHP has a couple of PHP implementations of this algorithm.

    Geo Proximity Search is pretty much the exact same problem you have.

    0 讨论(0)
  • 2021-02-02 03:51

    Why don't you use MySQL's geospatial features...? No, just kidding.

    If the 200 records are actual places like towns, etc then as an alternative could you use GeoNames' API?

    The following webservice will provide the 10 closest locations to the lat and lng provided:

    http://ws.geonames.org/findNearby?lat=47.3&lng=9

    Source: http://www.geonames.org/export/web-services.html#findNearbyPlaceName

    Full list: http://www.geonames.org/export/ws-overview.html

    0 讨论(0)
  • 2021-02-02 03:55

    There are MySQL functions available for doing exactly this.

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

    0 讨论(0)
  • 2021-02-02 03:59

    That's the Haversine formula. You can translate the PHP directly into SQL so you can query the database spatially (the alternative being to pull every record out of the DB and run the data through PHP). MySQL provides all the maths functions that you need.

    I did this for a commercial website which provided post/zipcode based distance lookups, so its certainly possible without specific GIS functions.

    0 讨论(0)
提交回复
热议问题