Xaml Bing地图控件上的地图多段线
我正在开发UWP导航应用程序 我想做什么? 我想在地图控件上绘制多条10的精确多段线。 我想要一个不同的颜色,而其他的是灰色的。 选择任意一条多段线后,新选定的多段线将变为原色,而其他多段线将变灰。类似于地图应用程序的多条路线只是在一个更大的比例,显示运输卡车的运动。 在线上到处都有通过c或codebehind实现多段线的方法,但我想通过XAML实现,因为从codebehind添加10条多段线在事件、不透明度、标记和名称方面没有太大的灵活性 我都试了些什么: 我尝试创建一条附加到mapElement的多段线,但这种方法的问题是,每次都必须删除并重新创建多段线以更改颜色。更多关于这个。而且,这只是一种从代码隐藏实现多段线的好方法 我目前正在做什么: 我在页面中添加了多段线的DataTemplate。参考资料如下:Xaml Bing地图控件上的地图多段线,xaml,bing-maps,uwp-xaml,uwp-maps,Xaml,Bing Maps,Uwp Xaml,Uwp Maps,我正在开发UWP导航应用程序 我想做什么? 我想在地图控件上绘制多条10的精确多段线。 我想要一个不同的颜色,而其他的是灰色的。 选择任意一条多段线后,新选定的多段线将变为原色,而其他多段线将变灰。类似于地图应用程序的多条路线只是在一个更大的比例,显示运输卡车的运动。 在线上到处都有通过c或codebehind实现多段线的方法,但我想通过XAML实现,因为从codebehind添加10条多段线在事件、不透明度、标记和名称方面没有太大的灵活性 我都试了些什么: 我尝试创建一条附加到mapEleme
<DataTemplate x:Key="PolylineDataTemplate" x:DataType="polyLineData:IPolylinePath">
<Polyline Points="{x:Bind Polyline,Mode=OneWay}" Fill="{x:Bind PolylineColor,Mode=OneWay}" Tag="{x:Bind PolylineTag,Mode=OneWay}" StrokeThickness="{x:Bind PolylineThinkness}" />
</DataTemplate>`
<maps:MapControl x:Name="MyMap" >
<maps:MapItemsControl ItemTemplate="{StaticResource PolylineDataTemplate}" ItemsSource="{x:Bind ViewModel.PolylinePoints}"/>
</maps:MapControl>
我只是在MapItems控件中调用它,如下所示:
<DataTemplate x:Key="PolylineDataTemplate" x:DataType="polyLineData:IPolylinePath">
<Polyline Points="{x:Bind Polyline,Mode=OneWay}" Fill="{x:Bind PolylineColor,Mode=OneWay}" Tag="{x:Bind PolylineTag,Mode=OneWay}" StrokeThickness="{x:Bind PolylineThinkness}" />
</DataTemplate>`
<maps:MapControl x:Name="MyMap" >
<maps:MapItemsControl ItemTemplate="{StaticResource PolylineDataTemplate}" ItemsSource="{x:Bind ViewModel.PolylinePoints}"/>
</maps:MapControl>
问题是:
代码运行得非常好。只有多段线不可见。
我以为它很小,所以我看不见。因此,我增加了大小和距离,它只是在左上角显示为一个小圆弧,有一定的间距,没有范围或平移
有人能帮忙吗
只有多段线不可见
首先,您似乎没有为提供属性,默认情况下,它为null。代码段使用“填充”属性设置“颜色”。如果该属性不用于线条的颜色,您可能会发现StrokeThickness的值对多段线没有影响,并且在没有Stroke属性的情况下,将看不到直线。因此,这里的颜色应该绑定到笔划属性
它只是在左上角显示为一个小圆弧
这是因为您通过代码行新建窗口.Posial.PositLoop.At纬度,Loosi.WordNess来构建折线点属性的点。
纬度和经度定义了MapControl上的元素位置,而不是应用程序视图。换句话说,实际上您向PointCollection添加了一个,而不是一个。因此,可能需要通过方法将地质点转换为点
不会得到范围或平移
为此,多段线实际上是一个地图元素,而不是一个地图元素。您应该通过侦听地图缩放事件来控制其地图位置。如果你想让它和地图一起平移,你应该使用。有关此示例,请参考的场景2。但是MapPolyline不能通过绑定直接添加,只能通过代码隐藏
一个完整的简单样本,基于您的测试,如下所示:
XAML
代码隐藏:
public sealed partial class MainPage : Page
{
public List<PolylinePath> polylines { get; set; }
Geopoint SeattleGeopoint = new Geopoint(new BasicGeoposition() { Latitude = 47.604, Longitude = -122.329 });
public MainPage()
{
this.InitializeComponent();
}
private void MyMap_Loaded(object sender, RoutedEventArgs e)
{
MyMap.Center = SeattleGeopoint;
MyMap.ZoomLevel = 16;
}
private void btnaddpolyline_Click(object sender, RoutedEventArgs e)
{
polylines = new List<PolylinePath>()
{
new PolylinePath(MyMap)
{
PolylineColor=new SolidColorBrush(Colors.Red),
PolylineThinkness=3,
PolylineTag="testing",
PolylinePoints = new List<BasicGeoposition>()
{
SeattleGeopoint.Position,
new BasicGeoposition()
{
Latitude = SeattleGeopoint.Position.Latitude + 0.003,
Longitude = SeattleGeopoint.Position.Longitude - 0.003
}
}
}
};
mapitems.ItemsSource = polylines;
}
}
public class PolylinePath
{
public PolylinePath(MapControl MyMap)
{
this.MyMap = MyMap;
}
MapControl MyMap;
public SolidColorBrush PolylineColor { get; set; }
public int PolylineThinkness { get; set; }
public string PolylineTag { get; set; }
public IEnumerable<BasicGeoposition> PolylinePoints { get; set; }
public PointCollection Polyline
{
get
{
PointCollection returnObject = new PointCollection();
//could have used LINQ but wanted to check if the collection is being populated correctly
foreach (var location in PolylinePoints)
{
Point actualpoint;
MyMap.GetOffsetFromLocation(new Geopoint(location), out actualpoint);
returnObject.Add(actualpoint);
}
return returnObject;
}
}
}
谢谢你的回答,但这没那么好用。它也不会缩放或移动它看起来更像是地图上的一个污点。使用只能从codebehind打印的MapPolyline,您能否建议一种方法来打印多条MapPolyline,并在选择一条MapPolyline时更改其颜色?这将非常有帮助。@AdityaSharma,在uwp map控件中没有使MapPloyline处于选中状态的API。看起来您正在寻找更多的强大功能。为此,您可以尝试使用。是一个UWP示例,具有类似的功能,希望您可以参考。感谢您的指导。最后一个简单的问题是,使用Bing地图SDK是否允许提供自定义地图磁贴源?通过矢量或光栅方式?我有一个要显示的热量和运输活动瓷砖层,而不是地图或其他视图。可能吗?这会很有帮助的+1链接。@AdityaSharma,我想答案是肯定的。看起来MapControl也有相关的功能,如果MapControl有,Bind应该可以做到。检查如果您有新的问题,您可以打开新的线程,我们将及时处理它们。感谢您的理解。很抱歉,我延长了时间,但我无法找到在UWP中的地图控件上使用矢量平铺的方法。我确实打开了一个线程,答案完全不同,它使我首先得到矢量图块,然后将它们制作成光栅图块,然后将其用作httpp图块源。你能提供一个更直接的答案吗?
public sealed partial class MainPage : Page
{
public List<PolylinePath> polylines { get; set; }
Geopoint SeattleGeopoint = new Geopoint(new BasicGeoposition() { Latitude = 47.604, Longitude = -122.329 });
public MainPage()
{
this.InitializeComponent();
}
private void MyMap_Loaded(object sender, RoutedEventArgs e)
{
MyMap.Center = SeattleGeopoint;
MyMap.ZoomLevel = 16;
}
private void btnaddpolyline_Click(object sender, RoutedEventArgs e)
{
polylines = new List<PolylinePath>()
{
new PolylinePath(MyMap)
{
PolylineColor=new SolidColorBrush(Colors.Red),
PolylineThinkness=3,
PolylineTag="testing",
PolylinePoints = new List<BasicGeoposition>()
{
SeattleGeopoint.Position,
new BasicGeoposition()
{
Latitude = SeattleGeopoint.Position.Latitude + 0.003,
Longitude = SeattleGeopoint.Position.Longitude - 0.003
}
}
}
};
mapitems.ItemsSource = polylines;
}
}
public class PolylinePath
{
public PolylinePath(MapControl MyMap)
{
this.MyMap = MyMap;
}
MapControl MyMap;
public SolidColorBrush PolylineColor { get; set; }
public int PolylineThinkness { get; set; }
public string PolylineTag { get; set; }
public IEnumerable<BasicGeoposition> PolylinePoints { get; set; }
public PointCollection Polyline
{
get
{
PointCollection returnObject = new PointCollection();
//could have used LINQ but wanted to check if the collection is being populated correctly
foreach (var location in PolylinePoints)
{
Point actualpoint;
MyMap.GetOffsetFromLocation(new Geopoint(location), out actualpoint);
returnObject.Add(actualpoint);
}
return returnObject;
}
}
}