【问题标题】:add polyline array in polyline array in google maps android在谷歌地图android的折线数组中添加折线数组
【发布时间】:2021-01-06 10:17:03
【问题描述】:

我想在地图中制作多条折线。我在地图中有一条折线,然后我想再次制作新的折线。但该线始终与先前的折线连接。我该怎么办,这是我的代码:

package com.evy;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

public class Tambah extends FragmentActivity implements LocationListener{
    GoogleMap map;
    LocationManager lm;
    boolean isNewPoly=false;
    PolylineOptions polyline;
    ArrayList<LatLng> poly = new ArrayList<LatLng>();
    ArrayList<LatLng> points = new ArrayList<LatLng>();
    PolylineOptions polylineOptions;


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

        //points=new ArrayList<LatLng>();
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.maptambah);
        map=mapFragment.getMap();


        final LocationListener ll=new LocationListener(){

            @Override
            public void onLocationChanged(Location location) {
                // TODO Auto-generated method stub
                map.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(),location.getLongitude())).title("posisi anda").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
                map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(),location.getLongitude()), 15.0f));
            }

            @Override
            public void onProviderDisabled(String arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProviderEnabled(String arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
                // TODO Auto-generated method stub

            }

        };

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);

        Button stop = (Button) findViewById(R.id.stop);
        Button start = (Button) findViewById(R.id.start);



        map.setOnMapClickListener(new OnMapClickListener(){

            @Override
            public void onMapClick(LatLng point) {
                // TODO Auto-generated method stub
                if(isNewPoly==true){
                    MarkerOptions markerOptions = new MarkerOptions().position(point).title("Position").snippet("Latitude: "+point.latitude+" , "+"Longitude: "+point.longitude).icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));
                    map.addMarker(markerOptions);
                    polylineOptions = new PolylineOptions().color(Color.BLUE).width(3);
                    points.add(point);
                    for(int i=0;i<points.size();i++){
                        polylineOptions.add(points.get(i));
                    }
                    map.addPolyline(polylineOptions);
                }
                for(int i=0;i<points.size();i++){
                    poly.add(points.get(i));
                }

            }
        }); 

        start.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                isNewPoly=true;
            }

        });

        stop.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                isNewPoly=false;
            }

        });
    }

    public static String encode(final List<LatLng> path){
        long lastLat = 0;
        long lastLng = 0;

        final StringBuffer result = new StringBuffer();

        for(final LatLng point:path){
            long lat = Math.round(point.latitude * 1e5);
            long lng = Math.round(point.longitude * 1e5);

            long dlat = lat - lastLat;
            long dlng = lng - lastLng;

            encoded(dlat, result);
            encoded(dlng, result);

            lastLat = lat;
            lastLng = lng;
        }
        return result.toString();
    }

    private static void encoded(long v, StringBuffer result){
        v = v < 0 ? ~(v<<1) : v<<1;
        while(v >= 0x20){
            result.append(Character.toChars((int) ((0x20 | (v & 0x1f))+63)));
            v >>= 5;
        }
        result.append(Character.toChars((int) (v + 63)));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.tambah, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch(item.getItemId()){
        case R.id.home:
            this.finish();
            startActivity(new Intent(Tambah.this, Peta.class));
            return true;
            default:
                return super.onOptionsItemSelected(item);
        }

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

}

如果我按下按钮开始,它会创建新的折线,然后按下按钮停止来停止它,但它不起作用。按钮停止不闪烁。

【问题讨论】:

  • @sreedhumadhu 感谢您的回答。我尝试了那个导师,但对我不起作用,当我按下绘图按钮时,我无法在地图上做任何事情。有没有简单的方法用按钮绘制折线?
  • @sreedhumadhu 我解决了我的问题。谢谢sreedhumadhu。只是因为arraylist

标签: android google-maps polyline


【解决方案1】:

您当前一次追加所有点,而不是您应该使用折线数组。假设坐标 1 和坐标 2 是先前从 KML 文件或其他来源附加的 LatLng[] 类型的数组。你应该像下面这样写;

int size=3 //determine the size of array.
   
Polyline[] polyLine;
polyLine = new Polyline[size];

   
int i =0;
while (i<size)
{
polyLine[i] = map.addPolyline(new PolylineOptions()
                            .clickable(true)
                            .add(coordinates1[i],coordinates1[i+1]));
i++;
}

【讨论】:

    【解决方案2】:
    List<LatLng> latLngList = new ArrayList<>();
            for (int i = 0; i < arrayList.size(); i++) {
                latLngList.add(i, new LatLng(arrayList.get(i).getLocation_lat(), arrayList.get(i).getLocation_lang()));
                }
     Polyline polyline = googleMaps.addPolyline(new PolylineOptions()
                    .clickable(true)
                    .addAll(latLngList)
                    .width(2).color(Color.BLUE).geodesic(true));
    

    【讨论】:

    • 虽然这段代码可以回答这个问题,但最好描述一下代码在做什么。没有任何解释的答案可能会被标记为低质量并被删除。
    【解决方案3】:
    List<LatLng> latLngList = new ArrayList<>();
            for (int i = 0; i < arrayList.size(); i++) {
                latLngList.add(i, new LatLng(arrayList.get(i).getLocation_lat(), arrayList.get(i).getLocation_lang()));
               }
     
     Polyline polyline = mMap.addPolyline(new PolylineOptions()
                    .clickable(true)
                    .addAll(latLngList)
                    .width(2).color(Color.BLUE).geodesic(true));
    

    【讨论】:

    • 欢迎来到 Stack Overflow。没有任何解释的代码转储很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何比 OP 提供的更好。见How to Answer。
    猜你喜欢
    • 2015-11-13
    • 2013-07-25
    • 2015-12-12
    • 2015-07-12
    • 2015-04-25
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多