簡體   English   中英

在 UWP MapControl 中將點投影到 3D 地形表面

[英]Projecting points onto 3D terrain surface in UWP MapControl

我正在使用 UWP Map 控件(MapControl)和基於此博客文章的墨跡創建 windows 桌面應用程序。

我有基本的工作。 可以在 canvas 上繪制墨水並將它們轉換為 map 位置,但我無法正確投影到 map2466AA96369ABBBA5 表面上的點。

我正在使用地圖控制。 GetLocationFromOffset將控制空間偏移量轉換為 map position 但無論使用什么 AltitudeReferenceSystem,我使用的點都在 3D 網格上方或下方偏移。 我基本上是在嘗試模擬內置 windows Maps 應用程序中墨跡的工作方式。 但是由於在繪制每個筆畫后都會暫停,我認為它正在對 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);
}
...

這是我在 Maps 應用程序中的一片草地上的墨跡,它確定了正確的高度:

在此處輸入圖像描述

而同一區域使用Map控件+GetLocationFromOffset,藍色墨水為標注高度偏移:

在此處輸入圖像描述

如何將屏幕/控制空間坐標投影到 UWP Map 控件中的 3D 網格上並獲得正確的高度?

編輯:答案是我是個白痴,一直在考慮距離地球中心的米太久,即我認為高度是 map 位置的海拔高度,但事實並非如此,它是 map 上方的點高度. 因此,只需將高度設置為零即可。

第一個問題是在將墨跡筆划轉換為 map 多邊形時,我沒有將 AltitudeReferenceSystem 傳遞給 Geopath 構造函數。 完成此操作后,您可以將 TryGetLocationFromOffset 的結果直接傳遞給多邊形。

其次是 map 控件可能存在的錯誤。 如果 map 控件沒有占據主 window 的整個高度,您會看到 TryGetLocationFromOffset 和墨跡筆划繪制位置之間的像素偏移。

僅將高度設置為零仍可能產生意想不到的結果。 對 GetLocationFromOffset 的調用是您的問題所在。 (您應該真正使用 TryGetLocationFromOffset BTW 並處理失敗情況 - 並非總是可以 map 將屏幕偏移到某個位置,例如當您在地平線上方單擊時)。 您傳遞的 AltitudeReference 是告訴控件與什么相交。 您可以將其視為您在該屏幕像素處向 3D 場景拍攝的光線。 射線將首先與表面相交,然后是地形,然后是大地水准面或橢球,具體取決於您所在的位置。 您要求與大地水准面相交,這可能不是您真正想要的。 您可能需要與墨箱表面的交點。 文檔對這個參數的作用並不十分清楚,並且可能應該更新。

如果您將所有高度重置為 0,並為您傳入的線使用表面的高度參考,它將始終將線放在表面上,但這可能與您的墨水不匹配。

這里實際上可能存在一個錯誤 - 如果您上面的代碼片段將從 GetLocationFromOffset 返回的 Geopoint 傳遞給折線,它應該出現在相同的像素處(您應該能夠往返值)。 這些 GeoPoints 返回的 AltitudeReferenceSystem 和值是多少?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM