从 latitudeDelta 和 longitudeDelta 获取 meters/km 中的半径
Getting radius in meters/km from latitudeDelta and longitudeDelta
我正在根据 2 点 latitude
和 longitude
之间的设定距离从后端 (laravel) 请求数据,例如。 Lat= 78.3232 and Long = 65.3234 and distance = 30 miles/kilometers ,获取 30 英里以内的行。
我遇到的问题是 distance
。
我正在使用 react-native-maps
并且缩放 in/out 是基于 latitudeDelta
和 longitudeDelta
我不知道如何计算 radius/distance 其中当用户缩放时 in/out 被发送到后端并根据点和 radius/distance
获取数据
目前,我在客户端有这个功能。确定当用户更改区域时何时获取新数据。但是它有一个硬编码的问题 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
值在后端和前端(不应该)硬编码,因为当用户缩放 in/out 时,radius/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;
latitudeDelta
是屏幕上可见的 degrees
的数量。 1 degree
总是等于大约。 69 miles
,因此您可以使用此 diameter = latitudeDelta * 69
计算当前可见区域的直径(以英里为单位)。这是假设屏幕处于纵向模式,因此 latitudeDelta
是较大的值。如果不是,请改用 longitudeDelta
。希望我正确理解了您的问题,这对您有所帮助。
我正在根据 2 点 latitude
和 longitude
之间的设定距离从后端 (laravel) 请求数据,例如。 Lat= 78.3232 and Long = 65.3234 and distance = 30 miles/kilometers ,获取 30 英里以内的行。
我遇到的问题是 distance
。
我正在使用 react-native-maps
并且缩放 in/out 是基于 latitudeDelta
和 longitudeDelta
我不知道如何计算 radius/distance 其中当用户缩放时 in/out 被发送到后端并根据点和 radius/distance
目前,我在客户端有这个功能。确定当用户更改区域时何时获取新数据。但是它有一个硬编码的问题 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
值在后端和前端(不应该)硬编码,因为当用户缩放 in/out 时,radius/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;
latitudeDelta
是屏幕上可见的 degrees
的数量。 1 degree
总是等于大约。 69 miles
,因此您可以使用此 diameter = latitudeDelta * 69
计算当前可见区域的直径(以英里为单位)。这是假设屏幕处于纵向模式,因此 latitudeDelta
是较大的值。如果不是,请改用 longitudeDelta
。希望我正确理解了您的问题,这对您有所帮助。