【问题标题】:how do i find near by locations to a given location using google map api我如何使用谷歌地图 api 找到指定位置附近的位置
【发布时间】:2011-03-30 13:52:31
【问题描述】:

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

  1. 找出该地点的经纬度。

  2. 做一些处理,然后靠近 lat longs。

  3. 使用从第 2 步获得的经纬度进行反向地理编码,并找到每个经纬度对的位置。

澄清一下。另外,如果您可以详细说明第 2 步,那就太好了。

这种方法行得通吗?你能澄清一下吗?

【问题讨论】:

  • “附近的地方”是什么意思?
  • 更准确地说是附近位置/地理位置

标签: php javascript google-maps


【解决方案1】:

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

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

  1. 对您想要包含的所有地点进行地理编码并将它们存储在数据库中(使用纬度/经度)
  2. 对您所在的位置(您想要获取信息的位置)进行地理编码
  3. 对球体上的距离使用数学例程列出指定距离内的地点

数学是:

  1. 获取当前的经纬度,单位为弧度 (LatOrLon * PI / 180)
  2. 获取以弧度为单位的目标纬度和经度 (LatOrLon * PI / 180)
  3. 获取球体的半径(在本例中地球 = 3963.1 英里)
  4. 使用冗长的复杂和混乱的论坛la

下面(Lat1 和 Lon1 是您当前的弧度位置,Lat2 和 Lon2 是您的弧度目标):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多