Когда вы говорите «локации», что именно вы имеете в виду? Уличные адреса? GPS координаты?
Если у вас есть GPS-координаты (или вы можете преобразовать адрес в координаты), вы всегда можете рассчитать евклидово расстояние или (точнее) расстояние по большому кругу между двумя точками , Определите расстояние между текущим местоположением и каждым потенциальным пунктом назначения, затем отсортируйте список по кратчайшему расстоянию.
Вы не упомянули, используете ли вы API Карт Google, но вот некоторая дополнительная информация, если вы это делаете. Вы можете хранить две точки как объекты типа GLatLng
и использовать object1.distanceFrom(object2)
для вычисления этого. Вы также можете создать объект GLatLngBounds
, представляющий прямоугольную область на карте, и использовать GLatLngBounds.containsLatLng(latlng:GLatLng)
, чтобы увидеть, находится ли географическая точка в этой области.
Редактировать: Что обычно происходит в случае, о котором вы упоминаете ниже, когда пользователь вводит почтовый индекс, «текущее местоположение» считается географическим центром этого почтового индекса (вероятно, вы чтобы получить эту информацию от органа, который присваивает почтовые индексы в вашем регионе). Если вы находитесь в Великобритании, на этом сайте есть бесплатный список почтовых индексов и их координат. Поиск почтового индекса в Картах Google приведет вас к центру этого почтового индекса; если вам нужно создать собственный список почтовых индексов и координат, вы, вероятно, можете создать скрипт, который будет перебирать все действительные почтовые коды и использовать карты Google для их поиска и преобразования в GPS-координаты.
Чтобы превратить адрес в координаты, вы хотите сделать то, что называется геокодирование . Google Maps имеет API для этого, и есть другие ресурсы, которые могут предоставить вам эту функцию. Для некоторых примеров попробуйте эту страницу . Какой ресурс вы используете, во многом зависит от того, где вы находитесь, так как большая часть этой информации локализована. Вы не упомянули много о своем проекте (платформа, язык и т. Д.), Но в нижней части этой страницы находится раздел «Библиотеки вспомогательных средств геокодирования», который может иметь необходимые вам функции в виде готового пакета. В частности, библиотека GeoKit (язык Ruby) имеет несколько примеров на главной странице своего веб-сайта , включая несколько, которые выглядят так, как будто вы делаете именно то, что вы хотите.
РЕДАКТИРОВАТЬ: Я получил следующий код из генератора кодов в WebRPC :
/**
* Copyright WebRPC
* available under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991
* http://www.gnu.org/licenses/gpl.txt
*/
public class Client
{
public static void Main(string[] args)
{
// make the call
XPathDocument doc = new XPathDocument(@"http://maps.google.com/maps/geo?q=New+York&output=xml&key=ABQIAAAAuXdMTY5VIU1FvkgOOP1dNBTsILMTMKRV-aJhd94IQkaJhVJ0YBS2qNSZGm8TaefqbXBT6lUXeMZ6tA");
// print the outputs
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator coord = nav.Select( "/kml/Response/Placemark/Point/coordinates" );
while ( coord.MoveNext() )
System.Console.WriteLine( coord.Current );
XPathNodeIterator accuracy = nav.Select( "/kml/Response/Placemark/AddressDetails/@Accuracy" );
while ( accuracy.MoveNext() )
System.Console.WriteLine( accuracy.Current );
}
}
Вы сможете изменить этот код C # в соответствии с вашими потребностями. В частности, при вызове new XPathDocument
измените часть строки, которая читает ?q=New+York
, на любой нужный вам адрес или почтовый индекс (например, использование ?q=1060+West+Addison%2C+Chicago%2C+IL
приведет к получению информации для поля Wrigley в Чикаго или использование * 1039). * получит информацию для почтового индекса в Лидсе). Чтобы отформатировать адрес из обычной текстовой строки, измените пробелы на «+» и превратите все другие не алфавитно-цифровые символы в их эквивалент ASCII (например, «% 2C» для запятой).
Следующие несколько строк извлекают информацию с сервера и анализируют ее различными способами. Интерес представляет поле /kml/Response/Placemark/Point/coordinates
в возвращаемых данных. Эта строка будет содержать ваши координаты широты и долготы для местоположения, указанного вами выше.
Теперь, это должно дать вам достаточно информации для создания функции C #, которая способна превратить адрес или почтовый индекс в пару координат. Сложная часть сделана, но два шага остаются. Во-первых, вы захотите использовать это для генерации координат для каждого адреса в вашей базе данных (сохраните их в базе данных с адресами для достижения наилучших результатов). Теперь, когда пользователь вводит адрес, снова вызовите функцию C #, чтобы сгенерировать набор координат для его местоположения. Теперь, когда у вас есть координаты для всего, вы можете найти расстояние между двумя координатами, используя одну из двух функций вычисления расстояния, с которыми я связан в верхней части поста. Просмотрите свой список ветвей, вычислите расстояние от пользователя до каждого и отсортируйте этот список, чтобы найти ветви с кратчайшими значениями расстояния.