Как преобразовать точки GPS в пиксели экрана с наложением? - PullRequest
0 голосов
/ 20 марта 2012

Привет! Я создаю приложение, которое будет рисовать линии поверх MapView, используя оверлеи. На данный момент я установил точки GPS, для которых хочу использовать метод projection.toPixel (). Метод не выдает никаких ошибок, но точки не остаются фиксированными на карте, когда карта перемещается, как следует. Что-то мне не хватает?

//Zoom into certain area
public boolean onKeyDown(int keyCode, KeyEvent event)
{ 
    MapController mc = mapView.getController();

    switch(keyCode)
    {
        case KeyEvent.KEYCODE_1:
            mc.zoomIn();
            break;

        case KeyEvent.KEYCODE_2:
            mc.zoomOut();
            break;

        case KeyEvent.KEYCODE_4:
            //Create new path
            path = new Path();

            //Get Location Data from GPS

            p = new GeoPoint(
                    (int) (54.9886454 * 1E6),
                    (int) (-7.522208 * 1E6));

            //Convert GPS location to Screen Pixels
            Point screenPts1 = new Point();

            mapView.getProjection().toPixels(p,  screenPts1);

            //Start Path and pass locations
            path.moveTo(screenPts1.x, screenPts1.y);
            path.lineTo(screenPts1.x, screenPts1.y);

            System.out.println("New Path ");
            break;  

        case KeyEvent.KEYCODE_5:                
            //Get Location Data from GPS

            p = new GeoPoint(
                    (int) (54.9984931 * 1E6),
                    (int) (-7.522208 * 1E6));

            //Convert GPS location to Screen Pixels
            Point screenPts2 = new Point();
            mapView.getProjection().toPixels(p,  screenPts2);

            //Pass locations to the path
            path.lineTo(screenPts2.x, screenPts2.y);

            System.out.println("Continue Path ");
            break;  

        case KeyEvent.KEYCODE_6:                
            //Get Location Data from GPS

            p = new GeoPoint(
                    (int) (54.9994777 * 1E6),
                    (int) (-7.5005787 * 1E6));

            //Convert GPS location to Screen Pixels
            Point screenPts3 = new Point();
            mapView.getProjection().toPixels(p, screenPts3);

            //Pass locations to the path
            path.lineTo(screenPts3.x, screenPts3.y);

            //Close the path and add it to the _graphics array for it to be drawn
            _graphics.add(path);

            System.out.println("End Path ");

            break;  
    }
    return super.onKeyDown(keyCode, event);
}

Метод рисования оверлейного класса:

public boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when)
    {       
        super.draw(canvas,mapView,shadow);

        //-- Create new paint object --
        Paint mPaint = new Paint();
        mPaint.setDither(true);
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(2);

        //-- Take all the paths from the _graphics array and draw them to the Screen --
        for (Path path : _graphics) 
        {
            canvas.drawPath(path, mPaint);  
        }

        return true;
    }

1 Ответ

1 голос
/ 20 марта 2012

Из документации метода MapView.getProjection (): «Проекция карты в ее текущем состоянии. Вы не должны удерживать этот объект более одного рисования, поскольку проекция карты может измениться».

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

...