Есть ли формула для изменения широты и долготы в одно число? - PullRequest
4 голосов
/ 27 ноября 2011

Можете ли вы сказать мне, если есть формула для изменения широты и долготы в одно число?

Я планирую использовать это для таблицы базы данных в программном обеспечении, которое обеспечивает маршрутизацию для доставок. Строка таблицы будет иметь этот номер, а также почтовый адрес. Таблица базы данных будет отсортирована в возрастающем числовом порядке, чтобы программа могла определить, по какому адресу должен идти грузовик: первый, второй и т. Д.

Не могли бы вы ответить, показывая синтаксис VB или VB.Net, чтобы я мог понять, как он работает?

Например, я бы использовал следующие числа для широты и долготы: Lat = 40.71412890 Long = -73,96140740

Дополнительная информация:

Я разрабатываю приложение для Android с помощью Basic4Android. Basic4Android использует синтаксис VB или VB.Net с SQLite в качестве базы данных.

Часть этого приложения будет иметь планирование маршрута. Я хочу использовать этот номер в качестве первого столбца в таблице SQLite, а другие столбцы будут для адреса. Если я сделаю запрос в приложении, который сортирует строки в порядке возрастания номеров, я смогу выяснить, какой почтовый адрес находится ближе всего друг к другу, поэтому мне потребуется меньше времени, чтобы переходить от дома к дому.

Например, если числа были: 194580, 199300, 178221

Я могу отправиться по почтовому адресу 178221, затем в 194580 и, наконец, в 199300, и мне не нужно будет проделывать долгий путь по городу, чтобы делать свои поставки после того, как они были отсортированы.

В качестве альтернативы, я был бы рад, если бы существовал простой способ вызвать веб-службу, которая возвращает, может быть, ответ json с единственным номером, если я отправлю почтовый адрес на веб-сайт. Basic4Android имеет службы http, которые могут отправлять запросы на веб-сайт.

Ответы [ 9 ]

6 голосов
/ 01 февраля 2013

Широта и долгота, оба могут быть представлены как 4-байтовое целое, так что координаты имеют точность 3 см, что достаточно для большинства приложений.

Шаги для создания одного 8-байтового значения типа long изширота и долгота:

1) преобразовать широту и долготу в int следующим образом: int iLat = lat * 1E7;
2) использовать 8-байтовое длинное значение для хранения обоих 4-байтовых int.
установить верхний4 байта до широты и ниже 4 до долготы.

Теперь у вас есть длина 8 байтов, представляющая точку в мире с точностью до 3 см.

Существуют и другие, более эффективные решения, такие какте, которые поддерживают аналогичные числа для близлежащих мест, но они более сложные.

3 голосов
/ 27 ноября 2011

Вы можете добавить их, но это не имеет особого смысла.

Например, итоговое значение «10» - 8 лат и 2 в длину будет таким же, как «10» - 3 лат и 7 в длину.

Вы можете объединить их, возможно, с тире.

Но почему тоже? Они оба действительно плохие выборы. Система доставки будет нуждаться в реальных координатах x-y, а если при планировании маршрута они будут разделены, чтобы вычислять такие вещи, как евклидовы расстояния.

Это домашнее задание? Я сомневаюсь, что служба доставки разрабатывает свою структуру обслуживания на SO. Наименее надежды нет.

2 голосов
/ 05 апреля 2012

Как насчет этого:

(lat+90)*180+lng

Из комментария Тома Кларксона в Геопространственное индексирование с помощью Redis & Sinatra для приложения Facebook

1 голос
/ 19 ноября 2017

Я создал метод помещения широты и долготы в одно число base-36, которое сейчас я называю геогексой.

Этот метод работает путем деления мира на сетку 36 x 36.Первый символ - это долгота, а второй - широта.Широта и долгота, которые представляют эти два символа, являются средней точкой этого «прямоугольника».Вы просто продолжаете добавлять символы, чередуя долготу и широту.В конце концов, геогекса при преобразовании обратно в лат и долг будет достаточно близка к вашим первоначальным латам и долгам.

Девять символов обычно доставят вас в пределах 5 метров от случайно сгенерированных лат и долг.

Геогекса для Лондонского моста - hszaounu , а для Тауэрского моста - hszaqu88 .

Возможно отсортировать геогекса, и местоположения, которые находятся рядом друг с другом, будутимеют тенденцию быть рядом друг с другом в отсортированном списке в некоторой степени.Однако это ни в коем случае не решает проблему коммивояжера!

Проект, включая полное объяснение, реализации на Python, Java и JavaScript, можно найти здесь: https://github.com/Qarj/geohexa

1 голос
/ 24 ноября 2015

Основано на ответе AlexWien. Это решение на JavaScript:

pairCoordinates = function(lat, lng) {
  return lat * 1e7 << 16 & 0xffff0000 | lng * 1e7 & 0x0000ffff;
}
1 голос
/ 27 ноября 2011

Если вы хотите рассматривать местоположение как «одну вещь», лучший способ справиться с этим - создать структуру данных, которая содержит оба значения. Класс для ОО-языков или структура в противном случае. Объединение их в одно скалярное значение имеет мало значения даже для отображения.

Местоположение - это действительно богатое проблемное пространство, и существует множество способов его представить. Lat / Lon - вершина айсберга.

Как всегда, правильный ответ зависит от того, для чего вы его используете, о чем вы не упомянули.

0 голосов
/ 05 декабря 2018

Вы можете использовать кривую заполнения пространства Гильберта для преобразования широты, долготы в одно число: например, https://geocode.xyz/40.71413,-73.96141?geoit=xml 2222211311031 и https://geocode.xyz/40.71413,-73.96151?geoit=xml 2222211311026

Исходный код здесь: https://github.com/eruci/geocode

0 голосов
/ 10 августа 2018

В двух словах:

Пусть X, Y - широта, долгота

Обрезать до 5-й десятичной точки и преобразовать в целые числа, умножив на 100000

Пусть XY = X + Y и YX = X-Y

Преобразовать XY, YX в двоичный файл и объединить их в XYX, чередуя биты

Преобразование XYX в десятичное

Добавьте дополнительное число (1,2,3,4), чтобы указать, когда один или оба XY, YX являются отрицательными числами.

Теперь у вас есть одно число, которое можно преобразовать обратно в широту, долготу и которое сохраняет все их позиционные свойства.

0 голосов
/ 03 декабря 2011

Я обнаружил, что могу получить хорошие результаты, добавив широту и долготу определенного адреса, не включив номер дома и отсортировав результаты в таблице базы данных по добавленному номеру, за которым следует вторая сортировка по номеру дома в порядке возрастания .

Я использовал этот URL, чтобы получить числа, которые мне нужно сложить вместе:

http://where.yahooapis.com/geocode?q=stedman+st,+lowell,+ma
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...