如何使用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);
}