Android,地图覆盖

Android,地图覆盖,android,android-maps,osmdroid,Android,Android Maps,Osmdroid,我正在尝试创建一个应用程序,该应用程序使用OSMDroid和mapoverlays以及xml文件中的地理点,但我遇到了一个问题。代码编辑器不会向我显示错误或警告,但当我在emulator中运行应用程序时,它会显示应用程序已停止工作。 这是mapActivity的代码: public class MapsActivity extends Activity implements LocationListener, MapViewConstants { private MapView ma

我正在尝试创建一个应用程序,该应用程序使用OSMDroid和mapoverlays以及xml文件中的地理点,但我遇到了一个问题。代码编辑器不会向我显示错误或警告,但当我在emulator中运行应用程序时,它会显示应用程序已停止工作。 这是mapActivity的代码:

 public class MapsActivity extends Activity implements LocationListener, MapViewConstants {

    private MapView mapView;
    private MapController mapController;
    private LocationManager mLocMgr;
    static final String URL = "data/data/com.siroki.brijeg/data.xml";
    // XML node keys
    static final String KEY_ITEM = "object"; // parent node
    static final String KEY_ID = "id";
    static final String KEY_NAME = "name";
    static final String KEY_LON = "lon";
    static final String KEY_LAT = "lat";
    /** 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(14);
        GeoPoint point2 = new GeoPoint(43.3803,  17.5981);
        mapController.setCenter(point2);
        mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100, this);

        mapView.invalidate();

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable marker = this.getResources().getDrawable(R.drawable.ic_launcher);
        ObjectsOverlay itemizedOverlay = new ObjectsOverlay(marker, null);

        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

        XMLParser parser = new XMLParser();

        String xml = parser.getXmlFromUrl(URL); 
        Document doc = parser.getDomElement(xml); // getting DOM element

        NodeList nl = doc.getElementsByTagName(KEY_ITEM);



        // looping through all item nodes <item>
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            map.put(KEY_ID, parser.getValue(e, KEY_ID));
            map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
            map.put(KEY_LON, "Rs." + parser.getValue(e, KEY_LON));
            map.put(KEY_LAT, parser.getValue(e, KEY_LAT));

            // adding HashList to ArrayList
            menuItems.add(map);
            GeoPoint geo = new GeoPoint(Double.parseDouble(parser.getValue(e, KEY_LAT)), Double.parseDouble(parser.getValue(e, KEY_LON)));
            OverlayItem overlayitem = new OverlayItem("Hellow", "World", geo);
            itemizedOverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedOverlay);

        }

    }

    public void onLocationChanged(Location location) {
        double lat = 43.3803;
        double lng = 17.5981 ;
        GeoPoint gpt = new GeoPoint(lat, lng);
        mapController.setCenter(gpt);
        mapView.invalidate();
    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }



     }
公共类MapsActivity扩展活动实现LocationListener、MapViewConstants{
私有地图视图;
专用地图控制器;
私人场所经理mLocMgr;
静态最终字符串URL=“data/data/com.siroki.brijeg/data.xml”;
//XML节点密钥
静态最终字符串KEY\u ITEM=“object”//父节点
静态最终字符串键\u ID=“ID”;
静态最终字符串键\u NAME=“NAME”;
静态最终字符串键_LON=“LON”;
静态最终字符串键\u LAT=“LAT”;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.copymain);
mapView=(mapView)this.findViewById(R.id.mapView);
setTileSource(TileSourceFactory.MAPNIK);
mapView.SetBuilTinZoomControl(真);
设置多点触控控件(真);
mapController=this.mapView.getController();
mapController.setZoom(14);
地质点2=新的地质点(43.3803,17.5981);
mapController.setCenter(点2);
mLocMgr=(位置管理器)getSystemService(位置服务);
mLocMgr.RequestLocationUpdate(LocationManager.GPS_提供程序,1000,100,此);
mapView.invalidate();
List mapOverlays=mapView.getOverlays();
Drawable marker=this.getResources().getDrawable(R.Drawable.ic_启动器);
ObjectsOverlay itemizedOverlay=新的ObjectsOverlay(标记,null);
ArrayList menuItems=新建ArrayList();
XMLParser=新的XMLParser();
字符串xml=parser.getXmlFromUrl(URL);
Document doc=parser.getDomeElement(xml);//获取DOM元素
NodeList nl=doc.getElementsByTagName(键项);
//循环通过所有项目节点
对于(int i=0;ivalue
put(KEY_ID,parser.getValue(e,KEY_ID));
put(KEY_NAME,parser.getValue(e,KEY_NAME));
map.put(KEY_LON,“Rs.”+parser.getValue(e,KEY_LON));
put(KEY_LAT,parser.getValue(e,KEY_LAT));
//将哈希列表添加到ArrayList
menuItems.add(地图);
GeoPoint geo=new GeoPoint(Double.parseDouble(parser.getValue(e,KEY_-LAT)),Double.parseDouble(parser.getValue(e,KEY_-LON));
OverlayItem OverlayItem=新的OverlayItem(“Hellow”、“World”、“geo”);
itemizedOverlay.addOverlay(overlayitem);
添加(itemizedOverlay);
}
}
已更改位置上的公共无效(位置){
双lat=43.3803;
双液化天然气=17.5981;
地质点gpt=新地质点(lat、lng);
mapController.setCenter(gpt);
mapView.invalidate();
}
@凌驾
公共无效onProviderDisabled(字符串arg0){
//TODO自动生成的方法存根
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
//TODO自动生成的方法存根
}
}
ObjectsOverlay.java:

public class ObjectsOverlay extends ItemizedOverlay<OverlayItem> {



    public ObjectsOverlay(Drawable pDefaultMarker, ResourceProxy pResourceProxy) {
        super(pDefaultMarker, pResourceProxy);
        // TODO Auto-generated constructor stub
    }


    private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();

    private Context context;



    @Override
       protected OverlayItem createItem(int i) {
          return mapOverlays.get(i);
       }

       @Override
       public int size() {
          return mapOverlays.size();
       }

       protected boolean onTap(int index) {
          OverlayItem item = mapOverlays.get(index);
          AlertDialog.Builder dialog = new AlertDialog.Builder(context);
          dialog.setTitle(item.getTitle());
          dialog.setMessage(item.getSnippet());
          dialog.show();
          return true;
       }

       public void addOverlay(OverlayItem overlay) {
          mapOverlays.add(overlay);
           this.populate();
       }

    @Override
    public boolean onSnapToItem(int arg0, int arg1, Point arg2, IMapView arg3) {
        // TODO Auto-generated method stub
        return false;
    }

}
public类ObjectsOverlay扩展了ItemizedOverlay{
public ObjectsOverlay(可绘制的pDefaultMarker、ResourceProxy资源代理资源代理){
super(pDefaultMarker,尿前造影);
//TODO自动生成的构造函数存根
}
私有ArrayList mapOverlays=新ArrayList();
私人语境;
@凌驾
受保护的OverlayItem createItem(int i){
返回mapOverlays.get(i);
}
@凌驾
公共整数大小(){
返回mapOverlays.size();
}
受保护的布尔onTap(整数索引){
OverlayItem item=mapOverlays.get(索引);
AlertDialog.Builder dialog=新建AlertDialog.Builder(上下文);
setTitle(item.getTitle());
setMessage(item.getSnippet());
dialog.show();
返回true;
}
公共void addOverlay(OverlayItem overlay){
mapOverlays.add(叠加);
这个。填充();
}
@凌驾
NaptoItem上的公共布尔值(int arg0、int arg1、点arg2、IMapView arg3){
//TODO自动生成的方法存根
返回false;
}
}
和XML文件data.XML:

<?xml version="1.0" encoding="UTF-8"?>

<objects>

    <object>
        <id>1</id>    

        <name>Siroki</name>

        <lon>17.602985</lon>

        <lat>43.374276</lat>
    </object> 
</objects>

1.
希罗基
17.602985
43.374276

我没有编写导入代码,因为它们占用了大量空间D

首先,您的
ObjectsOverlay
中定义的
上下文从未被设置。您应该在构造函数中添加一个
Context
参数:

public ObjectsOverlay(Drawable pDefaultMarker, ResourceProxy pResourceProxy, Context context) {
        super(pDefaultMarker, pResourceProxy);
        this.context = context;
    }
这样,在
onTap
中使用的
DialogBuilder
可以有一个上下文来创建对话框。如果没有这个功能,你的应用程序很可能会在点击某个项目时崩溃

接下来,您错误地初始化了
地质点
,应该这样做:

GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
int lon = (int)Math.round(lon_as_double*1E6)
GeoPoint
坐标是而不是双精度的,就像
位置
坐标一样。它们int等于坐标*1E6。像这样使用它:

GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
int lon = (int)Math.round(lon_as_double*1E6)
最后一件事,你做的

itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
在相同的for循环中。但实际上,您应该只在循环中添加覆盖,通过其坐标逐个添加对象,并将完整的
itemizedOverlay
添加到循环后的地图中。 哦,你也可以在开始时添加覆盖层(之前)