i want to display my location and destination location at map. the problem is that the destination location always point at same location even if i change another destination long and lat...
here is the code
protected void tampilkanPosisikeMap(Location newLocation) {
List<Overlay> overlays = mapView.getOverlays();
if (overlays.size() > 0) {
for (Iterator iterator = overlays.iterator(); iterator.hasNext();) {
iterator.next();
iterator.remove();
}
}
GeoPoint geopoint = new GeoPoint(
(int) (newLocation.getLatitude() * 1E6), (int) (newLocation
.getLongitude() * 1E6));
GeoPoint myposition = geopoint;
Location locationA = new Location("point A");
Location locationB = new Location("point B");
locationA.setLatitude(geopoint.getLatitudeE6() / 1E6);
locationA.setLongitude(geopoint.getLongitudeE6() / 1E6);
Drawable icon1 = getResources().getDrawable(R.drawable.user);
icon1.setBounds(0, 0, icon1.getIntrinsicWidth(), icon1
.getIntrinsicHeight());
MyItemizedOverlay overlay1 = new MyItemizedOverlay(icon1, this);
OverlayItem item1 = new OverlayItem(geopoint, "Posisi Anda", "Lat:"
+ locationA.getLatitude() + "\nLng:" + locationA.getLongitude());
overlay1.addItem(item1);
mapView.getOverlays().add(overlay1);
String lat2,longi2;
String nama_rs;String alamat_rs;
nama_rs = getIntent().getExtras().getString("namarsakit");
alamat_rs = getIntent().getExtras().getString("alamatrsakit");
lat2 = getIntent().getExtras().getString("lat");
longi2 = getIntent().getExtras().getString("longi");
Double lintang_rs = Double.parseDouble(lat2);
Double bujur_rs = Double.parseDouble(longi2);
GeoPoint geopoint1 = new GeoPoint(
(int) (lintang_rs * 1E6),
(int) (bujur_rs * 1E6));
locationB.setLatitude(geopoint1.getLatitudeE6() / 1E6);
locationB.setLongitude(geopoint1.getLongitudeE6() / 1E6);
DecimalFormat formatData = new DecimalFormat("#.#");
float distance = (float) locationA.distanceTo(locationB) / 1000;
String jarak;
jarak = String.valueOf(formatData.format(distance));
Drawable icon = getResources().getDrawable(R.drawable.marker); //
icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon
.getIntrinsicHeight());
MyItemizedOverlay overlay = new MyItemizedOverlay(icon, this); //
OverlayItem item = new OverlayItem(geopoint1, nama_rs, //
alamat_rs
+ "\n\nJarak dari Posisi Anda : " + jarak + " km");
overlay.addItem(item);
mapView.getOverlays().add(overlay);
Toast.makeText(MapDetailActivity.this,"nama = "+nama_rs+"lat tujuan= "+lintang_rs+"long tujuan = "+bujur_rs, Toast.LENGTH_SHORT).show();
mapView.getController().animateTo(geopoint1);
}
this is the destination code from above :
String lat2,longi2;
String nama_rs;String alamat_rs;
nama_rs = getIntent().getExtras().getString("namarsakit");
alamat_rs = getIntent().getExtras().getString("alamatrsakit");
lat2 = getIntent().getExtras().getString("lat");
longi2 = getIntent().getExtras().getString("longi");
Double lintang_rs = Double.parseDouble(lat2);
Double bujur_rs = Double.parseDouble(longi2);
GeoPoint geopoint1 = new GeoPoint(
(int) (lintang_rs * 1E6),
(int) (bujur_rs * 1E6));
locationB.setLatitude(geopoint1.getLatitudeE6() / 1E6);
locationB.setLongitude(geopoint1.getLongitudeE6() / 1E6);
DecimalFormat formatData = new DecimalFormat("#.#");
float distance = (float) locationA.distanceTo(locationB) / 1000;
String jarak;
jarak = String.valueOf(formatData.format(distance));
Drawable icon = getResources().getDrawable(R.drawable.marker); //
icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon
.getIntrinsicHeight());
MyItemizedOverlay overlay = new MyItemizedOverlay(icon, this); //
OverlayItem item = new OverlayItem(geopoint1, nama_rs, //
alamat_rs
+ "\n\nJarak dari Posisi Anda : " + jarak + " km");
overlay.addItem(item);
mapView.getOverlays().add(overlay);
Toast.makeText(MapDetailActivity.this,"nama = "+nama_rs+"lat tujuan= "+lintang_rs+"long tujuan = "+bujur_rs, Toast.LENGTH_SHORT).show();
mapView.getController().animateTo(geopoint1);
For You to be able to show your Current location you must tap on to GPS location provider or Network Location provider. Looking at your code I cannot see any of this. Please note on emulator DDMS will default to a specific location. unless you supply one yourself
Related
I am new to Open Street Map map. I want to put the marker on map where i Tapped. I want to delete previous marker also. Please help me.
Thanks in advance. Here is my code
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) {
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);
ArrayList<OverlayItem> overlayArray = new ArrayList<OverlayItem>();
OverlayItem mapItem = new OverlayItem("", "", new GeoPoint(
(((double) loc.getLatitudeE6()) / 1000000),
(((double) loc.getLongitudeE6()) / 1000000)));
Drawable marker = null;
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);
}
return true;
}
};
Finally i get solution of this problem. here is my answer.
#Override
public boolean onSingleTapConfirmed(MotionEvent e, MapView mapView) {
Projection proj = mapView.getProjection();
p = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());
proj = mapView.getProjection();
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);
Toast toast = Toast.makeText(getApplicationContext(),
"Longitude: "
+ longitude + " Latitude: " + latitude, Toast.LENGTH_SHORT);
toast.show();
return true;
}
private void addLocation(double lat, double lng) {
// ---Add a location marker---
p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
Drawable marker = getResources().getDrawable(
android.R.drawable.star_big_on);
int markerWidth = marker.getIntrinsicWidth();
int markerHeight = marker.getIntrinsicHeight();
marker.setBounds(0, markerHeight, markerWidth, 0);
ResourceProxy resourceProxy = new DefaultResourceProxyImpl(
getApplicationContext());
myItemizedOverlay = new MyItemizedOverlay(marker, resourceProxy);
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(myItemizedOverlay);
mapView.invalidate();
}
I am trying to add some MapOverlays to my MapView and I get the following Error:
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44)
at com.google.android.maps.MapView.onDraw(MapView.java:530)
at android.view.View.draw(View.java:13458)
...
at dalvik.system.NativeStart.main(Native Method)
This is my doInBackground() method of my AsyncTask:
Drawable marker = myContext.getResources().getDrawable(
R.drawable.marker);
Bitmap bitmap = ((BitmapDrawable) marker).getBitmap();
Drawable marker_new = new BitmapDrawable(myContext.getResources(),
Bitmap.createScaledBitmap(
bitmap, MainActivity.MARKER_SIZE * 10,
MainActivity.MARKER_SIZE * 10, true));
mapOverlays = map.getOverlays();
int minLat = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int minLon = Integer.MAX_VALUE;
int maxLon = Integer.MIN_VALUE;
double fitFactor = 1.1;
MainActivity.mapListAddress.clear();
MainActivity.mapListTitle.clear();
MainActivity.mapListLati.clear();
MainActivity.mapListLongi.clear();
MainActivity.parseMaps();
for (int i = 0; i < MainActivity.mapListAddress.size(); i++) {
// String pointAddress = MainActivity.mapListAddress.get(i);
String pointTitel = MainActivity.mapListTitle.get(i);
MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay(
marker_new, map);
double latitude = MainActivity.mapListLati.get(i) * 1e6;
double longitude = MainActivity.mapListLongi.get(i) * 1e6;
Geocoder geocoder;
List<Address> addresses = null;
geocoder = new Geocoder(Map.this, Locale.getDefault());
try {
addresses = geocoder.getFromLocation(MainActivity.mapListLati.get(i),
MainActivity.mapListLongi.get(i), 1);
} catch (IOException e) {
e.printStackTrace();
}
String address = addresses.get(0).getAddressLine(0);
String city = addresses.get(0).getAddressLine(1);
String country = addresses.get(0).getAddressLine(2);
String pointAddress = address + "\n" + city + "\n" + country;
GeoPoint p = new GeoPoint((int) latitude, (int) longitude);
overlayitem = new OverlayItem(p, pointTitel,
pointAddress);
itemizedOverlay.setBalloonBottomOffset(40);
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
int lat = p.getLatitudeE6();
int lon = p.getLongitudeE6();
maxLat = Math.max(lat, maxLat);
minLat = Math.min(lat, minLat);
maxLon = Math.max(lon, maxLon);
minLon = Math.min(lon, minLon);
map.getController().zoomToSpan((int) (Math.abs(maxLat - minLat) * fitFactor),
(int) (Math.abs(maxLon - minLon) * fitFactor));
map.getController().animateTo(new GeoPoint((maxLat + minLat) / 2,
(maxLon + minLon) / 2));
}
return null;
Why does this error occur and what am I doing wrong in my code?
Try to synchronize the mapOverlays.add(itemizedOverlay);. I think this is where the issue is, multiple threads trying to add at the same time.
what is The command for removing specific overlay item ?
if here is my code of the added items
public void addOverLays(){
String [] coordinates = {"30.084262490272522","31.33625864982605" ,"30.084123015403748", "51.5002" , "-0.1262","31.337149143218994"};
double lat = 30.084262490272522, lat2 = 51.5002,lat3=29.987091422080994;
double log = 31.33625864982605, log2 = -0.1262,log3=31.43909454345703;
p = new GeoPoint((int) (lat * 1E6), (int) (log * 1E6));
p2 = new GeoPoint( (int) (lat2 * 1e6), (int) (log2 * 1e6));
p3=new GeoPoint( (int) (lat3 * 1e6), (int) (log3 * 1e6));
mapOverlays = mapView.getOverlays();
drawable = this.getResources().getDrawable(R.drawable.ballon);
drawable2 = this.getResources().getDrawable(R.drawable.ballon);
drawable3 = this.getResources().getDrawable(R.drawable.ballon);
itemizedOverlay = new HelloItemizedOverlay(drawable,this);
itemizedOverlay2 = new HelloItemizedOverlay(drawable2,this);
itemizedOverlay3 = new HelloItemizedOverlay(drawable3,this);
OverlayItem overlayitem = new OverlayItem(p, "Cairo", " over1");
OverlayItem over2 = new OverlayItem(p2, "ulm", "over2");
OverlayItem over3 = new OverlayItem(p3, "offff", "over3");
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
itemizedOverlay2.addOverlay(over2);
mapOverlays.add(itemizedOverlay2);
itemizedOverlay3.addOverlay(over3);
mapOverlays.add(itemizedOverlay3);
Replace add() with remove():
mapView.getOverlays().remove(<putYourOverlayHere>);
mapView.invalidate();
how can i make a loop for my overlay items android !! and what if i want to remove one of them by using mapView.getOverlays().remove(p); !! its doesn't work why ?? here is the code
enter code here
public void addOverLays(){
String [] coordinates = {"31.216487288475037","29.932637214660645" ,"30.084123015403748", "51.5002" , "-0.1262","31.337149143218994"};
double lat = 30.084686279296875,lat2 = 51.5002,lat3=29.987091422080994;
double log = 31.33642494678493, log2 = -0.1262,log3=31.43909454345703;
p = new GeoPoint((int) (lat * 1E6), (int) (log * 1E6));
p2 = new GeoPoint( (int) (lat2 * 1e6), (int) (log2 * 1e6));
p3=new GeoPoint( (int) (lat3 * 1e6), (int) (log3 * 1e6));
mapOverlays = mapView.getOverlays();
drawable = this.getResources().getDrawable(R.drawable.pushpin);
drawable2 = this.getResources().getDrawable(R.drawable.ballon);
drawable3 = this.getResources().getDrawable(R.drawable.ballon);
itemizedOverlay = new HelloItemizedOverlay(drawable,this);
itemizedOverlay2 = new HelloItemizedOverlay(drawable2,this);
itemizedOverlay3 = new HelloItemizedOverlay(drawable3,this);
OverlayItem overlayitem = new OverlayItem(p, "Cairo", " over1");
OverlayItem over2 = new OverlayItem(p2, "ulm", "over2");
OverlayItem over3 = new OverlayItem(p3, "offff", "over3");
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
itemizedOverlay2.addOverlay(over2);
mapOverlays.add(itemizedOverlay2);
itemizedOverlay3.addOverlay(over3);
mapOverlays.add(itemizedOverlay3);
mc.setZoom(17);
mc.animateTo(p);
}
Adding overlays does work in your code - if you mean you don't see any changes, then you have to call MapView.invalidate() to have it re-draw itself with the newly added overlays. The same is true when you remove an overlay.
public void addOverLays(){
String [] coordinates = {"30.084262490272522","31.33625864982605" ,"30.084123015403748", "51.5002" , "-0.1262","31.337149143218994"};
double lat = 30.084262490272522, lat2 = 51.5002,lat3=30.084123015403748;
double log = 31.33625864982605, log2 = -0.1262,log3=31.337149143218994;
p = new GeoPoint((int) (lat * 1E6), (int) (log * 1E6));
p2 = new GeoPoint( (int) (lat2 * 1e6), (int) (log2 * 1e6));
p3 = new GeoPoint( (int) (lat3 * 1E6), (int) (log3 * 1E6));
mapOverlays = mapView.getOverlays();
drawable = this.getResources().getDrawable(R.drawable.icon);
drawable2 = this.getResources().getDrawable(R.drawable.pushpin);
drawable3 = this.getResources().getDrawable(R.drawable.ballon);
itemizedOverlay = new HelloItemizedOverlay(drawable,this);
itemizedOverlay2 = new HelloItemizedOverlay(drawable2,this);
itemizedOverlay3 = new HelloItemizedOverlay(drawable3,this);
OverlayItem overlayitem = new OverlayItem(p, "Cairo", " over1");
OverlayItem over2 = new OverlayItem(p2, "ulm", "over2");
OverlayItem over3 = new OverlayItem(p3, "offff", "over3");
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
itemizedOverlay2.addOverlay(over2);
mapOverlays.add(itemizedOverlay2);
itemizedOverlay2.addOverlay(over3);
mapOverlays.add(itemizedOverlay3);
Why can't I add 3 items due to
p = new GeoPoint((int) (lat * 1E6), (int) (log * 1E6));
p2 = new GeoPoint( (int) (lat2 * 1e6), (int) (log2 * 1e6));
p3 = new GeoPoint( (int) (lat3 * 1E6), (int) (log3 * 1E6));
can't make 1E6 & 1e6 what other I have to do?!!
you might have a casting issue, hard to tell. Try using this utility method:
public static GeoPoint calculateGeoPoint(double latitude, double longitude) {
Double latE6 = latitude * 1E6;
Double lngE6 = longitude * 1E6;
return new GeoPoint(latE6.intValue(), lngE6.intValue());
}
It's worked reliably for me in tested production code.