javascript - 如何从 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;
现在我想弄清楚我刚刚建立的折线的距离。
我该如何解决?
解决方案
在给定坐标的情况下计算两点之间距离的正确方法是使用半正弦公式,因为您必须考虑地球曲率。
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)
}
推荐阅读
- python - Selenium Python 性能日志:获取类似网页测试的统计信息?
- html - 如何将第二行中的文本从第一行单词的下方开始对齐。(不在 i 标签下方)
- python - mglearn.plots.plot_2d_separator (eps=0.5) ,那是什么,“eps”?
- azure-data-explorer - UNION中多个表的排列
- flutter - 我正在使用一个映射,其中键是字符串,值是列表,在这里我将值和键传递给我的提供者进行更新,但它没有更新
- java - MapStruct + Kotlin/JVM(v1.5.10) 错误:返回类型 Flow
是一个抽象类或接口 - node.js - Nodemailer 无法向 Outlook 地址发送电子邮件
- python-2.7 - 使用 gitbash 工具的 GKE 集群
- typescript - 无法在 vscode 中安装 tsconfig json
- netbeans - NetBeans 输出控制台:“行太长,请切换到包装模式以查看整行”。解决错误