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