2016-04-21 3 views
2

Ich versuche, das Zentrum einer Form in Android zu bekommen. Die Form wird auf der Karte von Hand gezeichnet. Ich habe alle Koordinaten, aber die Mittelwerte erweisen sich als kniffliger als ich dachte. Ich möchte einen Marker auf die mittlere Breite und Länge zeichnen.Zentrum eines Clusters von Längen- und Breitenpunkten in Google Map Android

Ich habe versucht, den Breiten- und Längengrad separat zu summieren und dann durch die Anzahl der Punkte zu dividieren. Dies gibt nicht die richtige Antwort. Der Marker scheint immer hinter der Figur zu liegen. Ich habe auch versucht, die Umsetzung verwenden, aber es gibt die gleiche Antwort, eine frühere Frage SO, Calculate the center point of multiple latitude/longitude coordinate pairs

Der Code Ich habe mit:

private void calculateFreeHandPolygonParameters(){ 

    double xValues = 0; 
    double yValues = 0; 
    double zValues = 0; 
    int count = 0; 

    // linesForPolygon a list of the lines in the polygon 
    for(Polyline line : linesForPolygon){ 
     for (LatLng point : line.getPoints()) { 
      xValues += Math.cos(Math.toRadians(point.latitude)) * Math.cos(Math.toRadians(point.longitude)); 
      yValues += Math.cos(Math.toRadians(point.latitude)) * Math.sin(Math.toRadians(point.longitude)); 
      zValues += Math.sin(Math.toRadians(point.latitude)); 
      count++; 
     } 
    } 

    double meanX = xValues/count; 
    double meanY = yValues/count; 
    double meanZ = zValues/count; 

    double centralLongitude = Math.atan2(meanY, meanX); 
    double centralSquareRoot = Math.sqrt(Math.pow(meanX, 2) + Math.pow(meanX, 2) + Math.pow(meanX, 2)); 
    double centralLatitude = Math.atan2(meanZ, centralSquareRoot); 

    double latitude = Math.toDegrees(centralLatitude); 
    double longitude = Math.toDegrees(centralLongitude); 

    Log.i("MAPS", "Freehand Parameters: x mean -> " + latitude + " y mean -> " + longitude); 

    testMarker = mMap.addMarker(new MarkerOptions() 
      .position(new LatLng(latitude, longitude)) 
      .title("Polygon center") 
      .snippet("lat: " + latitude + " long: " + longitude)); 
} 
+0

Die von Ihnen beschriebene Methode sollte funktionieren, außer vielleicht in Fällen, in denen der Längengrad in der Nähe der internationalen Datumsgrenze liegt oder wenn die Orte in der Nähe der Pole liegen. Vielleicht solltest du deinen Code teilen. – JerryM

Antwort

1

Hier ist mein Schwerpunkt Code:

public class PolygonCentroid { 

    private List<GeoPoint> points; 
    private int pointsSize; 

    public PolygonCentroid(List<GeoPoint> points) { 
     this.points = points; 
     this.pointsSize = points.size(); 
    } 

    protected double polygonArea() { 
     double area = 0; 
     for (int i = 0, j; i < pointsSize; i++) { 
      j = (i + 1) % pointsSize; 
      area += points.get(i).getLongitude() * points.get(j).getLatitude(); 
      area -= points.get(i).getLatitude() * points.get(j).getLongitude(); 
     } 
     area /= 2.0; 
     return area; 
    } 

    public GeoPoint centroid() { 
     double cx = 0, cy = 0; 
     double factor; 
     for (int i = 0, j; i < pointsSize; i++) { 
      j = (i + 1) % pointsSize; 
      factor = (points.get(i).getLongitude() * points.get(j).getLatitude() - points.get(j).getLongitude() * points.get(i).getLatitude()); 
      cx += (points.get(i).getLongitude() + points.get(j).getLongitude()) * factor; 
      cy += (points.get(i).getLatitude() + points.get(j).getLatitude()) * factor; 
     } 
     double A = polygonArea(); 
     factor = 1.0/(6.0 * A); 
     cx *= factor; 
     cy *= factor; 
     return new GeoPoint(cy, cx); 
    } 

} 

enter image description here

auch, achten Sie bitte, dass der Schwerpunkt außerhalb des Polygons sein kann:

enter image description here

Full source code und usage.

+0

Diese Methode funktioniert aber nur für die erste Iteration. Ich habe nicht herausgefunden, warum es nicht funktioniert, wenn ich ein anderes Polygon zeichne. Der Marker folgt wie in der vorherigen Version meines Codes. –

+0

Vergessen Sie nicht, die Liste der Koordinaten wie ich zurückzusetzen. –

+0

> "Marker Spuren hinter" Ich denke, Sie sollten auf [Z-Bestellung] (https://stackoverflow.com/questions/14771569/google-maps-v2-marker-zorringing-set-to-top) achten, wenn Sie möchten einige Ihrer Overlays immer oben anzeigen. –

1
  1. Sie müssen tatsächlich berechnen, was SCHWERPUNKT genannt wird. Es ist keine triviale Sache, schau mal hier: http://www.spatialanalysisonline.com/HTML/index.html?centroids_and_centers.htm
  2. Achten Sie auf, was Großkreis genannt wird, Flugpläne auf einem Flugzeug Karten erinnern ... Wenn also die Abstände relativ groß sind, müssen Sie dieses Phänomen im Auge entblößen.
  3. Dies ist eine klassische GIS Frage, nachdem Sie den Pseudo-Code des Algorithmus zu verstehen, es ist einfach Codierung Aufgabe ... versuchen gis.stackexchange.com
+0

Wie funktioniert der Code, den ich benutzt habe, nicht? Es macht durchaus Sinn den Durchschnitt zu berechnen wie ich es gemacht habe? Die erste Methode in der Verbindung, die Sie gegeben haben, ist, was ich anfangs versuchte, aber auch hinterherhinkte. Die Methode, die den zu berechnenden Bereich erfordert, wird extrem kompliziert –

+0

Ja, der Low-Level-Code dieser Art von Algorithmen in der Tat kompliziert ... Normalerweise verwenden GIS-Bibliothek für diese Art von Aufgabe, oder wenn die Standorte in der Datenbank mit gespeichert postgis, so hat postgis diese Art von Abfrage-Methoden zu. – michael

Verwandte Themen