2014-11-27 3 views
1

В скрипте PHP у меня есть запрос SPARQL, возвращающий POI на заданном расстоянии от другой точки. Это строка в запросе, который обрабатывает гео-фильтрацию:Вычислить ограничительную рамку на основе заданных координат и расстояния/радиуса

FILTER (?long > " . ($resource_long - $search_radius) . " && ?long < " . ($resource_long + $search_radius) . " && ?lat > " . ($resource_lat - $search_radius) . " && ?lat < " . ($resource_lat + $search_radius) . " ) 

На данный момент я использую целое (переменный $ search_radius), чтобы ограничить свои результаты, и это будет переводить в градусы. Однако есть две проблемы. Во-первых, использование степеней в качестве параметра не очень удобное для пользователя, а километры - предпочесть. Во-вторых, чем дальше от экватора, тем ближе расстояние между двумя градусами долготы. Это, в свою очередь, приведет к меньшему количеству возвращенных результатов. Итак, вопрос: учитывая координату lat/long, как я могу вычислить ограничивающий прямоугольник на основе заданного радиуса/расстояния в км?

ответ

1

Используйте радианы для всего

затем

$radius = $distance/ 6371.01; //6371.01 is the earth radius in KM 
    $minLat = $lat - $radius; 
    $maxLat = $lat + $radius; 
    $deltaLon = asin(sin($radius)/cos($lat)); 
    $minLon = $lon - $deltaLon; 
    $maxLon = $lon + $deltaLon; 

Затем преобразовать обратно в градусах, если это необходимо.

Это не работает, если границы пересекаются. Есть классы, которые помогут

https://github.com/anthonymartin/GeoLocation.php

Например

То внешних границ, Вы можете получить внутреннюю ограничивающую площадь, делая умножение на $ радиусе на созе (M_PI_4) для верхнего широчайшего, греха (M_PI_4) для верхнего лона, cos (3 * M_PI_4) для нижнего лата и sin (3 * M_PI_4) для нижней части Lon

+0

Означает ли это, что в результате получается ограничивающая рамка (или окружность) точек, равноудаленных от начальной точки? По-прежнему кажется, что проблема состоит в том, что расстояние между точками более высокой широты меньше расстояния между точками более низкой широты. Мой триггер ржавый, поэтому я могу что-то упустить. –

+0

Дает ограничивающий прямоугольник (или 2, если используется нижний). Поскольку он обрабатывает подавляющее большинство баллов – exussum

+0

Спасибо за ваш ответ, но я не ожидаю ожидаемых результатов. Я создал тестовую среду с картой и сеткой, а также функцию рисования линий между точками, чтобы она давала мне визуальное представление создаваемого ящика. При 0 градусах лат/долго это дает мне хороший квадрат. Моя первоначальная забота заключалась в том, что это будет прямоугольник, который выше и выше по сравнению с его шириной, чем дальше от экватора, который я получаю. Однако результаты, которые я вижу сейчас, представляют собой прямоугольники всех форм. В какой-то момент я также получаю NAN-значение (не-число?) От PHP. –

Смежные вопросы