Android, карты наложения - PullRequest
       11

Android, карты наложения

0 голосов
/ 25 марта 2012

Я пытаюсь создать приложение, которое использует OSMDroid и mapoverlays с geoPoints из файла XML, но у меня есть проблема.Редактор кода не показывает ошибку или предупреждение, но когда я запускаю приложение в эмуляторе, он показывает, что приложение перестало работать.Это код 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

    }



     }

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

}

и 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>

Я не писалимпорт кода, потому что они занимают много места.: D

1 Ответ

1 голос
/ 18 апреля 2012

Во-первых, context, определенный в вашем ObjectsOverlay, никогда не устанавливается.Вы должны добавить параметр Context в конструктор:

public ObjectsOverlay(Drawable pDefaultMarker, ResourceProxy pResourceProxy, Context context) {
        super(pDefaultMarker, pResourceProxy);
        this.context = context;
    }

, чтобы DialogBuilder, используемый в onTap, мог иметь контекст для создания диалога.Без этого ваше приложение, скорее всего, аварийно завершит работу при нажатии на элемент.

Далее, вы ошибочно инициализировали GeoPoint, это должно быть сделано так:

GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

GeoPoint координаты не двойной, как Location координаты.Они int равны координате * 1E6.Используйте это так:

int lon = (int)Math.round(lon_as_double*1E6)

И последнее, вы делаете

itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);

в том же цикле for.Но на самом деле вы должны просто addOverlay в цикле, где вы добавляете один за другим объект по его координатам и добавляете полный itemizedOverlay на карту после цикла.Да, вы также можете добавить оверлей в начале (перед циклом), а затем заполнить его, используя addOverlay.Порядок не имеет значения, имеет значение только один раз добавить оверлей с mapOverlays.add.

Исправить это и посмотреть, если ошибки все еще случаются.

С уважением.

...