2012-03-28 76 views
2

我得到不同的x,y值爲特定的拉特,長。我不知道爲什麼會發生。可能是我缺乏知識。所以,如果任何人都可以通過觀察下面的代碼片段來解釋,那麼這將是一個很大的幫助。谷歌android mapview lat長到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; 
     } 

    } 

這裏我得到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值是多少,它總會代表相同的經度。

,導致我這樣不幸的想法是以下行的問題:

T =((X3 +(W * W * X1)+(W * Y3) - (W * X1))/(W * W + 1));

它提供了不同的價值。如果我將其分成3行,那麼T會提供正確的結果。儘管如此,我從來不必面對C++中的這種情況。這是奇怪的。

無論如何,我仍然想知道投影的價值背後的原因是不同的。

回答

0

我相信你的問題的答案是MapView中的縮放功能是動畫的,這意味着它不會立即完成。因此,您在縮放動畫期間獲取的不同投影會在地圖中的位置發生變化的同時拍攝。

要確認這一點,您可以在地圖中心/縮放變化和拍攝投影之間延遲幾秒鐘,並且您應始終獲得相同的投影值。

祝你好運, Luis