gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:26:55 26 4
gpt4 key购买 nike

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

我有基本的工作。可以在 Canvas 上绘制墨迹并将它们转换为 map 位置,但我无法获得正确投影到 map 3D 表面上的点。

我正在使用 mapControl。 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 应用程序中确定正确高度的草地上的墨迹:

enter image description here

同样的区域使用Map控件+GetLocationFromOffset,蓝色墨水是标注高度偏移:

enter image description here

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

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

最佳答案

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

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

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

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

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