Помогите настроить библиотеку OSMdroid для отображения OpenSourceMaps - PullRequest
0 голосов
/ 05 июня 2011

Эй. У меня проблемы с настройкой библиотеки OSMdroid для отображения OpenSourceMaps. Я работаю над действием, которое позволит пользователю видеть карту их текущего местоположения с помощью кнопок, чтобы пользователь мог переключаться между обычным представлением карт Google, представлением ландшафта Google Maps и представлением openstreetmaps. В настоящее время я использую файл JAR и просто добавляю его в путь сборки моего проекта. Он компилируется нормально, но я не понимаю, как использовать библиотеку. В Интернете очень мало уроков / инструкций. Нужно ли сделать тег IMapView в макете и использовать его как вид карты Google? Как переключить плитки макета из обычного представления карт Google?

Если бы кто-то мог просто дать мне краткий обзор того, как работает эта библиотека, я был бы очень признателен. Я программирую на JAVA уже много лет, поэтому мне просто нужно описание того, что мне нужно сделать на английском.

Заранее спасибо.

1 Ответ

1 голос
/ 05 июня 2011

Мне удалось заставить osmdroid работать в проекте, но мне пришлось иметь представления Google и OSM в различных действиях, как если бы вы переключили MapView с Google на OSM, а затем попытались вернуться в Google, я получил ошибку во время выполнения говоря что-то вроде «разрешено только одно отображение карты на действие». Это приводит к большому количеству повторяющегося кода, но он работает нормально.

Используйте последнюю версию osmdroid-android-3.0.3.jar, она намного проще для рисования оверлеев. Вам также необходимо включить slf4j-android-1.5.8.jar. Для этого стоит код демо-версии, которая использовалась для начала. У него есть слушатель местоположения, и он рисует очень простое наложение (линия на экране). Если вы знакомы с Google Maps, вы сможете адаптировать его для своих целей.

package osmdemo.demo;

import java.util.List;

import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.MapView.Projection;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.util.constants.MapViewConstants;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class DemoMap extends Activity implements LocationListener,
        MapViewConstants {

    private MapView mapView;
    private MapController mapController;
    private MapOverlay mmapOverlay = null;
    private LocationManager mLocMgr;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.copymain);

        mapView = (MapView) this.findViewById(R.id.mapview);
        mapView.setTileSource(TileSourceFactory.MAPNIK);
        mapView.setBuiltInZoomControls(true);
        mapView.setMultiTouchControls(true);

        mapController = this.mapView.getController();
        mapController.setZoom(15);
        GeoPoint point2 = new GeoPoint(53554070, -2959520);
        mapController.setCenter(point2);
        mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100,
                this);
        this.mmapOverlay = new MapOverlay(this);
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.add(mmapOverlay);
        mapView.invalidate();
    }

    public void onLocationChanged(Location location) {

        int lat = (int) (location.getLatitude() * 1E6);
        int lng = (int) (location.getLongitude() * 1E6);
        GeoPoint gpt = new GeoPoint(lat, lng);
        mapController.setCenter(gpt);
        mapView.invalidate();
    }

    public class MapOverlay extends org.osmdroid.views.overlay.Overlay {

        public MapOverlay(Context ctx) {
            super(ctx);
            // TODO Auto-generated constructor stub
        }

        @Override
        protected void draw(Canvas pC, MapView pOsmv, boolean shadow) {
            if (shadow)
                return;

            Paint lp3;
            lp3 = new Paint();
            lp3.setColor(Color.RED);
            lp3.setAntiAlias(true);
            lp3.setStyle(Style.STROKE);
            lp3.setStrokeWidth(1);
            lp3.setTextAlign(Paint.Align.LEFT);
            lp3.setTextSize(12);
            final Rect viewportRect = new Rect();
            final Projection projection = pOsmv.getProjection();
            viewportRect.set(projection.getScreenRect());
            // Draw a line from one corner to the other
            pC.drawLine(viewportRect.left, viewportRect.top,
                    viewportRect.right, viewportRect.bottom, lp3);
        }

    }

    @Override
    public void onProviderDisabled(String arg0) {}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}

}

И xml (copymain.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_width="fill_parent" 
        android:layout_height="fill_parent"
        android:id="@+id/mapview"
        ></org.osmdroid.views.MapView>
</LinearLayout>
...