2012-03-28 9 views
2

私は、特定のlat、longに対して異なるx、y値を取得しています。私はなぜそれが起こっているのだろうか。私は知識が不足しているかもしれません。ですから、誰かが次のコードスニペットを観察することで説明できるなら、大きな助けになります。Google android mapview lat to topixel投影の問題

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; 
     } 

    } 

ここで、ジオポイント34.123018、-118.146278のx、y = 0,0を取得します。 そして私はx、y = 240,340を得る。私はアプリを再実行する。

データをクリアすると、x、y = 0, が得られます。再実行すると、同じ緯度/経度で異なる値が得られます。私は私には全く異例である理由を、発見した

:誰もが私の構想

EDITEDをクリアすることができれば

は、それは大きな助けになります。 ピクセルへの投影値が異なる場合があります。

と言っています "地図の投影が変わる可能性があるため、このオブジェクトに複数の描画をしてはいけません。"

x、yは0,0でもかまいません。投影されたx、y値は何でも、常に同じlat、longを表します。

残念ながら次の行だと思っそのように私をリード問題:

T =((×3 +(W *ワット*×1)+()*のY3ワット - ()*×1ワット)/(W * w + 1));

これは異なる値を提供します。これを3行に分割すると、Tは正しい結果を返します。しかし、私はC++でこのような状況に直面する必要はありませんでした。これは奇妙なことです。

とにかく、私はまだ投影の価値の背後にある理由を知りたいと思うでしょう。

答えて

0

あなたの質問に対する答えは、MapViewのズーム機能がアニメーション化されている、つまりすぐには完了しないということです。そのため、ズームアニメーション中に地図上の場所が変化しているときに、撮影中に異なる投影が得られます。

これを確認するには、マップセンター/ズームの変更と投影の撮影の間に数秒の遅延があり、常に同じ投影値を取得する必要があります。

幸運、 ルイス

関連する問題