gpt4 book ai didi

javascript - 半正矢公式仍然不起作用

转载 作者:行者123 更新时间:2023-12-02 16:50:20 26 4
gpt4 key购买 nike

我用harversine公式来计算点是否在圆内/外,但它仍然 react 点在圆内,它一定在圆外。看看我的代码。

    var xp = 7.070562277980709;  // point_lat
var yp = 125.60755640475463; // point_long
var radius = 63.942490126300555; // radius
var xc = 7.070479805752504; // circle_lat
var yc = 125.60851603754577; // circle_lon

var r = radius / 1000; // convert meter to kilometer
var dlat = (xp - xc) * (Math.PI / 180);
var dlng = (yp - yc) * (Math.PI / 180);
var a = ((Math.sin(dlat / 2)) * (Math.sin(dlat / 2)));
var b = ((Math.cos(xp * (Math.PI / 180))) * (Math.cos(xc * (Math.PI / 180))));
var c = ((Math.sin(dlng / 2)) * (Math.sin(dlng / 2)));
var d = a + (b * c);

var e = 2 * Math.atan2(Math.sqrt(d), Math.sqrt(1 - d));
var f = r * e;
if (f < r) {
alert('INSIDE');
} else if(f > r) {
alert('OUTSIDE');
}

这个函数应该提醒我“OUTSIDE”。这段代码有什么问题吗?感谢您的帮助。

所有点均由谷歌地图给出。而且google map 的半径默认单位是米,所以我把它转换成公里。

最佳答案

在您使用的公式中,半径是地球的半径。该公式给出了地球表面上两点之间的大圆(即最短)距离。

使用 63.942490126300555 作为半径,然后将其除以 1,000,得到的 f 为 0.0000010667905687961212 km 或 0.001 m 或 1 mm。

用更合适的值替换 r(例如 6,371),得到的 f 为 0.10629117978319975 公里,即 106.291 米。

用另一种方式计算,由于坐标靠近赤道,您可以将距离计算为地球周长的分数并使用简单的三 Angular 学。

以 40,000 公里为周长,纬度差为 0.0000824722282057877 度,即:

dLat = 40,000 km * 0.0000824722282057877 / 360

dLat = 0.009163580911754189 km
= 9.164 m

对于经度:

dLong = 0.0009596327911367553;
dist = 40000 * 0.0009596327911367553 / 360;
= 0.10662586568186169 km
= 106.626 m

还有一些基本的三 Angular 函数:

dist = sqrt(9.164^2 + 106.626^2)
= 0.10629117978319975 km
= 106.291 m

这与另一个结果非常接近。对于小距离,您可以非常成功地使用该方法,只需将经度差得出的距离乘以纬度的余弦(因为当您靠近极点时, Angular 距离会变短)。

我的评论只是对你“meter”拼写的 mock 。 :-)

编辑

这是一个根据 Movable Type Scripts 处的半正弦公式返回大圆距离的函数:

// Return the great circle distance between two points on
// the Earth's surface given their latitude and longitude in
// decimal degrees. Only approximate.
function greatCircleDistance(lat0, lon0, lat1, lon1) {

// Approximate Earth radius
var earthRadius = 6.371e3; // 6,371,000 m

// Convert args to radians
for (var i=arguments.length; i; ) {
arguments[--i] = arguments[i] * Math.PI/180;
}

// Do calculation
var dLat = lat1 - lat0;
var dLon = lon1 - lon0;

var a = Math.pow(Math.sin(dLat/2),2) +
Math.cos(lat0) * Math.cos(lat1) *
Math.pow(Math.sin(dLon/2),2);

var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

return earthRadius * c;
}

var xp = 7.070562277980709; // point_lat
var yp = 125.60755640475463; // point_long

var xc = 7.070479805752504; // circle_lat
var yc = 125.60851603754577; // circle_lon

console.log(greatCircleDistance(xp, yp, xc, yc)); // 0.10629117978188952

所以你可以这样做:

if ( greatCircleDistance(xp, yp, xc, yc) > 63) { 
console.log('outside');
} else {
console.log('inside');
}

关于javascript - 半正矢公式仍然不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26709263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com