2016-10-15 3 views
2

Что касается позиционирования изображений на карте, давая свои оценки, документация Google Maps' гласит:GroundOverlay изображения не поворачивается

Когда изображение рисуются на карте будет повернуто, чтобы соответствовать границам. Если границы не совпадают с исходным соотношением сторон, изображение будет искажено.

Но в моем коде я это:

GroundOverlayOptions goo2 = new GroundOverlayOptions() 
      .image(BitmapDescriptorFactory.fromResource(imgRes)) 
      .positionFromBounds(new LatLngBounds(
        new LatLng(44.415, 8.937), 
        new LatLng(44.42, 8.942) 
      )); 
    mMap.addGroundOverlay(goo2); 

Изображение не поворачивается, но всегда рисуется прямо указывая на север, и перекос. Изменение углов перекрытия просто перегибает больше, и оно никогда не вращается.

Как я могу установить GMaps для его вращения, или существует какой-либо внешний инструмент для его вращения?

ответ

1

Я решил это сам. Я думаю, что документация Google не очень ясна. В нем говорится, что GroundOverlay можно расположить с помощью двух возможных способов:

Есть два способа указать положение основного наложения: Используя LatLng центрировать накладку, и размеры в метрах, чтобы указать размер изображение. Использование LatLngBounds для указания северо-восточного и юго-западного углов изображения. Перед добавлением на карту необходимо указать положение наложения на землю.

Я использовал второй способ или предоставил ему два гео-угла изображения, которые я хотел применить. Неясно, что со вторым методом вращение невозможно, и каждый Несоответствие пропорции будет отображаться с искаженным изображением. На самом деле идея, которую я имел, была именно такой, что, учитывая две точки на равнине, у нас есть ровно одно изображение, которое может соответствовать этим двум точкам без разрыва, но просто вращаясь, я был разочарован, обнаружив, что это не работает.

Однако, если у вас есть достаточно терпения, чтобы вычислить ваш собственный размер в метрах и вращения вашего изображения, вы можете определить один угол, или центр изображения, и использовать первый метод, с помощью LatLng и явно укажите якорь, например (0, 0) для верхнего левого угла или (0,5, 0,5) для центра, высоту изображения в метрах (вот хороший способ его найти: How to convert latitude or longitude to meters?), найдите поворот, используя тригонометрия, и все.

Способ размещения изображения в пикселях here.

Вот мой окончательный код, для памяти:

 BitmapFactory.Options dimensions = new BitmapFactory.Options(); 
     dimensions.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(getResources(), imgRes, dimensions); 
     int imgHeightPixels = dimensions.outHeight; 

     GroundOverlayOptions goo = new GroundOverlayOptions() 
      .image(BitmapDescriptorFactory.fromResource(imgRes)) 
      .position(imgBottomLeftCorner, imgHeightInPixels) 
      .anchor(0, 1) 
      .bearing(imgRotation); 
     mMap.addGroundOverlay(goo); 

Смотрите, что Y координаты на карте растут снизу вверх, в то время как на изображении растут сверху вниз, так что якорь (0,1).

Учитывая два вектора, вот что я сделал, чтобы найти свой угол, и, следовательно, поворот изображения (с использованием вектора из двух координат точек на изображении по сравнению с вектором из тех же двух точек с географическими координатами):

private static double calcDistance(double x1, double y1, double x2, double y2) { 
    return (Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))); 
} 
private static double calcVectorRotation(double x1, double y1, double x2, double y2) { 
    return Math.asin((y1-y2)/calcDistance(x1, y1, x2, y2)); 
} 
0

Как вы уже упоминали и основывались на documentation, если границы не совпадают с исходным соотношением сторон, изображение будет искажено.

Чтобы сохранить соотношение сторон, вы должны использовать android:adjustViewBounds.

Установите это значение true, если вы хотите, чтобы ImageView отрегулировал свои границы, чтобы сохранить соотношение сторон его вытягиваемого.

Пожалуйста, попробуйте добавить следующее в ваш XML:

android:adjustViewBounds="true" 
android:scaleType="fitCenter" 

Вы также можете попробовать предлагаемые реализации кода в этом SO post. Надеюсь, это поможет!

+0

Настоящая проблема заключалась в том, что вращение не включается при использовании этого метода, спасибо вам в любом случае. –

Смежные вопросы