Я запрашиваю данные из бэкэнда (laravel) на основе заданного расстояния между 2 точками latitude
и longitude
, например. Lat = 78,3232 и Long = 65,3234 и расстояние = 30 миль / км, получите ряды в пределах 30 миль.
У меня проблема с distance
.
Я использую react-native-maps
, а увеличение / уменьшение основано на latitudeDelta
и longitudeDelta
, и я не знаю, как рассчитать их радиус / расстояние, когда пользователь увеличивает / для отправки на сервер и получения данных, основанных на точках и радиусе / расстоянии
, в данный момент у меня есть эта функция на стороне клиента. определить, когда извлекать новые данные, когда пользователь меняет регион. но у него есть проблема с жестко заданным кодом distance
(5,0 км)
const _onRegionChangeComplete = (onCompletedregion: Region) => {
if (initialRegion) {
const KMDistance = helper.distance(
initialRegion?.latitude,
initialRegion?.longitude,
onCompletedregion.latitude,
onCompletedregion.longitude,
"K"
);
if (KMDistance > 5.0) {
props.getNearByReports({ // request backend if distance difference more than 5 kilometers
latitude: onCompletedregion.latitude,
longitude: onCompletedregion.longitude
});
}
}
};
helper.distance // получить разницу в расстоянии между начальными точками и после того, как пользователь завершил изменение региона
function distance(
lat1: number,
lon1: number,
lat2: number,
lon2: number,
unit: string
) {
var radlat1 = (Math.PI * lat1) / 180;
var radlat2 = (Math.PI * lat2) / 180;
var theta = lon1 - lon2;
var radtheta = (Math.PI * theta) / 180;
var dist =
Math.sin(radlat1) * Math.sin(radlat2) +
Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = (dist * 180) / Math.PI;
dist = dist * 60 * 1.1515;
if (unit == "K") {
dist = dist * 1.609344;
}
if (unit == "M") {
dist = dist * 0.8684;
}
return dist;
}
Значение distance
жестко закодировано в бэкэнде и во внешнем интерфейсе (что не должно быть), потому что когда пользователь увеличивает / уменьшает, радиус / расстояние также должны измениться. Я не могу рассчитать расстояние от latitudeDelta
и longitudeDelta
// Код внутреннего запроса (упрощенно)
SELECT
id, (
6371 * acos (
cos ( radians(78.3232) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(65.3234) )
+ sin ( radians(78.3232) )
* sin( radians( lat ) )
)
) AS distance
FROM markers
HAVING distance < 5 // hard-coded distance
ORDER BY distance
LIMIT 0 , 20;