Get latitude and longitude of clicked location on map in osmdroid

I was able to write an Android application to track the location of a user and display it on a map using a marker. Here is the relevant code:

public class MainActivity extends Activity implements LocationListener { public MapView mapView; private LocationManager locationManager; MyItemizedOverlay myItemizedOverlay = null; Drawable marker; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapView = (MapView) this.findViewById(R.id.mapview); mapView.setUseDataConnection(false); mapView.setClickable(true); mapView.setBuiltInZoomControls(true); mapView.setMultiTouchControls(true); mapView.setUseDataConnection(false); mapView.setFocusable(true); mapView.setFocusableInTouchMode(true); mapView.getController().setZoom(16); // set initial zoom-level, depends // on your need marker = getResources().getDrawable(android.R.drawable.star_on); int markerWidth = 1; int markerHeight = 1; marker.setBounds(0, markerHeight, markerWidth, 0); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); // You can also use LocationManager.GPS_PROVIDER and // LocationManager.PASSIVE_PROVIDER } @Override public void onLocationChanged(Location location) { int lat = (int) (location.getLatitude() * 1E6); int lng = (int) (location.getLongitude() * 1E6); GeoPoint point = new GeoPoint(lat, lng); mapView.getController().setCenter(point); mapView.getController().animateTo(point); mapView.invalidate(); ResourceProxy resourceProxy = new DefaultResourceProxyImpl( getApplicationContext()); myItemizedOverlay = new MyItemizedOverlay(marker, resourceProxy); mapView.getOverlays().clear(); mapView.getOverlays().add(myItemizedOverlay); myItemizedOverlay.addItem(point, "myPoint1", "myPoint1"); TextView tv1 = (TextView) findViewById(R.id.myLat); tv1.setText("Lat is " + lat); TextView tv2 = (TextView) findViewById(R.id.myLong); tv2.setText("Long is " + lng); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } 

}

Now I need a way to get the latitude and longitude properties of the clicked location on the map. I mean, I need something similar to the following code (which exists for google map api) in osmdroid.

 google.maps.event.addListener(map, 'click', function(event) { YourHandler(event.latLng);}); 
+4
source share
2 answers

You need to create Overlay and override onSingleTapConfirmed .

Try the following:

 Overlay touchOverlay = new Overlay(this){ ItemizedIconOverlay<OverlayItem> anotherItemizedIconOverlay = null; @Override protected void draw(Canvas arg0, MapView arg1, boolean arg2) { } @Override public boolean onSingleTapConfirmed(final MotionEvent e, final MapView mapView) { final Drawable marker = getApplicationContext().getResources().getDrawable(R.drawable.markericon); Projection proj = mapView.getProjection(); GeoPoint loc = (GeoPoint) proj.fromPixels((int)e.getX(), (int)e.getY()); String longitude = Double.toString(((double)loc.getLongitudeE6())/1000000); String latitude = Double.toString(((double)loc.getLatitudeE6())/1000000); System.out.println("- Latitude = " + latitude + ", Longitude = " + longitude ); ArrayList<OverlayItem> overlayArray = new ArrayList<OverlayItem>(); OverlayItem mapItem = new OverlayItem("", "", new GeoPoint((((double)loc.getLatitudeE6())/1000000), (((double)loc.getLongitudeE6())/1000000))); mapItem.setMarker(marker); overlayArray.add(mapItem); if(anotherItemizedIconOverlay==null){ anotherItemizedIconOverlay = new ItemizedIconOverlay<OverlayItem>(getApplicationContext(), overlayArray,null); mapView.getOverlays().add(anotherItemizedIconOverlay); mapView.invalidate(); }else{ mapView.getOverlays().remove(anotherItemizedIconOverlay); mapView.invalidate(); anotherItemizedIconOverlay = new ItemizedIconOverlay<OverlayItem>(getApplicationContext(), overlayArray,null); mapView.getOverlays().add(anotherItemizedIconOverlay); } // dlgThread(); return true; } }; mapView.getOverlays().add(touchOverlay); 
+1
source

If you implement MapEventsReceiver , you can use the singleTapConfirmedHelper() function, which directly gives you a clicked GeoPoint object. Here is an example:

 public class MapActivity extends AppCompatActivity implements MapEventsReceiver { ... @Override public boolean singleTapConfirmedHelper(GeoPoint p) { mapController.animateTo(p); return true; } } 
0
source

Source: https://habr.com/ru/post/1487429/


All Articles