首页 > 解决方案 > 如何从 react-native-maps 中获取折线的长度(公里)?

问题描述

所以我创建了一张地图,里面有一条折线:

import React from 'react';
import MapView, {Polyline} from 'react-native-maps';

function TrackDetailScreen({navigation}) {

return (
    <>
        <MapView    
            initialRegion={
                { 
                    [{latitude: 23,longitude: 83 },{latitude: 25,longitude: 86 }, ],
                    latitudeDelta: 0.01,
                    longitudeDelta: 0.01,
                  


                }
            }
            > 
            <Polyline  strokeColor='#fc5e13'
           strokeWidth={5} coordinates={track.locations.map(loc => loc.coords)}/>
        </MapView>
    </>
)
}

export default TrackDetailScreen;

现在我想弄清楚我刚刚建立的折线的距离。

我该如何解决?

标签: javascriptreactjsreact-native

解决方案


在给定坐标的情况下计算两点之间距离的正确方法是使用半正弦公式,因为您必须考虑地球曲率。

function haversine(coords1, coords2) {
  const R = 6371e3; // metres
  const φ1 = coords1.lat * Math.PI/180; // φ, λ in radians
  const φ2 = coords2.lat * Math.PI/180;
  const Δφ = (coords2.lat-coords1.lat) * Math.PI/180;
  const Δλ = (coords2.lon-coords1.lon) * 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));

  return R * c; // in metres
}

完全披露:我从这里偷了这段代码:https: //www.movable-type.co.uk/scripts/latlong.html

一旦你有了这个,你可以简单地迭代你的折线点并逐步计算总和:

let totalDistance = 0
for (let i = 1; i < track.locations.length; i++) {
  totalDistance += haversine(track.locations[i-1].coords, track.locations[i].coords)
}

值得注意的是,对于短距离,您可以通过简单的几何形状获得距离的估计,而无需考虑地球曲率。如果您的折线包含​​大量点,并且它们之间的距离很短,那么计算速度应该会更快,并且可能会更好。

function distance(coords1, coords2) {
   const latDiffSquared = Math.pow((coords1.lat - coords2.lat), 2)
   const lonDiffSquared = Math.pow((coords1.lon - coords2.lon), 2)
   return Math.sqrt(latDiffSquared + lonDiffSquared)
}

推荐阅读