Как найти расстояние между двумя адресами? (Сторона сервера Java) - PullRequest
6 голосов
/ 24 января 2011

У меня есть «социальное» географическое приложение, которое я разрабатываю, и вопрос на миллион долларов заключается в том, как мне перечислить набор элементов, которые находятся «в пределах X миль» от «моего местоположения», поскольку существуют миллионы приложений, которые делаютя был удивлен, обнаружив, что только в API Карт Google есть бесплатный веб-сервис для этого, и, что еще хуже, он поддерживается только при использовании в рамках Карты Google.Так я должен разработать свой собственный калькулятор расстояния?есть ли бесплатный / платный сервис, который позволит мне хотя бы преобразовать адрес в координату XY?

Я уверен, что есть стандартное отраслевое решение (бесплатное или коммерческое), но я еще не нашел его

Ответы [ 4 ]

4 голосов
/ 24 января 2011

На самом деле, у Google есть веб-сервисы , которые можно использовать на стороне сервера для достижения этой цели.

Сначала вы захотите использовать API геокодирования для преобразования адресов в пары координат широта / долгота. Затем вы можете использовать их по своему усмотрению (то есть по отношению к вашей собственной базе данных, если вы храните их)

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

Вы должны заметить, что для перевода координат широты / долготы в расстояния требуется некоторая математика, но я думаю, что лучше делать это локально (на сервере, на котором работает ваше приложение), а не отправлять его на какой-либо внешний сервер, поскольку только математика. Погуглил это .

4 голосов
/ 24 января 2011

Если вам повезло, и вы используете mysql или postgresql, которые являются базами данных с пространственным разрешением, вы можете выполнять к ним пространственные запросы. Для mysql есть пространственные расширения , а для postgresql есть postgis .
Если вы решите пойти вручную, пожалуйста, посмотрите на этот вопрос для заголовков. Также я не понимаю, как Google Места API может помочь вам, так как вы ищете ваши данные в пределах радиус и не гугл местами. Приветствия

4 голосов
/ 24 января 2011

если вы используете SQL (вы не сказали) ... я думаю, что скопировал это из проекта NerdDinner:

ALTER FUNCTION [dbo].[DistanceBetween] (@Lat1 as real,
                @Long1 as real, @Lat2 as real, @Long2 as real)
RETURNS real
AS
BEGIN

DECLARE @dLat1InRad as float(53);
SET @dLat1InRad = @Lat1 * (PI()/180.0);
DECLARE @dLong1InRad as float(53);
SET @dLong1InRad = @Long1 * (PI()/180.0);
DECLARE @dLat2InRad as float(53);
SET @dLat2InRad = @Lat2 * (PI()/180.0);
DECLARE @dLong2InRad as float(53);
SET @dLong2InRad = @Long2 * (PI()/180.0);

DECLARE @dLongitude as float(53);
SET @dLongitude = @dLong2InRad - @dLong1InRad;
DECLARE @dLatitude as float(53);
SET @dLatitude = @dLat2InRad - @dLat1InRad;
/* Intermediate result a. */
DECLARE @a as float(53);
SET @a = SQUARE (SIN (@dLatitude / 2.0)) + COS (@dLat1InRad)
                 * COS (@dLat2InRad)
                 * SQUARE(SIN (@dLongitude / 2.0));
/* Intermediate result c (great circle distance in Radians). */
DECLARE @c as real;
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a));
DECLARE @kEarthRadius as real;
/* SET kEarthRadius = 3956.0 miles */
SET @kEarthRadius = 6376.5;        /* kms */

DECLARE @dDistance as real;
SET @dDistance = @kEarthRadius * @c;
return (@dDistance);
END


ALTER FUNCTION [dbo].[NearestPeople]
    (
    @lat real,
    @long real,
    @maxdist real
    )
RETURNS  TABLE
AS
    RETURN
    SELECT     Person.ID
    FROM       Person
    WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) < @maxdist

Затем я использую эти функции SQL с сервера, как это в C #:

public IQueryable<Person> FindNearbyPeople(float latitude, float longitude, float maxdistance)
{
    var people = from person in FindAllPeople()
                 join i in db.NearestPeople(latitude, longitude, maxdistance)
                 on person.ID equals i.ID
                 select person;

    return people;
}

, который говорит мне, кто (в данном случае, люди) находится рядом со мной на максимальном расстоянии.

это бесплатная версия. Я думаю, что SQL Server 2008 может выполнить это с помощью пакета Geographic

3 голосов
/ 26 января 2011
  1. Хотите ли вы расстояние "по прямой линии" (прямая линия) или расстояние / время вождения?

  2. API Mapquest выглядит проще, поскольку вы можете просто использовать строку запроса.

Другой вариант - geocoder.us (или .ca, если канадский)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...