Zio*_*Hai 5 c# nettopologysuite asp.net-core .net-core-3.0
在我的 .Net Core 3 API 中,我设置了这样的用户位置:
userDetails.Location = new Point(userDetails.latitude, userDetails.longitude)
{
SRID = 4326
};
Run Code Online (Sandbox Code Playgroud)
当我尝试让用户进入给定半径时
double radiusMeters = userSettings.Radius;
var usersWithinRadius = Context.UserDetails.Where(ud => ud.Location.Distance(userDetails.Location) <= radiusMeters).ToList();
Run Code Online (Sandbox Code Playgroud)
例如,当我将半径设置为 75000 米时,当用户位置为 (32.600248, 35.1225) 时,它返回一个超过 90km 距离的点 (31.78562, 35.115335)
我究竟做错了什么?
它返回一个距离超过 90 公里的点
请注意,您传入的参数是纬度和经度,其单位是度。因此,返回的值不是以Meters为单位的长度。您可能会发现,方法返回的(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))
Run Code Online (Sandbox Code Playgroud)
如果两点足够接近,则可以粗略地将其单位视为弧度:
假设地球是一个完美的球体,地球周长是40,075.017 km。
根据一度有多远:
我们可以粗略地计算出距离:
distance = Circumference * d /360
= 40,075.017 km * 0.81465950900299355 / 360
= 90.69km
Run Code Online (Sandbox Code Playgroud)
由于Where()条件0.81465950900299355 < 75000是true,您将获得距离超过 90 公里的点。
请注意,我们假设这两个点足够接近。为了计算准确的距离,我们需要(lon,lat)在调用该Distance()方法之前将坐标转换为投影坐标系。
这意味着,如果您以经度和纬度指定坐标,则一些客户评估的值(例如距离、长度和面积)将以度为单位,而不是米。对于更有意义的值,您首先需要使用 ProjNet4GeoAPI 等库将坐标投影到另一个坐标系,然后再计算这些值。
| 归档时间: |
|
| 查看次数: |
1201 次 |
| 最近记录: |