Рассчитать ограничивающую рамку на основе заданных координат и расстояния / радиуса

В 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), чтобы ограничить свои результаты, и это будет переводиться в градусы. Есть, однако, две проблемы с этим. Во-первых, использование градусов в качестве параметра не очень удобно для пользователя, и километры предпочтительнее. Во-вторых, чем дальше от экватора, тем меньше расстояние между двумя градусами долготы. Это, в свою очередь, приведет к меньшему количеству возвращаемых результатов. Итак, вопрос в том; учитывая координаты широта / долгота, как я могу рассчитать ограничивающую рамку на основе заданного радиуса / расстояния в км?

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

Например

Это внешние границы. Вы можете получить квадрат внутренних границ, умножив его на радиус радиуса на cos (M_PI_4) для верхнего lat, sin (M_PI_4) для верхнего lon, cos (3 * M_PI_4) для нижнего lat и sin (3 * M_PI_4) для нижнего лона

1

Другие решения

Других решений пока нет …