Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用android在osm地图上覆盖文本_Android_Overlay_Osmdroid - Fatal编程技术网

如何使用android在osm地图上覆盖文本

如何使用android在osm地图上覆盖文本,android,overlay,osmdroid,Android,Overlay,Osmdroid,我想在一个特定的位置显示文本(用户名),我可以用图标来显示,但不能用文本,我正在尝试使文本可绘制,然后设置覆盖项,但地图没有显示任何内容。。。。请帮忙 这是我的班级: package de.ifgi.sitcom.campusmapper.activities; import java.util.ArrayList; import java.util.Iterator; import org.osmdroid.util.GeoPoint; import org.osmdroid.views

我想在一个特定的位置显示文本(用户名),我可以用图标来显示,但不能用文本,我正在尝试使文本可绘制,然后设置覆盖项,但地图没有显示任何内容。。。。请帮忙

这是我的班级:

 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;
        }

    }       
}
package de.ifgi.sitcom.campusmapper.activities;
导入java.util.ArrayList;
导入java.util.Iterator;
导入org.osmdroid.util.GeoPoint;
导入org.osmdroid.views.MapView;
导入org.osmdroid.views.overlay.itemizedictionoverlay;
导入org.osmdroid.views.overlay.OverlayItem;
导入android.app.Activity;
导入android.content.Intent;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.ColorFilter;
导入android.graphics.Paint;
导入android.graphics.PixelFormat;
导入android.graphics.drawable.drawable;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入com.actionbarsherlock.app.SherlockFragmentActivity;
导入com.actionbarsherlock.view.Menu;
导入com.actionbarsherlock.view.MenuItem;
导入de.ifgi.sitcom.campusmapper.R;
导入de.ifgi.sitcom.campusmapper.dialogs.settings对话框;
导入de.ifgi.sitcom.campusmapper.io.TripleStoreQueries;
导入de.ifgi.sitcom.campusmapper.outdoordata.Building;
//导入android.view.GestureDetector;
公共类OwnershipCapability扩展了SherlockFragmentActivity{
private int mMenuID=R.menu.ownership;
私人地图视图;
//私有字符串mBuildingName;
私人装载建筑物形状轮廓M装载建筑物形状轮廓;
//私人手势检测器mGestureDetector;
//私人项目法令覆盖和保存覆盖;
//私人地质点位置;
公共静态最终字符串EXTRA_BUILDING_NAME=“de.ifgi.sitcom.campusmapper.buildingName”;
公共静态最终字符串EXTRA_LAT_E6=“de.ifgi.sitcom.campusmapper.LAT”;
公共静态最终字符串EXTRA_LON_E6=“de.ifgi.sitcom.campusmapper.LON”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u ownership\u map);
//Intent=getIntent();
//mBuildingName=“Bispinghof 20”;//intent.getStringExtra(EXTRA_BUILDING_NAME);
mMapView=(MapView)findViewById(R.id.MapView);
mMapView.setMultiTouchControls(真);
mMapView.getController().setZoom(12);
浮点latMünster=51.966667f;//以小数度为单位
浮点lngMünster=7.633333f;//以小数度数表示
地质点gpMünster=新的地质点((int)(latMünster*1E6),
(int)(lngMünster*1E6));
mMapView.getController().setCenter(gpMünster);
/*
*可能是加载人名的异步任务仍在进行中
*正在运行。因此,请使用.executeOnExecutor而不是.execute。
*这样我们可以同时有多个异步任务。
*/
MLLoadBuildingShapeFromlodum=新的LoadBuildingShapeFromLODUM();
MLLoadBuildingShapeFromlodum.executeOnExecutor(
AsyncTask.THREAD_池_执行器,“”);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getSupportMenuInflater().充气(mMenuID,菜单);
menu.findItem(R.id.action_score).setTitle(String.format(“%04d”,MyCampusMapperGame.getInstance().getMyScore());
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例android.R.id.home:
//已单击操作栏中的应用图标;返回主页
//用户单击“确定”按钮
Intent Intent=新Intent(这是MappingActivity.class);
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
设置结果(Activity.RESULT_OK,intent);
完成();
返回true;
案例R.id.action_得分:
Intent intentLeaderboard=新Intent(这是LeadboardActivity.class);
intentLeaderboard.addFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
星触觉(智能引导板);
返回true;
案例R.id.action\u设置:
新设置Dialog().show(getSupportFragmentManager(),“”);
返回true;
违约:
打破
}
返回true;
}
私有类加载BuildingShapeFromLodum扩展
异步任务{
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
返回新的TripleStoreQueries().QueryBuildingCenter();
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
System.out.println(“mijail…post-execute.”);
//缩放到建筑中心
如果(result.size()>0){
System.out.println(“mijail…post-execute.result.getCenter()…shapesize”/*+result.getShape().size()*/);
mMapView.getController().setZoom(8);
}
迭代器myIterator=result.Iterator();
最终ArrayList中心列表=新ArrayList();
//Resources res=getResources();
while(myIterator.hasNext())
{
Building myBuilding=myIterator.next();
if(myBuilding.getCenter()!=null){
可绘制d=新文本可绘制(“测试文本”);
OverlayItem locationOverlayItem=新的OverlayItem(myBuilding.getBuildingName().toString(),myBuilding.getBuildingName().toString(),myBuilding.getCenter());
位置覆盖项目设置标记(d);
centerList.add(locationOverlayItem);
}
}
itemizedictionoverlay centerOverlay=新建itemizedictionoverlay(
OwnershipCapability.this,centerList,null);
mMapView.getOverlays
    @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);
    }