2011-09-07 3 views
1

Google지도 api 대신 osmdroid-android 3.0.5.jar를 사용하여지도에서 위치 좌표를 사용하여 위치를 표시합니다.열린 거리지도를 사용하여 잘못된 지리적 위치에 오버레이 표시

글쎄, 안드로이드 에뮬레이터에서지도를 가져올 수 있지만 문제는 위치를 가리키는 데 사용하는 오버레이가 잘못되었다는 것입니다. 내가이 (가) 지리 좌표 인

GeoPoint geoPoint = new GeoPoint((int)(41.057121 * 1E6), (int)(-73.561867 * 1E6)); 

를 사용하고 볼 수 있듯이

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<org.osmdroid.views.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_centerInParent="true" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" 
    android:id="@+id/osm_map_view" 
    renderer="CloudMadeStandardTiles" 
    cloudmadeStyle="1" 
/> 
</LinearLayout> 

:

public class MainActivity extends Activity { 
/** Called when the activity is first created. */ 
private MapView osmMapView; 
private MapController controller; 
private Projection projection; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    osmMapView = (MapView) findViewById(R.id.osm_map_view); 

    this.osmMapView.setTileSource(TileSourceFactory.MAPNIK); 
    this.osmMapView.setBuiltInZoomControls(true); 
    this.osmMapView.setMultiTouchControls(true); 

    this.projection = this.osmMapView.getProjection(); 

    this.controller = this.osmMapView.getController(); 
    this.controller.setZoom(5); 

    List<Overlay> overLayList = osmMapView.getOverlays(); 
    overLayList.add(new ScaleBarOverlay(this)); 
    overLayList.add(new PutOverLayOnMap(this)); 
} 

private class PutOverLayOnMap extends Overlay { 
    public PutOverLayOnMap(Context ctx) { 
     super(ctx); 
    } 

    @Override 
    protected void draw(Canvas c, MapView osmv, boolean shadow) { 
     Paint paint = new Paint(); 
     paint.setColor(Color.RED); 
     paint.setDither(true); 
     paint.setStyle(Paint.Style.FILL_AND_STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeCap(Paint.Cap.ROUND); 
     paint.setStrokeWidth(10); 
     Point point = new Point(); 
     GeoPoint geoPoint = new GeoPoint((int)(41.057121 * 1E6), (int)(-73.561867 * 1E6)); 
     projection.toPixels(geoPoint, point); 
     c.drawPoint(point.x, point.y, paint); 
     System.out.println("GeoPoint(OSM) : "+geoPoint.getLatitudeE6()+" #### "+geoPoint.getLongitudeE6()); 

    } 
} 

다음

내 main.xml에 있습니다 : 여기

내 코드입니다 Stamford US 이제 빨간색 점이 아프리카 어딘가에 나타납니다. f지도 (위도의 교차점 & 경도).

내가 뭘 잘못하고있어?

답변

1

그리기 방법에서 투영해야합니다. getProjection의 javadocs는

입니다. public MapView.Projection getProjection() 화면 픽셀 좌표와 위도/경도 좌표 사이의 변환을위한 투영을 가져옵니다. 지도의 투영이 변경 될 수 있으므로 둘 이상의 그리기를 위해이 객체를 고정해서는 안됩니다. 이 그것을 수정해야

.... 
paint.setStrokeWidth(10); 
Point point = new Point(); 
projection = osmMapView.getProjection(); // <<<<<<<<<<<<<<<<< ADD THIS LINE 
GeoPoint geoPoint = new GeoPoint((int) (41.057121 * 1E6), 
         (int) (-73.561867 * 1E6)); 
projection.toPixels(geoPoint, point); 
..... 

아래와 같이

그래서 드로우 방법에 라인을 삽입합니다.

관련 문제