gpt4 book ai didi

android - 使用 Open Street Map 在错误的地理点显示覆盖

转载 作者:行者123 更新时间:2023-11-30 04:33:10 27 4
gpt4 key购买 nike

我使用 osmdroid-android 3.0.5.jar 而不是 Google map api 来使用地理坐标在 map 中显示位置。

好吧,我可以在 Android 模拟器中获取 map ,但问题是我用来指向位置的叠加层是错误的。

这是我的代码:

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:

<?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>

如你所见,我正在使用

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

这是 Stamford US 的地理坐标,现在红点显示非洲某处, map 中心(纬度和经度的交点)。

我做错了什么?

最佳答案

需要在draw方法中获取投影。 getProjection 的 javadoc 告诉您

公共(public) MapView.Projection getProjection()获取用于在屏幕像素坐标和纬度/经度坐标之间转换的投影。由于 map 的投影可能会发生变化,因此您不应多次按住此对象进行绘制。

所以在你的绘图方法中,插入如下所示的线

....
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);
.....

这应该可以解决它。

关于android - 使用 Open Street Map 在错误的地理点显示覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7334486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com