Google Maps 多个多边形,从第一个多边形位置开始第二个多边形

Posted

技术标签:

【中文标题】Google Maps 多个多边形,从第一个多边形位置开始第二个多边形【英文标题】:Google Maps multiple polygon which starting the second polygon from the first polygon location 【发布时间】:2019-04-11 15:51:22 【问题描述】:

我是 android 开发的新手。我正在尝试做多个多边形。我做到了,但第二个多边形是从第一个多边形的末端开始的。我已经列出了我关注的问题以及显示我的结果的图片。

Multiple Polygon On Map

How to draw free hand polygon in Google map V2 in Android?

My result

这是我的代码:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback 

    private GoogleMap mMap;
    private static final LatLng MainLocation = new LatLng(40.828070, -111.904610);
    FrameLayout fram_map;
    FloatingActionButton fab;
    Boolean Is_MAP_Moveable = false;
    Projection projection;
    public double latitude;
    public double longitude;
    PolygonOptions rectOptions;
    ArrayList < LatLng > val = new ArrayList < > ();
    ArrayList < ArrayList < LatLng >> val2 = new ArrayList < > ();
    Polygon polygon;
    String LogName = "XEL";

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        fram_map = (FrameLayout) findViewById(R.id.fram_map);
        fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                if (Is_MAP_Moveable) 
                    Is_MAP_Moveable = false;
                    if (val2.isEmpty()) 
                        val2.add(0, val);
                     else 
                        val2.add(val2.size(), val);
                    

                 else 
                    Is_MAP_Moveable = true;
                
            
        );
        fram_map.setOnTouchListener(new View.OnTouchListener() 
            @Override
            public boolean onTouch(View v, MotionEvent event) 
                if (Is_MAP_Moveable) 
                    float x = event.getX();
                    float y = event.getY();

                    int x_co = Math.round(x);
                    int y_co = Math.round(y);

                    projection = mMap.getProjection();
                    Point x_y_points = new Point(x_co, y_co);

                    LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
                    latitude = latLng.latitude;

                    longitude = latLng.longitude;

                    int eventaction = event.getAction();
                    switch (eventaction) 
                        case MotionEvent.ACTION_DOWN:
                            val.add(new LatLng(latitude, longitude));
                        case MotionEvent.ACTION_MOVE:
                            val.add(new LatLng(latitude, longitude));
                        case MotionEvent.ACTION_UP:
                            Draw_Map();
                            break;
                    

                 else 
                    Toast.makeText(MainActivity.this, "Please start the zone", Toast.LENGTH_SHORT).show();
                

                return Is_MAP_Moveable;

            
        );
    

    @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() 
            @Override
            public void onPolygonClick(Polygon polygon) 
                Toast.makeText(MainActivity.this, polygon.getPoints().toString(), Toast.LENGTH_SHORT).show();
            
        );
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MainLocation,
            20));
    

    public void Draw_Map() 
        /*  for (int i = 0; i < val2.size(); i++) 
              rectOptions = new PolygonOptions();
              rectOptions.addAll(val2.get(i));
              rectOptions.strokeColor(Color.BLUE);
              rectOptions.strokeWidth(7);
              rectOptions.fillColor(Color.CYAN);
              polygon = mMap.addPolygon(rectOptions);
              polygon.setClickable(true);
          */
        rectOptions = new PolygonOptions();
        rectOptions.addAll(val);
        rectOptions.strokeColor(Color.BLUE);
        rectOptions.strokeWidth(7);
        rectOptions.fillColor(Color.CYAN);
        polygon = mMap.addPolygon(rectOptions);
        polygon.setClickable(true);
    

【问题讨论】:

得到答案了吗?问题解决了吗? 【参考方案1】:

从概述中,我可以提出一些建议。如果您实施这些事情,问题可能会得到解决:

    现在做一个单独的 onClick 用户。使用 onTouch。

    //declare globally
    float init_x, init_y;
    float tolerance = 5;
    
    fram_map.setOnTouchListener(new View.OnTouchListener() 
            @Override
            public boolean onTouch(View v, MotionEvent event) 
                switch (event.getAction()) 
                    case MotionEvent.ACTION_DOWN:
                        init_x = event.getX();
                        init_y = event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
    
                        break;
                    case MotionEvent.ACTION_UP:
                        float x = event.getX();
                        float y = event.getY();
                        Is_MAP_Moveable = Math.abs(init_x - x) > tolerance || Math.abs(init_y - y) > tolerance;
                        if(!Is_MAP_Moveable) 
                            int x_co = Math.round(x);
                            int y_co = Math.round(y);
    
                            projection = mMap.getProjection();
                            Point x_y_points = new Point(x_co, y_co);
                            LatLng latLng = mMap.getProjection().fromScreenLocation(x_y_points);
                            latitude = latLng.latitude;
                            longitude = latLng.longitude;
                            val.add(new LatLng(latitude, longitude));
                            Draw_Map();
                         else 
                            Toast.makeText(MainActivity.this, "Please start the zone", Toast.LENGTH_SHORT).show();
                        
                        break;
                
                return Is_MAP_Moveable;
    
            
        );
    

      不需要使用 ArrayList of ArrayLists of LatLng - val2。使用 val 绘制多边形。

      在覆盖任何新多边形之前清除地图上的所有多边形,因为您要在 ArrayList 中推送元素。在添加新多边形之前使用polygon.remove();

【讨论】:

什么都没有发生,甚至多边形都在绘制

以上是关于Google Maps 多个多边形,从第一个多边形位置开始第二个多边形的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps JS API 多边形渲染问题

如何使用 Google Maps API 显示多边形?

如何在google maps api中为省或某个城市提供一些颜色?

如何使用 react-google-maps 在 React.JS 中获取多边形的坐标

Google Maps v3 - 删除多边形上的顶点

如何更改 React-Google-Maps 多边形的样式选项 onHover?