Проблема с преобразованием из Pixel в LAT/LON
Вопрос
Я использую функцию fromPixels () в OSMDroid (3.05) как SO:
public boolean onScroll(ScrollEvent e) {
//get the scroll's destination
GeoPoint g = (GeoPoint) e.getSource().getProjection().fromPixels(e.getX(), e.getY());
Toast.makeText(e.getSource().getContext(), "in e6: " +
g.getLongitudeE6() + " " + g.getLatitudeE6() + " in deg's" +
convertToDecimalDegrees(g.getLongitudeE6())
+ " " + convertToDecimalDegrees(g.getLatitudeE6()), Toast.LENGTH_LONG).show();}
Я прокручиваю карту где -то около -0.0029109 51.9933734, но в тосте я получаю:
-0.9613029999999999 76.60554499999999, так что, похоже, LAT ушел (преобразование в десятичное значение
градусы в порядке - я просто умножаюсь на 1e -6)
Я использую функцию неправильно?
Из того, что я прочитал, кажется, что мое использование в порядке, я также читал, что была проблема с
эта функция, но это должно быть исправлено сейчас
Заранее спасибо!
Омри
Решение
Я знаю, что эта тема немного старая, но ответ на этот вопрос можно найти на http://code.google.com/p/osmdroid/issues/detail?id=209Точка - это установить максимальную степень карты и ограничить прокрутку в этой степени. Ниже приведена сводка вопроса, упомянутого выше (добавьте код ниже в mapview.java)
protected Rect mScrollableAreaLimit = null;
public void setScrollableAreaLimit(BoundingBoxE6 boundingBox) {
final int worldSize_2 = TileSystem.MapSize(MapViewConstants.MAXIMUM_ZOOMLEVEL) / 2;
// Clear scrollable area limit if null passed.
if (boundingBox == null) {
mScrollableAreaLimit = null;
return;
}
// Get NW/upper-left
final Point upperLeft = TileSystem.LatLongToPixelXY(boundingBox.getLatNorthE6() / 1E6,
boundingBox.getLonWestE6() / 1E6, MapViewConstants.MAXIMUM_ZOOMLEVEL, null);
upperLeft.offset(-worldSize_2, -worldSize_2);
// Get SE/lower-right
final Point lowerRight = TileSystem.LatLongToPixelXY(boundingBox.getLatSouthE6() / 1E6,
boundingBox.getLonEastE6() / 1E6, MapViewConstants.MAXIMUM_ZOOMLEVEL, null);
lowerRight.offset(-worldSize_2, -worldSize_2);
mScrollableAreaLimit = new Rect(upperLeft.x, upperLeft.y, lowerRight.x, lowerRight.y);
}
Теперь вы можете вызвать метод SetScrollableAreAlImit, когда создается представление карты, или вы можете развернуть конструктор с помощью параметра BundingBoxe6.
Надеюсь это поможет.
В дополнение к этому необходимо коррекция на ошибку с двойным нажатием http://code.google.com/p/osmdroid/issues/detail?id=209#c23
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
if (mScroller.isFinished()) {
// This will facilitate snapping-to any Snappable points.
setZoomLevel(mZoomLevel);
} else {
/* correction for double tap */
int targetZoomLevel = getZoomLevel();
if (targetZoomLevel == mZoomLevel)
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
}
postInvalidate(); // Keep on drawing until the animation has
// finished.
}
}