UWP mapcontrol AltitudeReferenceSystem wird nicht auf ein Mapitem angewendet
Ich möchte einem MapControl ein Bild hinzufügen. Dies ist der einfache Code:
<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>
Dies ist der zugehörige C # -Code zum Festlegen der 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;
}
}
Dieser Code enthält zwei Probleme:
- Die Standortbindung funktioniert nicht. Ich kann den Bild-URI, die Drehung usw. einstellen, aber durch Ändern des Standorts wird das Bild in der Karte nicht verschoben. Ich habe das Abrufen des Bildobjekts und das direkte Festlegen des Speicherorts gelöst, aber das zweite Problem ist damit nicht gelöst
- Das AltitudeReferenceSystem.Terrain scheint nicht auf die Position Geopoint angewendet zu sein, sodass sich das Bild nicht auf Geländeebene zu befinden scheint. Das Vergrößern und Verkleinern scheint sich also wie in einer 3D-Ansicht um den Punkt zu bewegen.
Vielen Dank im Voraus für jeden Vorschlag. Stefano
BEARBEITEN: Ich habe ein online gefundenes Beispiel ausprobiert und sehe das gleiche Problem.
Dies ist ein Bild a mit geringem Zoom und Sie können den roten Punkt unter der Hauptstraße sehen:
Zoomen Dies ist die reale Position, viel über der Hauptstraße:
Antworten
Die Standortbindung funktioniert nicht. Ich kann den Bild-URI, die Drehung usw. einstellen, aber durch Ändern des Standorts wird das Bild in der Karte nicht verschoben. Ich habe das Abrufen des Bildobjekts und das direkte Festlegen des Speicherorts gelöst, aber das zweite Problem ist damit nicht gelöst
Das Problem ist, dass Sie keine INotifyPropertyChangedSchnittstelle für die GeopointEigenschaft implementiert haben. Die Benutzeroberfläche wird nicht aktualisiert, wenn sich der Wert ändert.
Das AltitudeReferenceSystem.Terrain scheint nicht auf die Position Geopoint angewendet zu sein, sodass sich das Bild nicht auf Geländeebene zu befinden scheint. Das Vergrößern und Verkleinern scheint sich also wie in einer 3D-Ansicht um den Punkt zu bewegen.
Ableiten vom offiziellen Dokument Bemerkungsteil .
Das Höhenreferenzsystem, das für Standortkorrekturen von der Geolocation-API zurückgegeben wird, hängt möglicherweise von der GPS / GNSS-Funkhardware ab. Die meiste moderne Hardware liefert Werte unter Verwendung des Geoid-Referenzsystems, aber Map Control-APIs geben Werte im Elipsoid-System zurück. Informationen dazu, welches Objekt von einem Geopoint-Objekt verwendet wird, finden Sie in der Eigenschaft AltitudeReferenceSystem. Sie sollten eine BasicGeoposition nicht kopieren, ohne auch das zugehörige AltitudeReferenceSystem zu kopieren. Andernfalls ist der Altitude-Wert nicht gültig und kann zu unerwarteten Ergebnissen führen.
Location = new Geopoint(new BasicGeoposition
{
Latitude = 0,
Longitude = 0,
Altitude = 0
},
AltitudeReferenceSystem.Terrain),
Bitte beachten Sie, dass das Rotationszentrum mit dem Kartenzentrum übereinstimmen muss. Ableiten von Stefano Della Valle Lösung.
In meinem Fall habe ich die Übersetzung in der Bilderstellung mit diesen X und Y festgelegt:
Translate = new TranslateTransform { X = -55, Y = -45 },