UWP mapcontrol AltitudeReferenceSystem не применяется к элементу карты

Sep 24 2020

Я хочу добавить изображение в 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-виде.

Заранее благодарим за любое предложение. Стефано

РЕДАКТИРОВАТЬ: Я пробовал образец, найденный в Интернете, и вижу ту же проблему.

Это изображение с небольшим увеличением, на котором вы видите красную точку под главной дорогой:

масштабирование это реальная позиция, намного выше главной дороги:

Ответы

1 NicoZhu-MSFT Sep 25 2020 at 08:43

Привязка местоположения не работает. Я могу установить 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 },