Wie zeichnet man ein Polygon mit Markern und Mittelpunkten von Polylinien in Google Maps?

9

Ich möchte ein Freihand-Polygon auf der Karte zeichnen. Ich habe mit einer einfachen Google Map begonnen und ein Polygon gezeichnet. Es funktioniert ordnungsgemäß. Jetzt suche ich nach Möglichkeiten, wie ein Benutzer ein Polygon zeichnen kann, indem er auf Punkte auf der Karte klickt und Markierungen in der Mitte der Punkte auf der Karte streckt Polygon.

Jetzt sieht meine Karte mit Polygon so aus:

diese

und ich möchte implementieren:

diese

Hier ist mein Code:

     public class MapActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
Button save_field;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

    // Retrieve the content view that renders the map.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    FrameLayout Frame_map = (FrameLayout) findViewById(R.id.frame_map);
    Button btn_draw_State = (Button) findViewById(R.id.btn_draw_State);
    final Boolean[] Is_MAP_Moveable = {false}; // to detect map is movable

    // Button will change Map movable state
    btn_draw_State.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Is_MAP_Moveable[0] = !Is_MAP_Moveable[0];
        }
    });
}

public GoogleMap getmMap() {
    return mMap;
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    /*polygon should be declared as member of the fragment class if you want just one polygon at a time*/
    final List<LatLng> latLngList = new ArrayList<>(); // list of polygons
    final List<Marker> markerList = new ArrayList<>();

    mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
        @Override
        public void onMapClick(final LatLng latLng) {


            MarkerOptions markerOptions = new MarkerOptions(); //create marker options
            markerOptions.position(latLng);
            markerOptions.title(latLng.latitude + ":" + latLng.longitude);
            mMap.clear();
            mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
            mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
            Marker marker = mMap.addMarker(markerOptions);
            latLngList.add(latLng);
            markerList.add(marker);


            Polygon polygon = null;
            if (polygon != null ) polygon.remove(); // remove the previously drawn polygon
            PolygonOptions polygonOptions = new PolygonOptions().addAll(latLngList).clickable(true);
            polygon = mMap.addPolygon(new PolygonOptions().addAll(latLngList).fillColor(Color.BLUE).strokeColor(Color.RED));//add new polygon

        }
    });
             save_field = findViewById(R.id.save);
             save_field.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            startActivity(new Intent(MapActivity.this, Save_Fields.class));
            finish();
        }
    });
  }
 }

Ich habe viel zu diesem Thema geforscht und entwickelt, aber keine perfekte Möglichkeit gefunden, so etwas in Google Maps zu implementieren. Wenn jemand den Weg kennt, helfen Sie mir bitte, eine Lösung zu finden. Vielen Dank im Voraus:)

Mrunal
quelle

Antworten:

4

Verwenden Sie die MapDrawingTools-Bibliothek, um Polygone, Polylinien und Punkte in Google Map zu zeichnen und Koordinaten an Ihre App zurückzugeben. Diese Bibliothek ist nützlich für eine Anwendung, die mehrere Punkte auswählt oder die Landgrenze zeichnet, um Daten von Benutzern abzurufen.

Richtlinie verwenden

Fügen Sie in Ihrer App diesen Code hinzu:

DrawingOption.DrawingType currentDrawingType = DrawingOption.DrawingType.POLYGON;
Intent intent =
new DrawingOptionBuilder()
    .withLocation(35.744502, 51.368966)
    .withMapZoom(14)
    .withFillColor(Color.argb(60, 0, 0, 255))
    .withStrokeColor(Color.argb(100, 255, 0, 0))
    .withStrokeWidth(3)
    .withRequestGPSEnabling(false)
    .withDrawingType(currentDrawingType)
    .build(getApplicationContext());
startActivityForResult(intent, REQUEST_CODE);

Nachdem Sie ein Element gezeichnet und auf Fertig geklickt haben, kehren die Daten zu Ihrer Aktivität zurück

 @Override
protected void onActivityResult(int requestCode, int resultCode, 
Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE && data != 
null) {
DataModel dataModel =
                data.getExtras().getParcelable(MapsActivity.POINTS);
LatLng[] points=dataModel.getPoints();
 }
}

MapDrawingTools

Youtube Demo

Viel Spaß beim Codieren :)

Daxesh Vekariya
quelle
Ich lade MapDrawingTools-Code von Github und Tring herunter, um ihn auszuführen, aber er zeigt error: package rx.functions does not existdiesen Fehler
Mrunal
Ja ich sehe. Verwenden Sie es direkt. Ich hoffe, es ist nützlich für Ihre Fallimplementierung 'com.github.bkhezry: MapDrawingTools: 1.1.3'
Daxesh Vekariya
immer noch den gleichen Fehler
Mrunal
Bitte verwenden Sie so. Kopieren Sie alle Pakete aus der Bibliothek und fügen Sie sie in Ihr Projekt ein. und dann diese Bibliothek auf Gradle hinzufügen. Implementierung 'io.reactivex: rxjava: 1.3.0'
Daxesh Vekariya
1
Das will ich nicht. Ich versuche, bearbeitbares Polygon zu zeichnen.
Mrunal