Это действительно зависит от того, находятся ли близлежащие объекты в базе данных Google в качестве достопримечательностей, или они являются произвольными адресами / местоположениями.
Если это адреса / местоположения, то что-то похожее на то, что вы укажете, является правильным.
- Геокодировать все места, которые вы хотите включить, и хранить их в БД (с широтой / долготой)
- Геокодируйте место, в котором вы находитесь (где вы хотите получить информацию)
- Используйте математическую процедуру для определения расстояния на сфере, чтобы составить список мест на указанном расстоянии
Математика это:
- Получить текущую широту и долготу в радианах (LatOrLon * PI / 180)
- Получить целевую широту и долготу в радианах (LatOrLon * PI / 180)
- Получите радиус своей сферы (в данном случае земля = 3963,1 миль)
- Используйте длинный сложный и запутанный форум
Ниже (где 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