Проецирование точек на трехмерную поверхность ландшафта в UWP MapControl - PullRequest
2 голосов
/ 29 мая 2020

Я создаю приложение windows для настольных ПК с помощью элемента управления UWP Map (MapControl) и рукописного ввода на основе этого сообщения в блоге .

У меня есть основы работы. может рисовать чернила на холсте и преобразовывать их в местоположения карты, но я не могу правильно проецировать точки на трехмерную поверхность карты.

Я использую mapControl. GetLocationFromOffset для преобразуйте смещение контрольного пространства в положение карты, но независимо от того, какую систему AltitudeReferenceSystem я использую, точки смещены выше или ниже 3D me sh. Я в основном пытаюсь имитировать работу рукописного ввода во встроенном приложении windows Maps. Но поскольку после рисования каждого штриха есть пауза, я думаю, что он выполняет некоторую трансляцию лучей на трехмерное изображение sh. Широта / долгота верны, но высота имеет смещение.

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);
}
...

Это мое рисование вокруг участка травы в приложении «Карты», которое определяет правильную высоту:

enter image description here

И та же область с использованием элемента управления Map + GetLocationFromOffset, синие чернила - это аннотация, показывающая смещение высоты:

enter image description here

Как Могу ли я спроецировать координаты экрана / контрольного пространства на трехмерное изображение sh в элементе управления UWP Map и получить правильную высоту?

Изменить: И ответ - я идиот, Я слишком долго думал о метрах от центра Земли, ie Я думал, что высота - это высота над уровнем моря на карте, но это не так, это высота точек над картой. Так что установка высоты на ноль работает.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Даже установка нулевой высоты может привести к неожиданным результатам. Вызов GetLocationFromOffset - вот где ваша проблема. (вам действительно следует использовать TryGetLocationFromOffset BTW и обрабатывать случаи сбоя - не всегда возможно сопоставить смещение экрана с местоположением, например, когда вы щелкаете над горизонтом). Передаваемая вами AltitudeReference сообщает элементу управления, с чем пересекаться. Вы можете представить это как луч, который вы стреляете в 3D-сцену в этом пикселе экрана. Луч сначала пересечет поверхность, затем рельеф, затем геоид или эллипсоид, в зависимости от того, где вы находитесь. Вы просили пересечение с геоидом, что, вероятно, было не тем, что вам действительно нужно. Возможно, вам понадобится пересечение с поверхностью для чернильного ящика. В документации не очень ясно, что делает этот параметр, и, вероятно, его следует обновить. на поверхности, но это может не совпадать с вашими чернилами.

На самом деле здесь может быть ошибка - если ваш фрагмент кода выше передавал Geopoint, возвращенный из GetLocationFromOffset, в полилинию, он должен появиться в том же пикселе ( вы должны иметь возможность получать значения туда и обратно). Какая была система AltitudeReferenceSystem и какое значение были возвращены для этих GeoPoints?

1 голос
/ 29 мая 2020

Первая проблема заключалась в том, что я не передавал AltitudeReferenceSystem конструктору Geopath при переводе чернильных штрихов в полигоны карты. Как только вы это сделаете, вы можете передать результат TryGetLocationFromOffset непосредственно полигонам.

Вторая - возможная ошибка с элементом управления картой. Если элемент управления картой не занимает всю высоту главного окна, вы видите смещение в пикселях между значением TryGetLocationFromOffset и местом рисования чернильного штриха.

...