📌  相关文章
📜  如何知道一个 lat lng 是否属于另一个 lat lng (1)

📅  最后修改于: 2023-12-03 14:53:13.585000             🧑  作者: Mango

判断一个 lat lng 是否属于另一个 lat lng

在开发地图相关应用时,我们经常需要判断一个经纬度坐标是否属于一个范围内。这个范围可能是一个经纬度矩形、一个圆形、一个多边形等等。在本文中,我们将介绍如何判断一个经纬度坐标是否属于一个经纬度矩形范围内。

1. 计算经纬度之间的距离

在计算经纬度之间的距离时,我们可以使用 Haversine 公式,它是计算球面距离(大圆距离)的一种方法。其公式如下:

const R = 6371e3 // 地球半径
const φ1 = lat1 * Math.PI/180 // 第一个点的纬度
const φ2 = lat2 * Math.PI/180 // 第二个点的纬度
const Δφ = (lat2-lat1) * Math.PI/180 // 两点纬度之差
const Δλ = (lng2-lng1) * Math.PI/180 // 两点经度之差
const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
         Math.cos(φ1) * Math.cos(φ2) *
         Math.sin(Δλ/2) * Math.sin(Δλ/2)
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
const d = R * c // 地球上两点之间的距离(单位:米)
2. 判断经纬度是否在矩形内

如果我们要判断一个经纬度是否在一个矩形内,可以通过以下代码实现:

function isInRectangle(lat, lng, sw_lat, sw_lng, ne_lat, ne_lng) {
  return lat >= sw_lat && lat <= ne_lat && lng >= sw_lng && lng <= ne_lng
}

其中,sw_latsw_lng 表示矩形的左下角经纬度坐标,ne_latne_lng 表示矩形的右上角经纬度坐标。

3. 完整代码片段
const R = 6371e3 // 地球半径

// 计算两个经纬度坐标之间的距离(单位:米)
function distance(lat1, lng1, lat2, lng2) {
  const φ1 = lat1 * Math.PI/180
  const φ2 = lat2 * Math.PI/180
  const Δφ = (lat2-lat1) * Math.PI/180
  const Δλ = (lng2-lng1) * Math.PI/180
  const a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
           Math.cos(φ1) * Math.cos(φ2) *
           Math.sin(Δλ/2) * Math.sin(Δλ/2)
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
  const d = R * c
  return d
}

// 判断一个经纬度坐标是否在一个经纬度矩形范围内
function isInRectangle(lat, lng, sw_lat, sw_lng, ne_lat, ne_lng) {
  return lat >= sw_lat && lat <= ne_lat && lng >= sw_lng && lng <= ne_lng
}
4. 使用示例
const sw_lat = 40.712778 // 华盛顿的左下角纬度
const sw_lng = -74.005833 // 华盛顿的左下角经度
const ne_lat = 40.773889 // 华盛顿的右上角纬度
const ne_lng = -73.956111 // 华盛顿的右上角经度

const lat1 = 40.722605 // 点1的纬度
const lng1 = -73.987131 // 点1的经度
const lat2 = 40.729315 // 点2的纬度
const lng2 = -73.996962 // 点2的经度
const lat3 = 40.736697 // 点3的纬度
const lng3 = -73.992152 // 点3的经度

console.log(isInRectangle(lat1, lng1, sw_lat, sw_lng, ne_lat, ne_lng)) // true,点1在华盛顿矩形内
console.log(isInRectangle(lat2, lng2, sw_lat, sw_lng, ne_lat, ne_lng)) // true,点2在华盛顿矩形内
console.log(isInRectangle(lat3, lng3, sw_lat, sw_lng, ne_lat, ne_lng)) // true,点3在华盛顿矩形内

以上是判断经纬度坐标是否属于一个经纬度矩形范围内的方法,希望对大家有所帮助。