如何使用谷歌地图api找到附近的位置到给定位置

时间:2010-08-16 17:53:24

标签: php javascript google-maps

想要找到附近所有地点或地址。有没有谷歌地图API?或者我们需要遵循一系列步骤,如

  1. 找到那个地方的长途。

  2. 做一些处理并靠近拉特长。

  3. 使用步骤2中获得的lat long进行反向地理编码,找到每个lat长对的位置。

  4. 澄清我。此外,如果你能够很好地完善第2步。

    这种方法有效吗?你能澄清一下吗。

1 个答案:

答案 0 :(得分:4)

这取决于您要查找的附近内容是否在Google数据库中作为感兴趣的地方,或者它们是否是任意地址/位置。

如果它们是地址/位置,则类似于您指定的内容是正确的。

  1. 对您要包含的所有地点进行地理编码并将其存储在数据库中(使用Lat / Lon)
  2. 对您所在的地方(您需要信息的地方)进行地理编码
  3. 对球体上的距离使用数学例程列出指定距离内的位置
  4. 数学是:

    1. 以Radians(LatOrLon * PI / 180)
    2. 获取当前纬度和经度
    3. 以Radians(LatOrLon * PI / 180)
    4. 获取目标纬度和经度
    5. 获取球体的半径(在本例中为地球= 3963.1英里)
    6. 使用长篇复杂且令人困惑的论坛
    7. 下面(其中Lat1和Lon1是您在Radians中的当前位置,Lat2和Lon2是Radians中的目标):

      Acos(
          Cos(Lat1) * Cos(Lon1) * Cos(Lat2) * Cos(Lon2) + 
          Cos(Lat1) * Sin(Lon1) * Cos(Lat2) * Sin(Lon2) + 
          Sin(Lat1) * Sin(Lat2)
          ) * EarthRadiusInMiles
      

      这可以使用SQL函数(MSSQL,但您可以轻松地将此逻辑编码为大多数其他语言)来完成。

      CREATE FUNCTION [dbo].[CoordinateDistanceMiles](
      @Latitude1 float,
      @Longitude1 float,
      @Latitude2 float,
      @Longitude2 float
      )
      RETURNS float 
      AS  
      BEGIN
      
      -- SAME LOCATION, RETURN 0
      IF @Latitude1 = @Latitude2 AND @Longitude1 = @Longitude2 RETURN 0.00
      
      -- CONSTANTS
      DECLARE @EarthRadiusInMiles float;
      SET @EarthRadiusInMiles = 3963.1
      DECLARE @PI float;
      SET @PI = PI();
      
      -- RADIANS conversion
      DECLARE @lat1Radians float;
      DECLARE @long1Radians float;
      DECLARE @lat2Radians float;
      DECLARE @long2Radians float;
      
      SET @lat1Radians = @Latitude1 * @PI / 180;
      SET @long1Radians = @Longitude1 * @PI / 180;
      SET @lat2Radians = @Latitude2 * @PI / 180;
      SET @long2Radians = @Longitude2 * @PI / 180;
      
      RETURN Acos(
      Cos(@lat1Radians) * Cos(@long1Radians) * Cos(@lat2Radians) * Cos(@long2Radians) + 
      Cos(@lat1Radians) * Sin(@long1Radians) * Cos(@lat2Radians) * Sin(@long2Radians) + 
      Sin(@lat1Radians) * Sin(@lat2Radians)
      ) * @EarthRadiusInMiles;
      END
      

      然后,从任何调用查询中,您都可以按距离排序,例如:

      CREATE PROCEDURE [dbo].[NearbyThings]
      (
      @Lat float,
      @Lon float,
      @Num int = 10
      )
      
      AS
      
      SET NOCOUNT ON
      
      Select Top (@Num)
      'Distance' = Round(dbo.CoordinateDistanceMiles(@Lat, @Lon, Lat, Lon), 1),
      ThingId, 
      Postcode, 
      Lat, 
      Lon
      From 
      Things
      Order by
      dbo.CoordinateDistanceMiles(@Lat, @Lon, Lat, Lon) ASC
      GO