【问题标题】:Getting radius in meters/km from latitudeDelta and longitudeDelta从 latitudeDelta 和 longitudeDelta 获取以米/公里为单位的半径
【发布时间】:2020-03-08 06:01:32
【问题描述】:

我根据latitudelongitude 两个点之间的设定距离从后端(laravel)请求数据,例如。 Lat= 78.3232 和 Long = 65.3234 和 distance = 30 英里/公里,得到 30 英里内的行。

我遇到的问题是distance

我正在使用react-native-maps,放大/缩小基于latitudeDeltalongitudeDelta,当用户放大/缩小时我不知道如何计算它们的半径/距离发送到后端并根据点和半径/距离获取数据

目前,我在客户端有这个功能。确定当用户更改区域时何时获取新数据。但它有一个硬编码的问题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 值在后端和前端(不应该)中硬编码,因为当用户放大/缩小时,半径/距离也应该改变。我无法计算到latitudeDeltalongitudeDelta 的距离

// 后端查询代码(简体)

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 的半径/距离!或者也许我把这一切都弄错了,我应该以不同的方式处理这个问题。不确定
  • 但这就是你的代码的作用,对吧?
  • 目前的代码没有考虑latitudeDeltalongitudeDelta,后端也没有,我已经将它们硬编码为我想要的值/缩放。只要用户不缩小,它就可以正常工作。如果他将地图拖动到不同的区域,则开始获取数据的请求(当拖动距离超过 5 公里时)。但是如果用户缩小,则对地图的少量拖动会产生巨大的距离差异(> 5)。这是在推动我认为我应该根据距离以外的东西来获取我的数据,或者应该动态设置距离并将其发送到后端
  • 所以当用户缩小时,我应该以某种方式将其转换为更远的距离,例如。 50 KM ,后端获取半径 50 KM 周围的数据,我希望现在清楚了

标签: mysql laravel react-native latitude-longitude react-native-maps


【解决方案1】:

latitudeDelta 是屏幕上可见的degrees 的数量。 1 degree 始终等于大约。 69 miles,因此您可以使用此diameter = latitudeDelta * 69 计算当前可见区域的直径(以英里为单位)。这是假设屏幕处于纵向模式,因此,latitudeDelta 是较大的值。如果没有,请改用longitudeDelta。我希望我正确理解了您的问题,这很有帮助。

【讨论】:

  • 我想这就是我想要的,我不清楚 latitudeDelta 实际代表什么。我只希望你的回答是正确的。我对其进行了测试,它似乎在放大/缩小时给出了屏幕上可见区域的直径值。谢谢
  • 如果是在球体上,则需要通过 cos(latitude) 调整 longitudeDelta。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多