【发布时间】:2020-03-08 06:01:32
【问题描述】:
我根据latitude 和longitude 两个点之间的设定距离从后端(laravel)请求数据,例如。 Lat= 78.3232 和 Long = 65.3234 和 distance = 30 英里/公里,得到 30 英里内的行。
我遇到的问题是distance。
我正在使用react-native-maps,放大/缩小基于latitudeDelta 和longitudeDelta,当用户放大/缩小时我不知道如何计算它们的半径/距离发送到后端并根据点和半径/距离获取数据
目前,我在客户端有这个功能。确定当用户更改区域时何时获取新数据。但它有一个硬编码的问题distance (5.0 KM)
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;
【问题讨论】:
-
您有问题吗?
-
@Strawberry,是的,如何计算 latitudeDelta 和 longitudeDelta 的半径/距离!或者也许我把这一切都弄错了,我应该以不同的方式处理这个问题。不确定
-
但这就是你的代码的作用,对吧?
-
目前的代码没有考虑
latitudeDelta和longitudeDelta,后端也没有,我已经将它们硬编码为我想要的值/缩放。只要用户不缩小,它就可以正常工作。如果他将地图拖动到不同的区域,则开始获取数据的请求(当拖动距离超过 5 公里时)。但是如果用户缩小,则对地图的少量拖动会产生巨大的距离差异(> 5)。这是在推动我认为我应该根据距离以外的东西来获取我的数据,或者应该动态设置距离并将其发送到后端 -
所以当用户缩小时,我应该以某种方式将其转换为更远的距离,例如。 50 KM ,后端获取半径 50 KM 周围的数据,我希望现在清楚了
标签: mysql laravel react-native latitude-longitude react-native-maps