toPixels () возвращает пиксели плиток вместо экрана - PullRequest
2 голосов
/ 12 марта 2012

У меня есть приложение для Android, которое показывает карты с помощью OSMDroid.Я хочу получить проекционные пиксели GeoPoint на экране, а не на плитках.Рассмотрим следующий фрагмент кода:

Projection projection = getProjection();
GeoPoint geoPoint1 = (GeoPoint)projection.fromPixels(0, 0);  
Point pixelsPoint = new Point();
projection.toPixels(geoPoint1, pixelsPoint);
GeoPoint geoPoint2 = (GeoPoint)projection.fromPixels(pixelsPoint.x, pixelsPoint.y);

Я бы хотел, чтобы geoPoint1 было равно geoPoint2.Вместо этого я получаю 2 совершенно разных "GeoPoint".По моему мнению, проблема в этой строке:

projection.toPixels(geoPoint1, pixelsPoint);

Переменная out pixelsPoint заполняется значениями, намного превышающими размеры экрана (я получаю 10000+ для x и y), и я подозреваю,что это пиксели на плитке, а не пиксели экрана.

Как мне перейти от GeoPoint к экрану пикселей назад и вперед?

1 Ответ

7 голосов
/ 15 марта 2012

Вам необходимо компенсировать смещение верхнего левого угла, эти методы должны работать:

/**
 * 
 * @param x  view coord relative to left
 * @param y  view coord relative to top
 * @param vw MapView
 * @return GeoPoint
 */

private GeoPoint geoPointFromScreenCoords(int x, int y, MapView vw){
    if (x < 0 || y < 0 || x > vw.getWidth() || y > vw.getHeight()){
        return null; // coord out of bounds
    }
    // Get the top left GeoPoint
    Projection projection = vw.getProjection();
    GeoPoint geoPointTopLeft = (GeoPoint) projection.fromPixels(0, 0);
    Point topLeftPoint = new Point();
    // Get the top left Point (includes osmdroid offsets)
    projection.toPixels(geoPointTopLeft, topLeftPoint);
    // get the GeoPoint of any point on screen 
    GeoPoint rtnGeoPoint = (GeoPoint) projection.fromPixels(x, y);
    return rtnGeoPoint;
}

/**
 * 
 * @param gp GeoPoint
 * @param vw Mapview
 * @return a 'Point' in screen coords relative to top left
 */

private Point pointFromGeoPoint(GeoPoint gp, MapView vw){

    Point rtnPoint = new Point();
    Projection projection = vw.getProjection();
    projection.toPixels(gp, rtnPoint);
    // Get the top left GeoPoint
    GeoPoint geoPointTopLeft = (GeoPoint) projection.fromPixels(0, 0);
    Point topLeftPoint = new Point();
    // Get the top left Point (includes osmdroid offsets)
    projection.toPixels(geoPointTopLeft, topLeftPoint);
    rtnPoint.x-= topLeftPoint.x; // remove offsets
    rtnPoint.y-= topLeftPoint.y;
    if (rtnPoint.x > vw.getWidth() || rtnPoint.y > vw.getHeight() || 
            rtnPoint.x < 0 || rtnPoint.y < 0){
        return null; // gp must be off the screen
    }
    return rtnPoint;
}
...