как найти близлежащие места в определенном месте, используя Google Map API - PullRequest
3 голосов
/ 16 августа 2010

хотел бы найти все близлежащие места для данного места или адреса.Есть ли в Google Map API?или нам нужно выполнить последовательность шагов, таких как

  1. Найти широту и длину места.

  2. Выполнить некоторую обработку и приблизиться к широтеlongs.

  3. сделать обратное геокодирование с полученными значениями lat long из шага 2 и найти места для каждой пары long long.

уточнить,Также, если бы вы могли сформулировать шаг 2, это было бы здорово.

Будет ли этот подход работать?Вы можете уточнить это.

1 Ответ

4 голосов
/ 17 августа 2010

Это действительно зависит от того, находятся ли близлежащие объекты в базе данных Google в качестве достопримечательностей, или они являются произвольными адресами / местоположениями.

Если это адреса / местоположения, то что-то похожее на то, что вы укажете, является правильным.

  1. Геокодировать все места, которые вы хотите включить, и хранить их в БД (с широтой / долготой)
  2. Геокодируйте место, в котором вы находитесь (где вы хотите получить информацию)
  3. Используйте математическую процедуру для определения расстояния на сфере, чтобы составить список мест на указанном расстоянии

Математика это:

  1. Получить текущую широту и долготу в радианах (LatOrLon * PI / 180)
  2. Получить целевую широту и долготу в радианах (LatOrLon * PI / 180)
  3. Получите радиус своей сферы (в данном случае земля = 3963,1 миль)
  4. Используйте длинный сложный и запутанный форум

Ниже (где 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...