C# UWP MapControl中三维地形曲面上的点投影

C# UWP MapControl中三维地形曲面上的点投影,c#,uwp,geolocation,geospatial,uwp-maps,C#,Uwp,Geolocation,Geospatial,Uwp Maps,我正在使用UWP地图控件(MapControl)和基于的墨迹创建一个windows桌面应用程序 我有基本的工作。可以在画布上绘制墨迹并将其转换为地图位置,但我无法将点正确投影到地图3D曲面上 我用的是地图控制。要将控制空间偏移转换为贴图位置,但无论我使用的高度是多少,点都会偏移到三维网格的上方或下方。我基本上是在模仿内置的windows地图应用程序中的墨迹效果。但由于在绘制每个笔划后都会有一个停顿,我认为这是在3D网格上进行光线投射。Lat/Long是正确的,但高度有偏移 Geopoint Ge

我正在使用UWP地图控件(MapControl)和基于的墨迹创建一个windows桌面应用程序

我有基本的工作。可以在画布上绘制墨迹并将其转换为地图位置,但我无法将点正确投影到地图3D曲面上

我用的是地图控制。要将控制空间偏移转换为贴图位置,但无论我使用的高度是多少,点都会偏移到三维网格的上方或下方。我基本上是在模仿内置的windows地图应用程序中的墨迹效果。但由于在绘制每个笔划后都会有一个停顿,我认为这是在3D网格上进行光线投射。Lat/Long是正确的,但高度有偏移

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);
}
...
这是我在“地图”应用程序中绘制的一片草地上的墨迹,用于确定正确的高度:

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

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


编辑:答案是我是个白痴,我一直在思考距离地球中心米太长的问题,即我认为海拔高度是地图位置的海平面以上的高度,但不是,而是地图上方的点高度。因此,仅将“高度”设置为零是可行的。

第一个问题是,在将墨迹笔划转换为地图多边形时,我没有将AltitudeReferenceSystem传递给Geopath构造函数。完成此操作后,可以将TryGetLocationFromOffset的结果直接传递到多边形


第二个是map控件可能存在的错误。如果地图控件没有占据主窗口的整个高度,您会看到TryGetLocationFromOffset与墨水笔划绘制位置之间的像素偏移。

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

如果您将所有高度重置为0,并且输入的线的高度参考为surface,它将始终将线放置在曲面上,但这可能与您的墨迹不匹配


这里实际上可能有一个bug-如果上面的代码段将从GetLocationFromOffset返回的地理点传递到多段线,它应该显示在同一像素处(您应该能够往返值)。这些地质点的AltitudeReferenceSystem和返回的值是多少?

NP,上次我尝试时,我不得不等待2天,但显然我现在就可以做到。我尝试了所有不同的参考系统,都给出了类似的结果。我现在使用TryGetLocationFromOffset。是的,在使用GetLocationFromOffset获取地图位置(返回给定参考系统的高度)和绘图标记等(仅提供给定点处高度的偏移量)之间,与预期高度略有差异。OHHHH可以将AltitudeReferenceSystem传递给Geopath构造函数。这和预期的一样,但我仍然看到从ink到Geopathann的距离有几米的跳跃,偏移量是因为我在地图控件上方有一个命令栏。删除该选项,使地图控件使用整个应用程序窗口,并且从TryGetLocationFromOffset/Surface返回的坐标与Geopath/Surface的坐标为1:1。所以,一个bug或者我的xaml都有问题,但它是一个非常简单的xaml文件,听起来像是一个xaml布局问题。传递给API的偏移量是相对于map控件窗口的,因此您的命令栏似乎覆盖了map控件,导致偏移量不是相对于完整控件的。我同意这可能是XAML问题,但作为测试,我删除了命令栏,只是手动将map控件变小,并获得了相同的结果。需要注意的一点是这是因为,虽然MapPolyline可以正确处理高度,但MapPolygons不能。将始终绘制到地形曲面。