c# - 在 UWP MapControl 中将点投影到 3D 地形表面

标签 c# uwp geolocation geospatial uwp-maps

我正在使用 UWP map 控件 (MapControl) 和基于 this blog post 的墨迹书写创建 Windows 桌面应用程序.

我已经掌握了基础知识。可以在 Canvas 上绘制墨迹并将其转换为 map 位置,但我无法将点正确投影到 map 3D 表面上。

我正在使用 map 控件。 GetLocationFromOffset将控制空间偏移转换为 map 位置,但无论我使用什么 AltitudeReferenceSystem,这些点都会在 3D 网格上方或下方偏移。我基本上是在尝试模拟内置 Windows map 应用程序中的墨迹书写方式。但由于绘制每个笔划后有一个暂停,我认为它正在将一些光线转换到 3D 网格上。纬度/经度是正确的,但海拔高度有偏移。

Geopoint GeopointFromPoint(Point point)
{
   Geopoint geoPoint = null;
   this.map.GetLocationFromOffset(point, AltitudeReferenceSystem.Geoid, out geoPoint); // Tried all alt ref systems here
   return (geoPoint);
}
...
BasicGeoposition curP;
foreach (var segment in firstStroke.GetRenderingSegments())
{
   curP = GeopointFromPoint(segment.Position).Position;
   geoPoints.Add(curP);
}
...

这是我在 map 应用程序中围绕一 block 草地进行的墨迹,它确定了正确的高度:

enter image description here

使用 map 控件 + GetLocationFromOffset 的同一区域,蓝色墨水是显示高度偏移的注释:

enter image description here

如何将屏幕/控件空间坐标投影到 UWP map 控件中的 3D 网格上并获得正确的高度?

编辑:答案是我是个白痴,长期以来一直以距离地球中心的米为单位思考,即我认为海拔是 map 位置的海拔高度,但是不是,它是 map 上方的点高度。因此,只需将高度设置为零即可。

最佳答案

仅将高度设置为零仍可能会产生意想不到的结果。对 GetLocationFromOffset 的调用就是您的问题所在。 (顺便说一句,您确实应该使用 TryGetLocationFromOffset 并处理失败情况 - 并不总是可以将屏幕偏移映射到某个位置,例如当您单击地平线上方时)。 您传递的 AltitudeReference 告诉控件要与什么相交。您可以将其视为在该屏幕像素处射入 3D 场景的光线。光线将首先与表面相交,然后是地形,然后是大地水准面或椭球体,具体取决于您所在的位置。您要求与大地水准面相交,这可能不是您真正想要的。您可能需要与墨水盒表面相交。文档对于这个参数的作用并不是很清楚,可能应该更新。

如果您将所有海拔高度重置为 0,并使用传入的线的表面高度引用,则它始终会将线放置在表面上,但这可能与您的墨水不匹配。

这里实际上可能存在一个错误 - 如果上面的代码片段将从 GetLocationFromOffset 返回的 Geopoint 传递到折线,它应该出现在同一像素处(您应该能够往返值)。这些 GeoPoints 返回的 AltitudeReferenceSystem 和值是多少?

关于c# - 在 UWP MapControl 中将点投影到 3D 地形表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62080521/

相关文章:

c# - 预填充表单时避免触发验证

c# - Microsoft.NET.CoreRuntime 的 SOS 调试扩展

ios - 如何在 swift 4 中使用 google api 计算两个位置之间的距离

php - 需要所有已知国家的州缩写

javascript - 如何使用地理位置而不是纯文本来操作表单输入

c# - 检查指定日期何时发生的最佳方法

c# - 在 C# 中的 keydown 上播放键值

c# - 加入集合和列表在 C# Mongodb 强类型驱动程序中抛出 NotSupportedException

xaml - 使用 MergedDictionaries (UWP) 拆分 generic.xaml 文件的正确语法是什么

cordova - 为什么我用 Apache Cordova 构建的 Windows 10 通用应用程序的任务栏图标的大小比其他应用程序小