Intereting Posts

Поиск дальности координаты широты / долготы

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

$vicinity = .001; $lat_ceiling = floatval($lat) + floatval($vicinity); $lat_floor = floatval($lat) - floatval($vicinity); $lng_ceiling = floatval($lng) + floatval($vicinity); $lng_floor = floatval($lng) - floatval($vicinity); $query = "SELECT * FROM `geolocations` WHERE". "`latitude` <= '".$lat_ceiling."' AND `latitude` >= '". $lat_floor ."' AND `longitude` <= '".$lng_ceiling."' AND `longitude` >= '". $lng_floor ."' "; 

Некоторая версия того, что вы делаете, прав, но я думаю, вы, вероятно, захотите использовать фактические типы геометрии, особенно если вы находитесь в MyISAM и можете создать пространственный индекс R-Tree. У вас могут быть столбцы с любым поддерживаемым типом (например, point , polygon ) или тип geometry catchall:

 mysql> create table spatial_table (id int, my_spots point, my_polygons geometry); Query OK, 0 rows affected (0.06 sec) 

Затем запрос и обновление с помощью синтаксиса WKT:

 mysql> insert into spatial_table values (1, GeomFromText('POINT(1 1)'), GeomFromText('POLYGON((1 1, 2 2, 0 2, 1 1))')); Query OK, 1 row affected (0.00 sec) mysql> insert into spatial_table values (1, GeomFromText('POINT(10 10)'), GeomFromText('POLYGON((10 10, 20 20, 0 20, 10 10))') ); Query OK, 1 row affected (0.00 sec) 

Затем вы можете выполнить свой запрос (т. Е. Окрестности) против минимального ограничивающего прямоугольника строки с конечными точками point1 = долгота – приращение, lon – приращение, y = долгота + приращение, широта + приращение, то есть здесь с + – 1 :

 mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots); +------+---------------------------+-----------------------------------------------------------------------------------+ | id | my_spots | my_polygons | +------+---------------------------+-----------------------------------------------------------------------------------+ | 1 | $@ $@ | $@ $@ 4@ 4@ 4@ $@ $@ | +------+---------------------------+-----------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 

Это будет намного лучше, чем выполнение арифметики на множестве поплавков, представляющих долготу и широту. Кстати о местоположении Сан-Франциско следующие константы работают очень хорошо для преобразования между километрами и градусами долготы и широты (т. Е. Если вы хотите чистые квадратные карты Санта-Крус):

 lonf 0.01132221938 latf 0.0090215040 

То есть (x + – 2 * lonf, y + – 2 * latf) дает вам соответствующие значения $lat_floor т. Д. Для мальчика шириной 2 км вокруг вашей точки интереса.

Я не вижу ничего плохого в том, как вы это делаете, но это может быть немного чище:

 SELECT * FROM `geolocations` WHERE `latitude` BETWEEN $lat - $vicinity AND $lat + $vicinity AND `longitude` BETWEEN $lng - $vicinity AND $lng + $vicinity 

PostGIS является надстройкой для баз данных PostgreSQL для управления географическими данными. Он имеет функцию расстояния: http://postgis.refractions.net/documentation/manual-1.3/ch06.html#id2574517

Если вы ищете аппроксимацию формулы харвезина, возможно, вы хотите использовать пространственный индекс или кривую заполнения пробела. Sfc представляет собой квадрантную и фрактальную структуру данных, уменьшающую сложность 2d до сложности 1d. Это кривая, которая заполняет пространство и умный алгоритм для разбиения карты. Вместо того, чтобы вычислять индекс, вы также можете вставлять фрагменты и накапливать квад-ключ и искать в этом ключе со стандартными операторами строки mysql. Например, если у вас есть квадрат 11111222233334444, вы можете найти 1111 *, чтобы найти все пары ключей => из этого узла, а также ниже или справа от него.