如何使用android在osm地图上叠加文本

时间:2013-12-13 17:38:16

标签: android overlay osmdroid

我想在特定位置显示文本(用户名),我可以用图标做没有问题,但不能用文本做,我试图使文本可绘制然后设置OverlayItem,但地图没有显示任何内容....请你的帮助。

我的班级:

 package de.ifgi.sitcom.campusmapper.activities;

import java.util.ArrayList;
import java.util.Iterator;

import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.OverlayItem;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

import de.ifgi.sitcom.campusmapper.R;
import de.ifgi.sitcom.campusmapper.dialogs.SettingsDialog;
import de.ifgi.sitcom.campusmapper.io.TripleStoreQueries;
import de.ifgi.sitcom.campusmapper.outdoordata.Building;
//import android.view.GestureDetector;

public class OwnershipMapActivity extends SherlockFragmentActivity{

    private int mMenuID = R.menu.ownership;

    private MapView mMapView;
//  private String mBuildingName;

    private LoadBuildingShapeFromLODUM mLoadBuildingShapeFromLODUM;
//  private GestureDetector mGestureDetector;
//  private ItemizedIconOverlay<OverlayItem> mEntrancePositionOverlay;
//  private GeoPoint mEntrancePosition;

    public static final String EXTRA_BUILDING_NAME = "de.ifgi.sitcom.campusmapper.buildingName";
    public static final String EXTRA_LAT_E6 = "de.ifgi.sitcom.campusmapper.lat";
    public static final String EXTRA_LON_E6 = "de.ifgi.sitcom.campusmapper.lon";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ownership_map);

    //  Intent intent = getIntent();
    //  mBuildingName = "Bispinghof 20";//intent.getStringExtra(EXTRA_BUILDING_NAME);

        mMapView = (MapView) findViewById(R.id.mapview);
        mMapView.setMultiTouchControls(true);
        mMapView.getController().setZoom(12);

        float latMünster = 51.966667f; // in DecimalDegrees
        float lngMünster = 7.633333f; // in DecimalDegrees
        GeoPoint gpMünster = new GeoPoint((int) (latMünster * 1E6),
                (int) (lngMünster * 1E6));
        mMapView.getController().setCenter(gpMünster);

        /*
         * It might be that the async task of loading person names is still
         * running. For this reason use .executeOnExecutor instead of .execute.
         * This way we can have multiple async tasks at the same time.
         */
        mLoadBuildingShapeFromLODUM = new LoadBuildingShapeFromLODUM();
        mLoadBuildingShapeFromLODUM.executeOnExecutor(
                AsyncTask.THREAD_POOL_EXECUTOR, "");

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getSupportMenuInflater().inflate(mMenuID, menu);
        menu.findItem(R.id.action_score).setTitle(String.format("%04d", MyCampusMapperGame.getInstance().getMyScore()));
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

          case android.R.id.home:
              // app icon in action bar clicked; go home
                   // User clicked OK button
                  Intent intent = new Intent(this, MappingActivity.class);
                  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    setResult(Activity.RESULT_OK, intent);
                    finish();
              return true;

        case R.id.action_score:
            Intent intentLeaderboard = new Intent(this, LeaderboardActivity.class);
            intentLeaderboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intentLeaderboard);
            return true;

        case R.id.action_settings:          
            new SettingsDialog().show(getSupportFragmentManager(), "");
            return true;

        default:

            break;
        }
        return true;
    }

    private class LoadBuildingShapeFromLODUM extends
    AsyncTask<String, Void, ArrayList<Building>> {

        @Override
        protected ArrayList<Building> doInBackground(String... params) {
            return new TripleStoreQueries().queryBuildingsCenter();
        }

        @Override
        protected void onPostExecute(ArrayList<Building> result) {
            System.out.println("mijail...post execute.");
            // zoom to building center
            if (result.size() > 0) {
                System.out.println("mijail...post execute. result.getCenter()...shapesize"/* + result.getShape().size()*/);             
                mMapView.getController().setZoom(8);
            }

            Iterator<Building> myIterator = result.iterator();
            final ArrayList<OverlayItem> centerList = new ArrayList<OverlayItem>();
        //  Resources res = getResources();
            while (myIterator.hasNext()) 
            {
                Building myBuilding = myIterator.next();
                if (myBuilding.getCenter() != null) {
                    Drawable d = new TextDrawable("test_text");
                    OverlayItem locationOverlayItem = new OverlayItem(myBuilding.getBuildingName().toString(), myBuilding.getBuildingName().toString(), myBuilding.getCenter());
                    locationOverlayItem.setMarker(d);
                    centerList.add(locationOverlayItem);
                    }
            }

            ItemizedIconOverlay<OverlayItem> centerOverlay = new ItemizedIconOverlay<OverlayItem>(
                    OwnershipMapActivity.this, centerList, null);
            mMapView.getOverlays().add(centerOverlay);

        }

            @Override
            protected void onPreExecute() {
            }

            @Override
            protected void onProgressUpdate(Void... values) {
            }

        }

    public class TextDrawable extends Drawable {

        private final String text;
        private final Paint paint;

        public TextDrawable(String text) {
            this.text = text;

            this.paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setTextSize(10f);
            paint.setAntiAlias(true);
            paint.setFakeBoldText(true);
            paint.setShadowLayer(6f, 0, 0, Color.BLACK);
            paint.setStyle(Paint.Style.FILL);
            paint.setTextAlign(Paint.Align.LEFT);
        }

        @Override
        public void draw(Canvas canvas) {
            canvas.drawText(text, 0, 0, paint);
        }

        @Override
        public void setAlpha(int alpha) {
            paint.setAlpha(alpha);
        }

        @Override
        public void setColorFilter(ColorFilter cf) {
            paint.setColorFilter(cf);
        }

        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }

    }       
}

1 个答案:

答案 0 :(得分:0)

您可以创建一个在osmdroid中扩展Overlay的类。然后覆盖onDraw方法并将文本直接绘制到画布上:

    @Override
    public void draw(final Canvas c, final MapView osmv, final boolean shadow) {
            if (shadow) {
                    return;
            }
            c.drawText("some text", tx, ty + 5, this.mPaint);
    }

这里可以找到很好的例子: https://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/org/osmdroid/views/overlay/MyLocationOverlay.java?r=902