2012-05-21 34 views
2

我試圖在我的位置附近創建隨機位置。我想要的是在圍繞我的位置200米的圓周內創建隨機的經度/緯度對。在問這個問題之後:generate random locations nearby my location這就是我所想到的。創建隨機位置時的錯誤距離

在onLocationChanged

,這是我做的:

private void updateWithNewLocation(Location location) { 
    if (location != null) { 
     this.myItemizedOverlay.clear(); 
     this.nonPlayerItemizedOverlay.clear(); 
     this.mapOverlays.clear(); 
     // Update my map location. 
     Double latitude = location.getLatitude() * 1E6; 
     Double longitude = location.getLongitude() * 1E6; 
     GeoPoint geoPoint = new GeoPoint(latitude.intValue(), 
       longitude.intValue()); 

     CustomOverlayItem pcOverlayItem = new CustomOverlayItem(geoPoint, 
       "", "", ""); 

     this.mapController.animateTo(geoPoint); 

     this.myItemizedOverlay.setLocation(location); 
     this.myItemizedOverlay.addOverlay(pcOverlayItem); 
     this.mapOverlays.add(this.myItemizedOverlay); 

     // Everytime i get a new location i generate random non player 
     // characters near my location 
     int numberOfNonPlayers = new Random().nextInt(5); 

     for (int i = 0; i < numberOfNonPlayers; i++) { 
      int radius = (int) this.myMapView.getProjection() 
        .metersToEquatorPixels(200); 
      double lowerLimit = -1; 
      double upperLimit = 1; 

      Double newLatitude = location.getLatitude() 
        * 1E6 
        + (radius * (lowerLimit + (Math.random() * ((upperLimit - lowerLimit) + 1)))); 
      Double newLongitude = location.getLongitude() 
        * 1E6 
        + (radius * (lowerLimit + (Math.random() * ((upperLimit - lowerLimit) + 1)))); 

      GeoPoint geoPoint2 = new GeoPoint(newLatitude.intValue(), 
        newLongitude.intValue()); 

      CustomOverlayItem npcOverlayItem = new CustomOverlayItem(
        geoPoint2, "", "", ""); 

      Location newLocation = new Location("npc " + i); 
      newLocation.setLatitude(newLatitude); 
      newLocation.setLongitude(newLongitude); 

      this.nonPlayerItemizedOverlay = new NonPlayerItemizedOverlay(
        this.nonPlayerDrawable, this.myMapView); 
      this.nonPlayerItemizedOverlay.setLocation(newLocation); 
      this.nonPlayerItemizedOverlay.addOverlay(npcOverlayItem); 
      this.mapOverlays.add(this.nonPlayerItemizedOverlay); 
     } 
    } 
} 

這是我NonPlayerItemizedOverlay類:

public class NonPlayerItemizedOverlay extends BaseItemizedOverlay { 

public NonPlayerItemizedOverlay(Drawable defaultMarker, MapView mapView) { 
    super(defaultMarker, mapView); 
    // TODO Auto-generated constructor stub 
} 

private Location location; 

public static int metersToRadius(float meters, MapView map, double latitude) { 
    return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/Math 
      .cos(Math.toRadians(latitude)))); 
} 

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    super.draw(canvas, mapView, shadow); 

    if (shadow == false) { 
     Projection projection = mapView.getProjection(); 

     // Get the current location 
     Double latitude = location.getLatitude(); 
     Double longitude = location.getLongitude(); 
     GeoPoint geoPoint = new GeoPoint(latitude.intValue(), 
       longitude.intValue()); 

     // Convert the location to screen pixels 
     Point point = new Point(); 
     projection.toPixels(geoPoint, point); 

     // int radius = metersToRadius(30, mapView, latitude); 
     int radius = (int) mapView.getProjection() 
       .metersToEquatorPixels(50); 

     RectF oval = new RectF(point.x - radius, point.y - radius, point.x 
       + radius, point.y + radius); 

     // Setup the paint 
     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setStrokeWidth(2.0f); 

     paint.setColor(0xffE62020); 
     paint.setStyle(Style.STROKE); 
     canvas.drawOval(oval, paint); 

     paint.setColor(0x18E62020); 
     paint.setStyle(Style.FILL); 
     canvas.drawOval(oval, paint); 
    } 
} 

public Location getLocation() { 
    return location; 
} 

public void setLocation(Location location) { 
    this.location = location; 
} 

而且我MyItemizedOverlay類:

public class MyItemizedOverlay extends BaseItemizedOverlay { 

public MyItemizedOverlay(Drawable defaultMarker, MapView mapView) { 
    super(defaultMarker, mapView); 
    // TODO Auto-generated constructor stub 
} 

private Location location; 

public static int metersToRadius(float meters, MapView map, double latitude) { 
    return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/Math 
      .cos(Math.toRadians(latitude)))); 
} 

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    super.draw(canvas, mapView, shadow); 

    if (shadow == false) { 
     Projection projection = mapView.getProjection(); 

     // Get the current location 
     Double latitude = location.getLatitude() * 1E6; 
     Double longitude = location.getLongitude() * 1E6; 
     GeoPoint geoPoint = new GeoPoint(latitude.intValue(), 
       longitude.intValue()); 

     // Convert the location to screen pixels 
     Point point = new Point(); 
     projection.toPixels(geoPoint, point); 

     // int radius = metersToRadius(100, mapView, latitude); 
     int radius = (int) mapView.getProjection().metersToEquatorPixels(
       200); 

     RectF oval = new RectF(point.x - radius, point.y - radius, point.x 
       + radius, point.y + radius); 

     // Setup the paint 
     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setStrokeWidth(2.0f); 

     paint.setColor(0xff6666ff); 
     paint.setStyle(Style.STROKE); 
     canvas.drawOval(oval, paint); 

     paint.setColor(0x186666ff); 
     paint.setStyle(Style.FILL); 
     canvas.drawOval(oval, paint); 
    } 
} 

public Location getLocation() { 
    return location; 
} 

public void setLocation(Location location) { 
    this.location = location; 
} 

的事情是,發生了一些奇怪的事情,因爲所有的隨機位置都離我的位置ce太近了但是,似乎這個公式並沒有覆蓋整個半徑,我認爲距離並不是真實的米。

任何想法可能是我的公式錯了嗎?

在此先感謝

+1

我不是地圖投影方面的專家,但這些人可能是:http://gis.stackexchange.com/ –

+0

謝謝託尼,那個鏈接真的幫了我。如果你寫回應,我會將其標記爲已接受 – pindleskin

回答

1

如有問題有關地圖投影座標計算,這個SE網站可能會有所幫助:http://gis.stackexchange.com(地理信息系統)。

0

要確保使用位置的distanceTo()公式class.You可以這樣來做:

double distance = a.distanceTo(b); 

其中A和B是定位對象。

+0

謝謝。檢查後,距離是真實的米。現在看來,我不是使用整個半徑創建地點,就像它的一半 – pindleskin