sql >> データベース >  >> RDS >> Mysql

都市と緯度経度による距離

    これが私たちのものです。テーブル構造に合わせて変更する必要がある場合があります。私たちは都市ではなく小売店の場所(およびアメニティ)を検索しますが、難しいのはこのステートメントで機能する「距離で最も近い」ことです。

    CREATE PROCEDURE [dbo].[GetNearbyLocations] @CenterLatitude FLOAT, @CenterLongitude FLOAT
    AS
    
    DECLARE @CntXAxis FLOAT 
    DECLARE @CntYAxis FLOAT 
    DECLARE @CntZAxis FLOAT 
    
    SET @CntXAxis = COS(RADIANS(@CenterLatitude)) * COS(RADIANS(@CenterLongitude)) 
    SET @CntYAxis = COS(RADIANS(@CenterLatitude)) * SIN(RADIANS(@CenterLongitude)) 
    SET @CntZAxis = SIN(RADIANS(@CenterLatitude)) 
    
    SELECT LocationId, LocationName, Address, City, State, Zip, Phone, Latitude, Longitude,
                   hasATM, hasCarWash, hasDiesel, hasE85, is24hr, hasTrendar, hasWiFi, isTravelCenter, isMiniTravelCenter, isTruckerFriendly, hasScale, hasHotFood,
                   ProxDistance = 3961 * ACOS( dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) 
    FROM Locations 
    WHERE latitude IS NOT NULL 
    ORDER BY ProxDistance ASC
    GO
    

    編集-追加(元々これらを見逃してしまい申し訳ありません)

    -- USER-DEFINED FUNCTIONS
    -- XAxis #########################################
    CREATE FUNCTION [dbo].[XAxis] (@lat float, @lon float)  
    RETURNS float
    AS  
    BEGIN 
       RETURN COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lat) * COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lon) 
    END
    
    CREATE FUNCTION [dbo].[YAxis] (@lat float, @lon float)  
    RETURNS float AS  
    BEGIN 
    RETURN COS(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat) * SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lon)
    END
    
    CREATE FUNCTION [dbo].[ZAxis] (@lat float)  
    RETURNS float AS  
    BEGIN 
    RETURN SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat)
    END
    


    1. 多対多の関係INSERT

    2. MySqlのRandom()?

    3. mysql_connect()からPHP PDO接続を取得しますか?

    4. MySQL-列の名前を変更