簡體   English   中英

在 Google 地圖中使用 dragListener 可編輯多個多邊形

[英]Editable multiple polygon using dragListener in Google Maps

我想使用拖動偵聽器實現多個可編輯的多邊形。 我能夠繪制多個多邊形,但我不知道如何使其可編輯。

我可以移動當前多邊形的標記,但是當我嘗試移動前一個多邊形的標記應用程序時崩潰。 我嘗試保存多邊形列表,但無法拖動標記。

請在此處查看我的代碼。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (readyToGo()) {
            setContentView(R.layout.activity_maps);
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);

            if (savedInstanceState == null) {
                mapFragment.getMapAsync(this);
            }

            mapFragment.getMapAsync(this);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        CameraUpdate center =
                CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044,
                        -73.98180484771729));
        CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
        mMap.moveCamera(center);
        mMap.animateCamera(zoom);
        mMap.setIndoorEnabled(false);

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

                Marker marker = mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
                marker.setTag(latLng);
                markerList.add(marker);
                points.add(latLng);
                drawPolygon(points);
            }
        });


        mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
            @Override
            public void onMarkerDragStart(Marker marker) {

            }

            @Override
            public void onMarkerDrag(Marker marker) {
                updateMarkerLocation(marker, false);
            }

            @Override
            public void onMarkerDragEnd(Marker marker) {
                updateMarkerLocation(marker, true);

            }
        });

    }

    public void closePolygon(View view) {

    }

    public void newPolygon(View view) {

//
        points.clear();
        markerList.clear();
        polygon = null;
//        mMap.clear();
    }

    private void updateMarkerLocation(Marker marker, boolean calculate) {
        LatLng latLng = (LatLng) marker.getTag();
        int position = points.indexOf(latLng);
        points.set(position, marker.getPosition());
        marker.setTag(marker.getPosition());
        drawPolygon(points);

    }

    private void drawPolygon(List<LatLng> latLngList) {
        if (polygon != null) {
            polygon.remove();
        }
        polygonOptions = new PolygonOptions();
        polygonOptions.addAll(latLngList);
        polygon = mMap.addPolygon(polygonOptions);

    }

}

基本上,這種方法將標記和點保留為與每個多邊形相關聯的 collections。 它通過假設在 5 個標記后創建一個新多邊形(相當於添加多邊形)來簡化事情。

更新:使用github布局中定義的“新多邊形”按鈕。 按鈕偵聽器只是設置一個標志,而不是使用 size=5 檢查用標志替換檢查。

維護從任何標記到其相應列表的 map 以用於updateMarkerLocation方法。

所有這一切都基於這樣一個事實,即任何標記都具有由 map API getId()提供的唯一 ID,這實際上是一個類似於“m7”的字符串。

我列出了更新的部分:

// Map a marker id to its corresponding list (represented by the root marker id)
HashMap<String,String> markerToList = new HashMap<>();

// A list of markers for each polygon (designated by the marker root).
HashMap<String,List<Marker>> polygonMarkers = new HashMap<>();

// A list of polygon points for each polygon (designed by the marker root).
HashMap<String,List<LatLng>> polygonPoints = new HashMap<>();

// List of polygons (designated by marker root).
HashMap<String,Polygon> polygons = new HashMap<>();

// The active polygon (designated by marker root) - polygon added to.
String markerListKey;

// Flag used to record when the 'New Polygon' button is pressed.  Next map
// click starts a new polygon.
boolean newPolygon = false;

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    CameraUpdate center =
            CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044,
                    -73.98180484771729));
    CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
    mMap.moveCamera(center);
    mMap.animateCamera(zoom);
    mMap.setIndoorEnabled(false);

    Button b = findViewById(R.id.bt_new_polygon);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            newPolygon = true;
        }
    });

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

            Marker marker = mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
            marker.setTag(latLng);

            // Special case for very first marker.
            if (polygonMarkers.size() == 0) {
                polygonMarkers.put(marker.getId(),new ArrayList<Marker>());
                // only 0 or 1 polygons so just add it to new one or existing one.
                markerList = new ArrayList<>();
                points = new ArrayList<>();
                polygonMarkers.put(marker.getId(),markerList);
                polygonPoints.put(marker.getId(),points);
                markerListKey = marker.getId();
            }

            if (newPolygon) {
                newPolygon = false;
                markerList = new ArrayList<>();
                points = new ArrayList<>();
                polygonMarkers.put(marker.getId(),markerList);
                polygonPoints.put(marker.getId(),points);
                markerListKey = marker.getId();
            }

            markerList.add(marker);
            points.add(latLng);
            markerToList.put(marker.getId(),markerListKey);

            drawPolygon(markerListKey, points);
        }
    });


private void updateMarkerLocation(Marker marker, boolean calculate) {

    // Use the marker to figure out which polygon list to use...
    List<LatLng> pts = polygonPoints.get(markerToList.get(marker.getId()));
    
    // This is much the same except use the retrieved point list.
    LatLng latLng = (LatLng) marker.getTag();
    int position = pts.indexOf(latLng);
    pts.set(position, marker.getPosition());
    marker.setTag(marker.getPosition());
    drawPolygon(markerToList.get(marker.getId()),pts);

}

private void drawPolygon(String mKey, List<LatLng> latLngList) {

    // Use the existing polygon (if any) for the root marker.
    Polygon polygon = polygons.get(mKey);
    if (polygon != null) {
        polygon.remove();
    }
    polygonOptions = new PolygonOptions();
    polygonOptions.addAll(latLngList);
    polygon = mMap.addPolygon(polygonOptions);
    
    // And update the list for the root marker.
    polygons.put(mKey,polygon);
}

最初的

通過單擊 map 添加的 3 個多邊形的初始集合...

在此處輸入圖像描述

修改的

然后顯示每個多邊形中一個點的圖像被拉伸......

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM