Как рисовать стрелки с помощью Mapbox - PullRequest
0 голосов
/ 28 января 2019

С помощью плагина Mapbox Android SDK и аннотаций можно ли добавлять стрелки к строкам?Если нет, есть ли способ предложить направление линии?В идеале я хотел бы иметь два маркера со стрелкой между ними, чтобы пользователь знал, в каком направлении двигаться.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

К сожалению, Mapbox Lines не поддерживают эту функцию.Однако, используя новый Mapbox API v7 и плагин Annotations, вы можете сделать следующее, чтобы получить именно то, что вам нужно.
1. Нарисуйте линию в MapView с помощью LineManager
2. Рассчитайте направление линии вградусы
3. Поверните нарисованную стрелку на рассчитанные градусы (Рисованной может быть стрелка, направленная вверх)
4. Нарисуйте символ в виде карты с помощью SymbolManager.Этот символ будет помещен в середину строки и будет использовать в качестве изображения повернутый чертеж

Просто поместите этот код в любое место действия 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);

}  

Изображение - вышекод рисует это на карте

0 голосов
/ 29 января 2019

Mapbox не поддерживает стрелки из коробки, но вы можете поэкспериментировать с Line#setPattern, который принимает в качестве аргумента имя изображения, добавленного на карту с Style#addImage / MapboxMap#addImage.Вы можете прочитать больше о требованиях к этому образу изображения здесь .В противном случае вам нужно будет развернуть собственное решение, правильно разместив и повернув изображение стрелки (a Symbol) на карте.Вы можете установить это с помощью symbol-placement и icon-rotation-alignment свойств стиля и открытых SymbolManager методов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...