Рубрики
Uncategorized

Подробное объяснение Алгоритмов определения местоположения на географической карте на основе расширенного обучения PHP

Автор оригинала: David Wong.

В этой статье приведен пример, иллюстрирующий алгоритм определения местоположения на карте Geo, основанный на расширенном обучении PHP. Поделитесь для вашей справки следующим образом:

Предисловие

Мы часто нуждаемся в этом в повседневной разработке Находим местоположение объекта или близлежащую местность. Подождите, мы, естественно, подумаем о том, как использовать API различных картографических сайтов для предоставления услуг, основанных на API, использовать широту и долготу для определения местоположения и нахождения окрестностей и так далее. Однако из-за отсутствия определенного понимания принципа мы не знаем, как использовать эти значения долготы и широты для преобразования расстояния и контраста с точки зрения соотношения расстояния и близости или точности управления. В этой главе мы обсудим принцип алгоритма определения местоположения на основе geo .

концепция

  1. Широта: Широта-это линия, перпендикулярная земной оси. Он вращается вокруг земли в направлении Восток-Запад. Все широты параллельны. Среди них экватор является самой длинной широтой, широта равна 0 градусам, значение широты-это значение угла, от экватора до северной широты и южной широты, равное 0-90 градусам;
  2. Продольная: Вертикальная линия на земном шаре представляет собой полукруг, соединяющий северный и южный полюса и пересекающийся вертикально с широтой. Меридиан равен 0 градусам. Он делится на западную долготу и восточную долготу, обе из которых равны 0-180 градусам, а долгота также является угловым значением.
  3. Преобразование долготы, широты и метра: долгота или широта 0,00001 градуса, равная примерно 1 метру, это может быть реализовано, когда GPS вычисляет расстояние, GPS, если оно с точностью до пяти знаков после запятой, находится в пределах 10 метров;
  4. Для удобства понимания Земля рассматривается как система координат, основанная на линиях долготы и широты. Продольный диапазон составляет – 180 – 180 градусов, а диапазон широты – 90 – 90 градусов. Любая точка на земле может быть однозначно определена такими двумя измерениями, как долгота и широта.

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

geoHash Geohash-это система геокодирования общественного достояния. Он кодирует географическое местоположение в виде строки букв и цифр Это так. Geohash предоставляет такие свойства, как произвольная точность и возможность постепенного удаления символов из конца кода, чтобы уменьшить их размер (и постепенно потерять точность). В результате постепенного снижения точности подобные префиксы часто (но не всегда) присутствуют поблизости. Чем длиннее общий префикс, тем ближе эти два места.

принцип

Точка на земле может быть представлена в виде строки букв, и более распространенные префиксы существуют для букв в аналогичных местах. Это упрощает поиск местоположения в процессе разработки. Его принцип основан на значении геоХэша, упомянутом выше. Ниже приведено подробное описание того, как рассчитывается значение геохеша:

  1. Двоичное кодирование ГеоХэша рассчитывается в соответствии с долготой и широтой (проиллюстрировано значениями долготы и широты: (116.389550, 39.928167)
  2. Сначала вычислите двоичную широту: 2.1 интервал [-90,90] делится на [-90,0], [0,90], который называется левым и правым интервалом. Можно определить, что 39,928167 принадлежит правому интервалу [0,90], отмеченному как 1. 2.2, Затем интервал [0,90] делится на [0,45], [45,90]. Можно определить, что 39,928167 относится к левому интервалу [0,45] и помечено как 0. 2.3 Рекурсивный процесс 39.928167 всегда принадлежит интервалу [a, b]. С каждой итерацией интервал [a, b] всегда сокращается и приближается к 39,928167 все больше и больше. ; 2.4 Широтное двоичное кодирование последовательности 1011100011 будет сгенерировано по мере выполнения алгоритма.
  1. Аналогично, рассчитывается двоичная долгота земли, и интервал составляет [-180,180]. Долгота 116.389550 может быть закодирована. Результат-1101001011.
  1. Состав: В результате приведенного выше расчета сгенерированные коды широты составляют 10111 00011, а сгенерированные коды долготы-10110 01011. Четная долгота и нечетная широта Две серии кодов объединяются для создания новой строки: 11100 11101 00100 01111.
  2. Кодировка Base32 с использованием 32 букв 0-9, BZ (удалите a, i, l, o) Во-первых, мы преобразуем 11100 11101 00100 01111 в десятичную систему, соответствующую 28, 29, 4, 15. Десятичная система соответствует кодировке десятичной системы. wx4g

Геохаш на самом деле представляет собой разделение всей карты или области, полученной в результате разделения. Из-за метода кодирования base32, то есть каждая буква или число в Geohash (например, w в wx4g0e) состоит из 5 битов (2 ^, base32), которые могут состоять из 32 различных комбинаций (0-31), поэтому я могу использовать метод кодирования base32. Они могут разделить всю область карты на 32 области, которые идентифицируются по 00000 – 11111. Первое деление карты показано на следующем рисунке (номер каждой области соответствует соответствующему коду этой области): После многих разложений мы можем получить более точное разделение местоположения. Например, wx4g, рассчитанный выше, может быть точно разделен на один городской район: Как видно из приведенного выше рисунка, более распространенные префиксы значений геоХеша в соседних городских районах, поэтому мы можем использовать общие префиксы для оценки соседних местоположений. Конечно, точный диапазон также определяется широтой и долготой, а также диапазоном значений хэша, как показано на рисунке

Реализация и применение в PHP

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

  1. Используя существующий API карты Реализуйте геопозиционирование, диапазон поиска, расчет расстояния и другие функции, такие как внутренние Baidu, Gaode и многие другие бесплатные API Его можно использовать; если требуется больший и более точный диапазон, Вы можете использовать гео api Google, но недостатком является ограничение на количество запросов в день. Если это приложение корпоративного уровня, необходимо заплатить за разрешение, чтобы увеличить количество запросов. Доступные ссылки: https://developers.google.com/maps/documentation/geocoding/start
  2. Реализация работы с местоположением и хранения с помощью компонента хранилища NoSQL Поскольку нам часто приходится размещать данные после вычисления данных о местоположении, в отрасли существует множество компонентов хранения, которые предоставляют решения для прямых вычислений и хранения, такие как MongoDB Он подходит для прямого использования на облачных платформах в Китае. Если это платформа AWS, она также предоставляет компонент хранилища NoSQL, dynamodb. Эти компоненты хранилища могут быть непосредственно перенесены в широту и долготу, автоматически преобразованы в хранилище геохеширования, а также обеспечивают функцию прямого вычисления расстояния и возврата данных о дальности поиска.
  3. Redis доступен для локальных серверов развертывания : После Redis 3.2 были предоставлены функции работы, поиска и посадки GEO, которые могут быть реализованы в сочетании с новой версией расширения php -redis. Так оно и есть. Ссылка на ссылку: http://www.redis.cn/commands.html, чтобы добиться хорошей работы redis в PHP, можно обратиться к приведенному выше описанию метода на GitHub: https://github.com/phpredis/phpredis. Redis фактически инкапсулирует метод вычисления параметров широты и долготы, преобразуя их в значения геохеша, которые могут храниться в Zset как ядро Zset, поэтому он также может работать как обычный Zset. 。 В практическом применении мы часто используем товары и людей в качестве ценности, а геохеш-в качестве оценки, чтобы мы могли искать людей или вещи в определенном диапазоне оценок. Например, поиск значения в пределах определенного радиуса:
  1. Первичный расчет геохэша с использованием PHP Этот метод является более сложным, то есть в соответствии с принципом geoHash, используя язык PHP для достижения этого алгоритма, но также и с помощью PHP для вычисления расстояния, радиуса поиска и так далее. Это равносильно восстановлению колеса. Конечно, если сложность бизнеса высока, необходимо поддерживать алгоритм GeoHash с помощью PHP или инкапсулировать классы Гео самостоятельно. Вот хорошая PHP-ХОРОШАЯ поддержка для GitHub: https://github.com/geocoder-php/Geocoder Или если вам нужно только вычислить значение геохеша, вы можете использовать метод PHP для вычисления значения хэша, которое широко передается через Интернет:
private $coding = '0123456789bcdefghjkmnpqrstuvwxyz';
/**
* calculate geoHash by longitude and latitude
* @param $lat
* @param $long
* @return string
*/
public function calcGeoHash($lat,$long)
{
$plat=$this->precision($lat);
$latbits=1;
$err=45;
while($err>$plat)
{
$latbits++;
$err/=2;
}
$plong=$this->precision($long);
$longbits=1;
$err=90;
while($err>$plong)
{
$longbits++;
$err/=2;
}
$bits=max($latbits,$longbits);
$longbits=$bits;
$latbits=$bits;
$addlong=1;
while (($longbits+$latbits)%5 != 0)
{
$longbits+=$addlong;
$latbits+=!$addlong;
$addlong=!$addlong;
}
$blat=$this->binEncode($lat,-90,90, $latbits);
$blong=$this->binEncode($long,-180,180,$longbits);
$binary='';
$uselong=1;
while (strlen($blat)+strlen($blong))
{
if ($uselong)
{
$binary=$binary.substr($blong,0,1);
$blong=substr($blong,1);
}
else
{
$binary=$binary.substr($blat,0,1);
$blat=substr($blat,1);
}
$uselong=!$uselong;
}
$hash='';
for ($i=0; $icoding[$n];
}
return $hash;
}
/**
* @param $number
* @return float|int
*/
private function precision($number)
{
$precision=0;
$pt=strpos($number,'.');
if ($pt!==false)
{
$precision=-(strlen($number)-$pt-1);
}
return pow(10,$precision)/2;
}
/**
* @param $number
* @param $min
* @param $max
* @param $bitcount
* @return string
*/
private function binEncode($number, $min, $max, $bitcount)
{
if ($bitcount==0)
return '';
$mid=($min+$max)/2;
if ($number>$mid)
return '1'.$this->binEncode($number, $mid, $max,$bitcount-1);
else
return '0'.$this->binEncode($number, $min, $mid,$bitcount-1);
}

резюме

Алгоритм ГеоХэша-это алгоритм, который преобразует двумерные координаты в однобитовые строки. Он может судить о расстоянии по общим префиксам разных строк. Он часто используется в повседневной работе. В этой статье также представлены различные методы реализации. Конкретный план реализации также должен основываться на реальных бизнес-потребностях. Так оно и есть. Если он относится к крупномасштабному приложению с высокой точностью или корпоративного уровня, мы можем сначала рассмотреть MongoDB или другие компоненты хранилища, которые предоставляют функции Гео. Если он легкий, мы можем использовать сторонний региональный API или red для создания приложений simplegeo. Если сложность бизнес-требований невелика, не рекомендуется писать непосредственно на PHP. В конце концов, эффективность будет относительно низкой, и это не в центре внимания бизнеса, поэтому нет необходимости перестраивать колесо.

Больше читателей, интересующихся контентом, связанным с PHP, могут ознакомиться с темами этого сайта: Введение в объектно-ориентированное программирование Php, Введение в навыки работы с массивами PHP, Введение в базовую грамматику PHP, Краткое описание работы PHP и использования операторов, Краткое описание использования строк Php и данных php+mysql. Введение в библиотечные операции и Краткое описание общих навыков работы с базами данных на PHP

Я надеюсь, что эта статья будет полезна для разработки PHP – программ для всех.