gpt4 book ai didi

c# - NetTopologySuite Distance 在 .net Core 3 中返回奇怪的结果

转载 作者:行者123 更新时间:2023-12-03 17:02:11 27 4
gpt4 key购买 nike

在我的 .Net Core 3 API 中,我设置了这样的用户位置:

userDetails.Location = new Point(userDetails.latitude, userDetails.longitude)
{
SRID = 4326
};


当我尝试让用户进入给定半径时
double radiusMeters = userSettings.Radius;
var usersWithinRadius = Context.UserDetails.Where(ud => ud.Location.Distance(userDetails.Location) <= radiusMeters).ToList();

例如,当我将半径设置为 75000 米时,当用户位置为 (32.600248, 35.1225) 时,它返回一个超过 90km 距离的点 (31.78562, 35.115335)

我究竟做错了什么?

最佳答案

it returns a point that's more than 90km distance



请注意,您传入的参数是 经纬度其单位是度。结果,返回的值不是 中的长度米 .您可能会发现, (35.1225, 32.600248) 之间的距离和 (35.115335,31.78562)返回者 Distance()方法是 0.81465950900299355 .基本上,它等于:
Math.sqrt((35.1225 -35.115335)*(35.1225 -35.115335) + (32.600248 - 31.78562)*(32.600248 - 31.78562))

如果两点是 足够接近 ,您可以将其单位视为 弧度大致:

enter image description here

假设地球是 完美球体Earth Circumference40,075.017 km .

根据 How Far Is One Degree :

arc length

我们可以 大致计算距离如下:
distance = Circumference * d /360 
= 40,075.017 km * 0.81465950900299355 / 360
= 90.69km

Where()条件 0.81465950900299355 < 75000true ,您将获得一个距离超过 90 公里的点。

请注意,我们假设这里的两点足够接近。为了计算出准确的距离,我们需要对 (lon,lat) 进行变换。在我们调用 Distance() 之前坐标到投影坐标系方法。

引自 Spatial Data -EF Core

This means that if you specify coordinates in terms of longitude and latitude, some client-evaluated values like distance, length, and area will be in degrees, not meters. For more meaningful values, you first need to project the coordinates to another coordinate system using a library like ProjNet4GeoAPI before calculating these values.

关于c# - NetTopologySuite Distance 在 .net Core 3 中返回奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363982/

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