2016-08-24 2 views
5

Hi derzeit arbeite ich auf einer Google Maps App.android google maps Polygon hinzufügen Kreis Loch

und ich mag folgende Wirkung:

enter image description here

Um dies zu tun, ich war, was zunächst einen Polygon-Overlay über das ganze Land zu schaffen, gefolgt von einem Loch in diesen Polygon für den markierten Bereich mit einem Zusatz bestimmter KM-Radius, so dass es beim Zoomen schrumpft und expandiert.

Jetzt kann ich ein Polygon erstellen;

mMap.addPolygon(new PolygonOptions().addAll(sCountryBorder).fillColor(0xcc000000)); 

Jetzt mag ich ein Loch zu diesem Polygon hinzuzufügen, aber ich weiß nicht, wie ein rundes Loch mit dem richtigen Radius zu erzeugen.

mMap.addPolygon(new PolygonOptions().addAll(sCountryBorder).fillColor(0xcc000000).addHole({CIRCULAR_HOLE})); 

Ich weiß, es ist möglich, einen Kreis mit einem bestimmten Radius in Google Maps zu erstellen, ist es auch möglich, irgendwie diese Umwandlung in einen Array von LatLng Objekten?

mMap.addCircle(new CircleOptions() 
         .center(newLocation) 
         .radius(mRadius.size) 
         .strokeWidth(0) 
         .fillColor(getResources().getColor(R.color.transparant))); 
+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/36030648/custom-disabled-and-blank-map-in-android/36039979#36039979 – antonio

+0

aber wie würde ich einen tatsächlichen Radius in Metern berücksichtigen? – sn0ep

+0

Der Code aus diesem Beispiel berücksichtigt bereits den Radius in Metern (150 Meter) – antonio

Antwort

-1

ich diese Methode verwendet, um einen Kreis mit 5000m Radius zu ziehen aus dem Standort des Nutzers, aber ich weiß nicht, wie die schönen Effekt hervorgehoben in Ihrer Demo Bild zu bekommen, diese Methode gibt Ihnen einen Kreis mit hellblauem Hintergrund und ein dunkelblauer Strich. Ich hoffe es hilft!

private void drawCircle(LatLng point){ 

     // Instantiating CircleOptions to draw a circle around the marker 
     CircleOptions circleOptions = new CircleOptions(); 

     // Specifying the center of the circle 
     circleOptions.center(point); 

     // Radius of the circle 
     circleOptions.radius(5000); 

     // Border color of the circle 
     circleOptions.strokeColor(0xFF0000FF); 

     // Fill color of the circle 
     circleOptions.fillColor(0x110000FF); 

     // Border width of the circle 
     circleOptions.strokeWidth(2); 

     // Adding the circle to the GoogleMap 
     mMap.addCircle(circleOptions); 

    } 
4

Leider Google Maps-Bibliothek nicht ein Array von LatLng des Kreises zu bekommen. Sie müssen also selbst einen Kreis zeichnen.

Grundsätzlich müssen Sie eine Methode bereitstellen, die ein Loch (Kreis) für ein Polygon erstellt, das Ihre Karte ausfüllt.

Es gibt 3 Schritte.

1 Schritt ist eine Methode zu erstellen, die ein Polygon erstellt, das die gesamte Karte abdeckt.

private static List<LatLng> createOuterBounds() { 
    float delta = 0.01f; 

    return new ArrayList<LatLng>() {{ 
     add(new LatLng(90 - delta, -180 + delta)); 
     add(new LatLng(0, -180 + delta)); 
     add(new LatLng(-90 + delta, -180 + delta)); 
     add(new LatLng(-90 + delta, 0)); 
     add(new LatLng(-90 + delta, 180 - delta)); 
     add(new LatLng(0, 180 - delta)); 
     add(new LatLng(90 - delta, 180 - delta)); 
     add(new LatLng(90 - delta, 0)); 
     add(new LatLng(90 - delta, -180 + delta)); 
    }}; 
} 

Schritt ist es, ein Verfahren zu schaffen, die ein Iterable mit LatLng s dem Kreis zurückkehrt.

private static Iterable<LatLng> createHole(LatLng center, int radius) { 
    int points = 50; // number of corners of inscribed polygon 

    double radiusLatitude = Math.toDegrees(radius/(float) EARTH_RADIUS); 
    double radiusLongitude = radiusLatitude/Math.cos(Math.toRadians(center.latitude)); 

    List<LatLng> result = new ArrayList<>(points); 

    double anglePerCircleRegion = 2 * Math.PI/points; 

    for (int i = 0; i < points; i++) { 
     double theta = i * anglePerCircleRegion; 
     double latitude = center.latitude + (radiusLatitude * Math.sin(theta)); 
     double longitude = center.longitude + (radiusLongitude * Math.cos(theta)); 

     result.add(new LatLng(latitude, longitude)); 
    } 

    return result; 
} 

3 und der letzte Schritt ist es, diese Methoden zur Schaffung PolygonOptions zu verwenden.

static PolygonOptions createPolygonWithCircle(Context context, LatLng center, int radius) { 
    return new PolygonOptions() 
     .fillColor(ContextCompat.getColor(context, R.color.grey_500_transparent)) 
     .addAll(createOuterBounds()) 
     .addHole(createHole(center, radius)) 
     .strokeWidth(0); 
} 

Ich habe auch ein Demo-Repository erstellt, das eine App enthält, die benötigte Kreise zieht. https://github.com/AntonyGolovin/Google-Map-mask. Die gesamte benötigte Logik ist in der Klasse MapHelper.java enthalten.

Ergebnis:

Screenshot