Я дал местоположение, определенное широтой и долготой. Теперь я хочу рассчитать ограничивающую рамку, например, в пределах 10 километров от этой точки.
Ограничивающая рамка должна быть определена как latmin, lngmin и latmax, lngmax.
Мне это нужно, чтобы использовать Panoramio API .
Кто-нибудь знает формулу получения этих очков?
Изменить: Ребята, я ищу формулу / функцию, которая принимает lat и lng в качестве входных данных и возвращает ограничивающую рамку как latmin и lngmin и latmax и latmin. Mysql, php, c #, javascript подойдут, но и псевдокод тоже подойдет.
Изменить: я не ищу решение, которое показывает мне расстояние в 2 балла
Ответы:
Я предлагаю локально аппроксимировать поверхность Земли как сферу с радиусом, заданным эллипсоидом WGS84 на данной широте. Я подозреваю, что точное вычисление latMin и latMax потребует эллиптических функций и не приведет к заметному увеличению точности (WGS84 сам по себе является приближением).
Моя реализация (написана на Python, я не тестировал):
РЕДАКТИРОВАТЬ: следующий код преобразует (градусы, простые числа, секунды) в градусы + доли градуса и наоборот (не проверено):
источник
Я написал статью о нахождении ограничивающих координат:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
В статье объясняются формулы, а также предоставляется реализация на Java. (Это также показывает, почему формула Федерико для определения минимальной / максимальной долготы неточна.)
источник
public override string ToString()
очень плохо переопределять такой глобальный метод только для одной цели, лучше просто добавить другой метод, а затем переопределить стандартный метод, который можно использовать в других частях приложения, не дляЗдесь я преобразовал ответ Федерико А. Рампони на C # для всех, кого это интересует:
источник
Я написал функцию JavaScript, которая возвращает четыре координаты квадратного ограничивающего прямоугольника с учетом расстояния и пары координат:
источник
minLon = void 0;
аmaxLon = MAX_LON;
он все еще не работает.centerPoint
аргумент - это массив, состоящий из двух координат. Например,getBoundingBox([42.2, 34.5], 50)
-void 0
это вывод CoffeeScript для "undefined" и не влияет на возможность запуска кода.degLat.degToRad
это не функцияdegToRad
ошибки « не является функцией». Так и не выяснил, почему, ноNumber.prototype.
это плохая идея для такой служебной функции, поэтому я преобразовал их в обычные локальные функции. Также важно отметить, что возвращается поле [LNG, LAT, LNG, LAT] вместо [LAT, LNG, LAT, LNG]. Я изменил функцию возврата, когда использовал это, чтобы избежать путаницы.Поскольку мне нужна была очень приблизительная оценка, поэтому, чтобы отфильтровать некоторые ненужные документы в запросе elasticsearch, я использовал следующую формулу:
N = км требуется от данного местоположения. Для вашего случая N = 10
Не точно, но удобно.
источник
Вы ищете формулу эллипсоида.
Лучшее место, которое я нашел для начала кодирования, основано на библиотеке Geo :: Ellipsoid от CPAN. Это дает вам основу для создания ваших тестов и сравнения ваших результатов с их результатами. Я использовал его как основу для аналогичной библиотеки для PHP у моего предыдущего работодателя.
Гео :: Эллипсоид
Взгляните на
location
метод. Вызовите его дважды, и у вас есть bbox.Вы не опубликовали, на каком языке использовали. Возможно, вам уже доступна библиотека геокодирования.
О, и если вы еще не догадались, карты Google используют эллипсоид WGS84.
источник
Иллюстрация @Jan Philip Matuschek отличное объяснение. (Пожалуйста, проголосуйте за его ответ, а не за это; я добавляю это, поскольку мне потребовалось немного времени, чтобы понять исходный ответ)
Метод ограничивающего прямоугольника для оптимизации поиска ближайших соседей должен будет вывести минимальную и максимальную пары широты и долготы для точки P на расстоянии d. Все точки, выходящие за их пределы, определенно находятся на расстоянии больше d от точки. Здесь следует отметить расчет широты пересечения, как это показано в объяснении Яна Филиппа Матушека. Широта пересечения находится не на широте точки P, а немного смещена от нее. Это часто упускаемая из виду, но важная часть при определении правильной минимальной и максимальной ограничительной долготы для точки P на расстоянии d. Это также полезно при проверке.
Расстояние гаверсинуса между (широта, высокая долгота) и (широта, долгота) точки P равно расстоянию d.
Суть Python здесь https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
источник
Вот простая реализация с использованием javascript, которая основана на преобразовании градуса широты в км, где
1 degree latitude ~ 111.2 km
.Я вычисляю границы карты по заданной широте и долготе с шириной 10 км.
источник
Я адаптировал сценарий PHP, который, как я обнаружил, именно для этого. Вы можете использовать его, чтобы найти углы коробки вокруг точки (скажем, 20 км). Мой конкретный пример для API Карт Google:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometer
источник
Я работал над проблемой ограничивающего прямоугольника как побочной проблемой для поиска всех точек в пределах радиуса SrcRad статической точки LAT, LONG. Было довольно много расчетов, в которых использовались
чтобы вычислить границы долготы, но я обнаружил, что это не дает всех ответов, которые были необходимы. Потому что ты действительно хочешь
Я знаю, знаю, что ответ должен быть таким же, но я обнаружил, что это не так. Оказалось, что, не удостоверившись, что я выполняю сначала (SRCrad / RadEarth), а затем разделив на часть Cos, я упустил некоторые точки расположения.
После того как вы получите все точки ограничивающей рамки, если у вас есть функция, которая вычисляет расстояние от точки до точки с учетом широты, долго легко получить только те точки, которые находятся на определенном радиусе расстояния от фиксированной точки. Вот что я сделал. Я знаю, что потребовалось несколько дополнительных шагов, но это помогло мне
источник
Это очень просто, просто зайдите на сайт Panoramio и затем откройте карту мира с сайта Panoramio. Затем перейдите в указанное место, для которого требуются широта и долгота.
Затем вы нашли широту и долготу в адресной строке, например, по этому адресу.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32.739485 => широта ln = 70.491211 => долгота
этот виджет Panoramio JavaScript API создает ограничивающую рамку вокруг пары широта / долгота и затем возвращает все фотографии с этими границами.
Другой тип виджета Panoramio JavaScript API, в котором вы также можете изменить цвет фона с помощью примера и кода, находится здесь .
Это не проявляется в составлении настроения, это проявляется после публикации.
источник
Здесь я преобразовал ответ Федерико А. Рампони на PHP, если кому-то интересно:
источник
Спасибо @Fedrico A. за реализацию Phyton, я перенес ее в класс категории Objective C. Вот:
Я протестировал его и, похоже, работает нормально. Struct BoundsLocation следует заменить классом, я использовал его, чтобы поделиться им здесь.
источник
Все приведенные выше ответы верны только частично . Особенно в таких регионах, как Австралия, они всегда включают столб и рассчитывают очень большой прямоугольник даже для 10 км / сек.
В частности, алгоритм Яна Филипа Матушека на http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex включал очень большой прямоугольник из (-37, -90, -180, 180) почти для каждой точки в Австралии. Это поражает большое количество пользователей в базе данных, и расстояние должно быть рассчитано для всех пользователей почти в половине страны.
Я обнаружил, что алгоритм Drupal API Earth, разработанный Рочестерским технологическим институтом, лучше работает как на полюсе, так и в других местах, и его намного проще реализовать.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Используйте
earth_latitude_range
иearth_longitude_range
из приведенного выше алгоритма для вычисления ограничивающего прямоугольникаИ используйте формулу расчета расстояния, задокументированную картами Google, чтобы рассчитать расстояние
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Для поиска по километрам вместо миль замените 3959 на 6371. Для (Lat, Lng) = (37, -122) и таблицы маркеров со столбцами lat и lng формула имеет следующий вид:
Прочтите мой подробный ответ на https://stackoverflow.com/a/45950426/5076414
источник
Вот ответ Федерико Рампони в Go. Примечание: без проверки ошибок :(
источник