UWP mapcontrol AltitudeReferenceSystem не применяется к элементу карты
Я хочу добавить изображение в MapControl. Это простой код:
<maps:MapControl x:Name="Map"
<maps:MapItemsControl x:Name="mapItems">
<maps:MapItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding ImageSourceUri}"
Loaded="Image_Loaded"
maps:MapControl.Location="{Binding Location }">
<Image.RenderTransform>
<TransformGroup>
<RotateTransform Angle="{Binding Rotate.Angle}"
CenterX="{Binding Rotate.CenterX}"
CenterY="{Binding Rotate.CenterY}"/>
<TranslateTransform X="{Binding Translate.X}"
Y="{Binding Translate.Y}"/>
<ScaleTransform ScaleX="{Binding Scale.ScaleX}"
ScaleY="{Binding Scale.ScaleY}" />
</TransformGroup>
</Image.RenderTransform>
</Image>
</StackPanel>
</DataTemplate>
</maps:MapItemsControl.ItemTemplate>
</maps:MapItemsControl>
</maps:MapControl>
Это связанный код C # для установки ItemSource:
public class InterestPoint
{
public Uri ImageSourceUri { get; set; }
public Geopoint Location { get; set; }
public RotateTransform Rotate { get; set; }
public TranslateTransform Translate { get; set; }
public Point CenterPoint { get; set; }
public ScaleTransform Scale { get; set; }
}
public sealed partial class MainPage : Page
{
private List<InterestPoint> points = new List<InterestPoint>();
private void Map_Loaded(object sender, RoutedEventArgs e)
{
points.Add(new InterestPoint
{
ImageSourceUri = new Uri("ms-appx:///Assets/my_position_red.png"),
Location = new Geopoint(new BasicGeoposition
{
Latitude = 0,
Longitude = 0,
Altitude = 0
},
AltitudeReferenceSystem.Terrain),
Rotate = new RotateTransform
{
Angle = 00,
CenterX = 187 / 2,
CenterY = 0
},
Translate = new TranslateTransform
{
X = 0,
Y = 0
},
Scale = new ScaleTransform
{
ScaleX = 0.3,
ScaleY = 0.3
}
});
mapItems.ItemsSource = points;
}
}
В этом коде есть две проблемы:
- Привязка местоположения не работает. Я могу установить URI изображения, поворот и т. Д., Но изменение местоположения не перемещает изображение на карте. Я решил получить объект изображения и установить непосредственно его местоположение, но это не решает вторую проблему.
- Кажется, что AltitudeReferenceSystem.Terrain не применяется к геоточке местоположения, поэтому изображение кажется не на уровне местности, поэтому увеличение и уменьшение масштаба кажется перемещаемым вокруг точки, как в 3D-виде.
Заранее благодарим за любое предложение. Стефано
РЕДАКТИРОВАТЬ: Я пробовал образец, найденный в Интернете, и вижу ту же проблему.
Это изображение с небольшим увеличением, на котором вы видите красную точку под главной дорогой:
масштабирование это реальная позиция, намного выше главной дороги:
Ответы
Привязка местоположения не работает. Я могу установить URI изображения, поворот и т. Д., Но изменение местоположения не перемещает изображение на карте. Я решил получить объект изображения и установить непосредственно его местоположение, но это не решает вторую проблему.
Проблема в том, что вы не реализовали INotifyPropertyChangedинтерфейс для Geopointсвойства, он не будет обновлять пользовательский интерфейс при изменении значения.
Кажется, что AltitudeReferenceSystem.Terrain не применяется к геоточке местоположения, поэтому изображение кажется не на уровне местности, поэтому увеличение и уменьшение масштаба кажется перемещаемым вокруг точки, как в 3D-виде.
Взять за основу примечания официального документа .
Система отсчета высоты, которая возвращается для определения местоположения из API геолокации, может зависеть от радиооборудования GPS / GNSS. Большинство современного оборудования будет предоставлять значения с использованием справочной системы Geoid, но API управления картой будут возвращать значения в системе Elipsoid. Чтобы узнать, какой из них используется объектом Geopoint, см. Свойство AltitudeReferenceSystem. Вы не должны копировать BasicGeoposition, не скопировав также связанную систему AltitudeReferenceSystem, иначе значение высоты будет недействительным и может привести к неожиданным результатам.
Location = new Geopoint(new BasicGeoposition
{
Latitude = 0,
Longitude = 0,
Altitude = 0
},
AltitudeReferenceSystem.Terrain),
Обратите внимание: центр вращения должен совпадать с центром карты. На основе решения Стефано Делла Валле.
В моем случае я установил перевод при создании изображения с этими X и Y:
Translate = new TranslateTransform { X = -55, Y = -45 },