Google android mapview lat long to topixel projection проблема - PullRequest
2 голосов
/ 28 марта 2012

Я получаю другое значение x, y для конкретного lat, long. Интересно, почему это происходит? Может быть, мне не хватает знаний. Так что, если вы, кто-нибудь, можете объяснить, соблюдая следующий фрагмент кода, это было бы очень полезно.

import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;


import android.app.Activity;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class MaopaoActivity extends MapActivity {


        MapView FMmapview;
        GeoPoint fm_gp;
        Button bt;
        int lat,lng;

        List<Overlay> mapOverlays;
        Drawable drawable;
        CustomItemizedOverlay itemizedoverlay;
        OverlayItem overlayitem;
        String RASTA="";
        String [] pairs;
        int EndLat,EndLng;
        String kotha;
        TextView tv;
        double startlat,startlong;
        double endlat,endlong;
        double midlat,midlong;


        int startlatE6,startlongE6;
        int endlatE6,endlongE6;
        int midlatE6,midlongE6;
        GeoPoint StartGp,EndGp,midGp1,midGp2;
        Integer x1,y1,x2,y2,x3,y3;
        Double x4,y4;
        Point StartPoint;
        Point EndPoint;
        Point MidPoint1;
        Point MidPoint2;
        String abc;

        double w,T,G;
        Integer Tint,Gint;




        @Override
        protected void onCreate(Bundle icicle)
        {
            // TODO Auto-generated method stub
            super.onCreate(icicle);
            setContentView(R.layout.fullmap);

            StartPoint = new Point();
            EndPoint = new Point();
            MidPoint1 = new Point();
            MidPoint2 = new Point();
            tv=(TextView)findViewById(R.id.fm_tv1);         

            startlat=34.123018;
            startlatE6=(int)(startlat*1E6);
            startlong=-118.146278;
            startlongE6=(int)(startlong*1E6);

            endlat=34.122525;
            endlatE6=(int)(endlat*1000000);
            endlong=-118.146241;
            endlongE6=(int)(endlong*1000000);

            midlat=34.122724;
            midlatE6=(int)(midlat*1000000);
            midlong=-118.146106;
            midlongE6=(int)(midlong*1000000);


            EndGp=new GeoPoint(endlatE6,endlongE6);
            midGp1=new GeoPoint(midlatE6,midlongE6);
            StartGp=new GeoPoint(startlatE6,startlongE6);


            FMmapview=(MapView)findViewById(R.id.MapViewFM123);

            Projection projection = FMmapview.getProjection();


            FMmapview.getController().setCenter(StartGp);
            FMmapview.getController().setZoom(18);


            FMmapview.getProjection().toPixels(EndGp,EndPoint);
            FMmapview.getProjection().toPixels(midGp1,MidPoint1);
            FMmapview.getProjection().toPixels(StartGp,StartPoint);

            x1=StartPoint.x;
            y1=StartPoint.y;

            x2=EndPoint.x;
            y2=EndPoint.y;

            x3=MidPoint1.x;
            y3=MidPoint1.y;


            w=(y2-y1)/(x2-x1);



            T=((x3+(w*w*x1)+(w*y3)-(w*x1))/(w*w+1));
            G=w*(T-x1)+y1;

            Tint=(int) Math.ceil(T);
            Gint=(int)Math.ceil(G);



            mapOverlays = FMmapview.getOverlays();
            drawable = this.getResources().getDrawable(R.drawable.blue);
            itemizedoverlay = new CustomItemizedOverlay(drawable,this);
            overlayitem = new OverlayItem(midGp1, "Your are at","hello motttto");
            itemizedoverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedoverlay);



            midGp2=FMmapview.getProjection().fromPixels(Tint,Gint);

            //x4=(midGp2.getLatitudeE6())/(1E6);
            //y4=(midGp2.getLongitudeE6())/(1E6);


            abc="A="+x1.toString()+','+y1.toString()+" B="+x2.toString()+","+y2.toString()+" C="+x3.toString()+","+y3.toString()+" D="+Tint.toString()+","+Gint.toString();
            tv.setText(abc);

            //midGp2=new GeoPoint(34048039,-118140655);

            mapOverlays = FMmapview.getOverlays();
            drawable = this.getResources().getDrawable(R.drawable.blue);
            itemizedoverlay = new CustomItemizedOverlay(drawable,this);
            overlayitem = new OverlayItem(midGp2, "Your are at","hello motttto");
            itemizedoverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedoverlay);



            FMmapview.getController().animateTo(StartGp);
            FMmapview.getController().setCenter(StartGp);
            FMmapview.getController().setZoom(18);
            FMmapview.getOverlays().add(new MyOverLay(StartGp,EndGp,2,Color.BLUE));     


        }

        @Override
        protected boolean isRouteDisplayed()
        {
            // TODO Auto-generated method stub
            return false;
        }

    }

Здесь я получаю x, y = 0,0 для геопункта 34.123018, -118.146278; и снова я получаю x, y = 240 340 при повторном запуске приложения.

Если я очищаю данные, я получаю x, y = 0,0 и затем при повторном запуске я получаю другое значение для того же вышеупомянутого широты / долготы.

Было бы очень полезно, если бы кто-нибудь смог очистить мою концепцию

РЕДАКТИРОВАНИЕ:

Я нашел причину, которая совершенно необычна для меня. Значение проекции на пиксель может варьироваться.

как http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html#getProjection%28%29 говорит, что «Проекция карты в ее текущем состоянии. Вы не должны держаться за этот объект более одного рисунка, поскольку проекция карты может измениться».

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

Проблема, которая приводит меня к такому мышлению, к сожалению, была следующей строкой:

Т = ((х3 + (ш * W * x1) + (W * y3) - (ж * x1)) / (ж * W + 1));

Это обеспечивает другое значение. Если я разобью это на 3 строки, то T даст правильный результат. Хотя мне никогда не приходилось сталкиваться с такой ситуацией в C ++. Это что-то странное.

В любом случае, я все же хотел бы знать причину, по которой значение проекции отличается.

1 Ответ

0 голосов
/ 19 июля 2012

Я полагаю, что ответ на ваш вопрос заключается в том, что функция масштабирования в MapView является анимированной, то есть не сразу завершается. Таким образом, различные проекции, которые вы получаете, получают из них во время анимации масштабирования, когда местоположения на карте меняются одновременно с их съемкой.

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

Удачи, Луис

...