如何通过在开放的街道地图中点击它来获取点的坐标?
尝试:
public void onClick(View v) {
Projection proj = mapView.getProjection();
IGeoPoint p = proj.fromPixels(v.getX(), v.getY());
System.out.println("x: "+ v.getX() + " y: "+ v.getY());
}
欢呼声, Thanasio
答案 0 :(得分:9)
使用dispatchTouchEvent()
方法。它有效,因为MapActivity
继承了dispatchTouch
事件,而不是活动类中的OnTouchEvent
。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int actionType = ev.getAction();
switch (actionType) {
case MotionEvent.ACTION_UP:
Projection proj = mapView.getProjection();
GeoPoint loc = proj.fromPixels((int)ev.getX(), (int)ev.getY());
String longitude = Double.toString(((double)loc.getLongitudeE6())/1000000);
String latitude = Double.toString(((double)loc.getLatitudeE6())/1000000);
Toast toast = Toast.makeText(getApplicationContext(), "Longitude: "+ longitude +" Latitude: "+ latitude , Toast.LENGTH_LONG);
toast.show();
}
return super.dispatchTouchEvent(ev);
}
答案 1 :(得分:3)
这是我自己的MapView实现,以获取点击地图的位置。
public class MapViewLoc extends MapView {
private Overlay tapOverlay;
private OnTapListener onTapListener;
protected MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy, MapTileProviderBase tileProvider, Handler tileRequestCompleteHandler, AttributeSet attrs) {
super(context, tileSizePixels, resourceProxy, tileProvider, tileRequestCompleteHandler, attrs);
}
public MapViewLoc(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MapViewLoc(Context context, int tileSizePixels) {
super(context, tileSizePixels);
}
public MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy) {
super(context, tileSizePixels, resourceProxy);
}
public MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy, MapTileProviderBase aTileProvider) {
super(context, tileSizePixels, resourceProxy, aTileProvider);
}
public MapViewLoc(Context context, int tileSizePixels, ResourceProxy resourceProxy, MapTileProviderBase aTileProvider, Handler tileRequestCompleteHandler) {
super(context, tileSizePixels, resourceProxy, aTileProvider, tileRequestCompleteHandler);
}
private void prepareTagOverlay(){
this.tapOverlay = new Overlay(this.getContext()) {
@Override
protected void draw(Canvas c, MapView osmv, boolean shadow) {
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e, MapView mapView) {
Projection proj = mapView.getProjection();
GeoPoint p = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());
proj = mapView.getProjection();
final GeoPoint geoPoint = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());
if(MapViewLoc.this.onTapListener != null){
MapViewLoc.this.onTapListener.onMapTapped(geoPoint);
Location location = new Location("");
location.setLatitude((double) geoPoint.getLatitudeE6() / 1000000);
location.setLongitude((double) geoPoint.getLongitudeE6() / 1000000);
location.setAccuracy(Criteria.ACCURACY_FINE);
MapViewLoc.this.onTapListener.onMapTapped(location);
}
return true;
}
};
}
public void addTapListener(OnTapListener onTapListener){
this.prepareTagOverlay();
this.getOverlays().add(0, this.tapOverlay);
this.onTapListener = onTapListener;
}
public void removeTapListener(){
if(this.tapOverlay != null && this.getOverlays().size() > 0){
this.getOverlays().remove(0);
}
this.tapOverlay = null;
this.onTapListener = null;
}
public interface OnTapListener{
void onMapTapped(GeoPoint geoPoint);
void onMapTapped(Location location);
}
}
要获取位置,只需设置OnTapListener接口。
mapView.addTapListener(new MapViewLoc.OnTapListener() {
@Override
public void onMapTapped(GeoPoint geoPoint) {}
@Override
public void onMapTapped(Location location) {
Toast toast = Toast.makeText(getApplicationContext(),
"Latitude: " + location.getLatitude() + " Longitude: " + location.getLongitude(),
Toast.LENGTH_SHORT);
toast.show();
}
});
答案 2 :(得分:1)
您必须创建Overlay
并覆盖onSingleTapConfirmed
。
试试这个:
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);
答案 3 :(得分:0)
尝试以下方法。
编写一个派生自Overlay类的类并覆盖onTap()方法。然后,您可以将叠加层添加到MapView。当您在地图上的某个位置选项卡时,GeoPoint对象(表示您点击的位置)将传递给onTap()方法。
答案 4 :(得分:0)
@Sandy是对的,而不是 onTap()覆盖 onSingleTapUp(MotionEvent e,MapView mapView)或 onSingleTapConfirmed(MotionEvent e,MapView mapView)方法,例如
onSingleTapUp(MotionEvent e, MapView mapView) {
Projection proj = mapView.getProjection();
IGeoPoint p = proj.fromPixels(e.getX(), e.getY());
}