如何使用Mapbox绘制箭头

问题描述 投票:1回答:2

使用Mapbox Android SDK和Annotation插件,无论如何都要添加箭头到行?如果没有,有没有办法建议一条线的方向?理想情况下,我希望在它们之间有两个带箭头的标记,以便用户知道要行进的方向。

谢谢

java android mapbox
2个回答
2
投票

Mapbox不支持开箱即用的箭头,但您可以尝试使用Line#setPattern作为参数,该参数是使用Style#addImage / MapboxMap#addImage添加到地图的图像的名称。您可以阅读有关该模式图像here的要求的更多信息。否则,您需要通过在地图上正确定位和旋转箭头图形(Symbol)来推出自定义解决方案。您可以使用symbol-placementicon-rotation-alignment样式属性以及暴露的SymbolManager methods进行设置。


0
投票

不幸的是,Mapbox Lines不支持此功能。但是,使用新的Mapbox API v7和Annotations Plugin,您可以执行以下操作以获得所需内容。 1.使用LineManager在Mapview上绘制一条线 2.以度为单位计算线的方位 3.按计算的度数旋转可绘制箭头(可绘制的箭头可以是向上的箭头) 4.使用SymbolManager在Mapview上绘制符号。此符号将放置在该行的中间,并将旋转的drawable用作图像

只需将此代码放在Mapview活动中的任何位置即可

public void createLineAndArrow(){  

  //Declare the coordinates of the two points of the line
  float latitude1  = 34.1f;
  float longitude1 = 33.2f;
  float latitude2  = 35f;
  float longitude2 = 34.5f;

  //Calculate bearing of line
  double lat1Rad = Math.toRadians(latitude1);
  double lat2Rad = Math.toRadians(latitude2);
  double deltaLonRad = Math.toRadians(longitude2 - longitude1);
  double y = Math.sin(deltaLonRad) * Math.cos(lat2Rad);
  double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - Math.sin(lat1Rad) * 
             Math.cos(lat2Rad) * Math.cos(deltaLonRad);
  double bearing =  (Math.toDegrees(Math.atan2(y,x))+360)%360;

  //Draw the Line
  List<LatLng> lineVertices = new ArrayList<>();
  lineVertices.add(new LatLng(latitude1,longitude1));
  lineVertices.add(new LatLng(latitude2,longitude2));
  LineOptions lineOptions = new LineOptions().withLatLngs(lineVertices)
                        .withLineColor(ColorUtils.colorToRgbaString(Color.MAGENTA))
                        .withLineWidth(3f);
  LineManager lineManager = new LineManager(mapView, mapboxMap,mapboxMap.getStyle());
  lineManager.create(lineOptions);

  //Rotate the drawable
  Bitmap bmapOriginal = BitmapFactory.decodeResource(getResources(), 
                        R.drawable.arrowup);
  final Bitmap bmap = bmapOriginal.copy(Bitmap.Config.ARGB_8888, true);
  Matrix matrix = new Matrix();
  matrix.postRotate((float)bearing);
  Bitmap rotatedBitmap = Bitmap.createBitmap(bmap , 0, 0, bmap.getWidth(), 
                         bmap.getHeight(), matrix, true);
  Drawable d = new BitmapDrawable(getResources(), rotatedBitmap);

  //Add the drawable to the selected mapbox style
  mapboxMap.getStyle().addImage("rotatedImage",
                        BitmapUtils.getBitmapFromDrawable(d),
                        true);

 //Draw the Symbol in the middle of the Line
 SymbolOptions symbolOptions = new SymbolOptions().withIconImage("rotatedImage")
                          .withGeometry(Point.fromLngLat((longitude2+longitude1)/2, 
                          (latitude2+latitude1)/2));

 SymbolManager symbolManager = new SymbolManager(mapView, mapboxMap, 
                               mapboxMap.getStyle());
 symbolManager.create(symbolOptions);

}  

Image - The above code draws this on a mapview

© www.soinside.com 2019 - 2024. All rights reserved.