【问题标题】:Google Maps Android point in polygon谷歌地图Android点多边形
【发布时间】:2014-12-22 18:03:08
【问题描述】:

我创建了一个使用 google maps android api 的 android 应用。
这个应用程序需要有一个点击多边形功能,但由于它在谷歌地图 android api v2 上不可用。我做了一些研究并找到了解决此功能的方法。
我最终得到的是检查一个点是否在多边形方法中。
我正在使用这个library。如果您手动创建边界,它会很好地工作。
如果可以在循环中创建边界来解决我的问题。
我从我的数据库中获取多边形点。

这是我的 MapFragment 代码:

public class MapBlocksMapView extends Fragment {

    protected GoogleMap googleMap;
    protected LatLng latLng;
    protected Intent intent;
    protected String color, crops, block_code, tmp_user;

    public MapBlocksMapView() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ActionBar actionBar = getActivity().getActionBar();
        actionBar.setTitle("Block View");
        View rootView = inflater.inflate(R.layout.fragment_blocksmapview, container, false);

        if (googleMap== null) {
            googleMap= ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();
        }

        Bundle bundle = getArguments();
        if (bundle != null) {
            block_code = bundle.getString("block_code");
            tmp_user = bundle.getString("user");
        }

        googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                checkpoint(latLng.latitude, latLng.longitude);
            }
        });
        return rootView;

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        getdata(getActivity(), block_code);
        super.onActivityCreated(savedInstanceState);
    }

    private void checkpoint(double latitude, double longitude) {

        System.out.println(latitude +"," +longitude);
    }

    public void getdata(Context ctx, String block_code) {

        SQLHelper dbhelper = new SQLHelper(ctx);
        dbhelper.getReadableDatabase();

        JSONArray jsonArray = dbhelper.getSingleBlocks(block_code);

        try {
            for (int a = 0; a < jsonArray.length(); a++) {

                JSONObject jsonObject = new JSONObject(String.valueOf(jsonArray.getJSONObject(a)));
                JSONArray jsonArray1 = jsonObject.getJSONArray("b_points");
                if (jsonObject.getJSONArray("b_points").length() > 0) {
                    color = jsonObject.getString("b_color");
                    crops = jsonObject.getString("b_crop");
                    PolygonOptions rectOptions = new PolygonOptions();

                    for (int b = 0; b < jsonArray1.length(); b++) {
                        JSONArray jsonArray2 = jsonArray1.getJSONArray(b);

                        rectOptions.add(new LatLng(jsonArray2.getDouble(0), jsonArray2.getDouble(1)));


                        System.out.println(jsonArray2.get(0) + " / " + jsonArray2.get(1));

                    }
                    latLng = new LatLng(jsonArray1.getJSONArray(0).getDouble(0), jsonArray1.getJSONArray(0).getDouble(1));
                    rectOptions.strokeWidth(1).strokeColor(Color.parseColor(color)).fillColor(Color.parseColor(color));
                    googleMap.addPolygon(rectOptions);
                    CameraUpdate cameraPosition = CameraUpdateFactory.newLatLngZoom(latLng, 17);
                    googleMap.animateCamera(cameraPosition);

                } else {

                    Toast.makeText(getActivity(), "Error with the selected block", Toast.LENGTH_LONG).show();
                    closeFragment();
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        SupportMapFragment f = (SupportMapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        if (f != null)
            getFragmentManager().beginTransaction().remove(f).commit();
    }

    private void closeFragment() {
        getActivity().getFragmentManager().popBackStack();
    }

}

以下是库中的示例代码:

Polygon polygon = Polygon.Builder()
    .addVertex(new Point(1, 3))
    .addVertex(new Point(2, 8))
    .addVertex(new Point(5, 4))
    .addVertex(new Point(5, 9))
    .addVertex(new Point(7, 5))
    .addVertex(new Point(6, 1))
    .addVertex(new Point(3, 1))
    .build();

Point point = new Point(4.5f, 7);
boolean contains = polygon.contains(point);

如果有人有其他解决方案或建议会有所帮助。
谢谢

【问题讨论】:

    标签: android google-maps polygon


    【解决方案1】:

    我也遇到了同样的问题,但我还没有找到解决这个问题的“好”解决方案。

    最后,我将所有多边形保存在一个列表中,并通过单击位置对其进行迭代。 (但要注意;也许你在这个位置有多个多边形)

    【讨论】:

      【解决方案2】:

      这个图书馆不会有太大帮助,因为你有地理位置,图书馆需要屏幕位置,所以你将自己做大部分工作。

      您需要获取每个纬度并通过获取地图投影将它们转换为屏幕点

      Point point = googleMap.getProjection().toScreenLocation(myLatLngPoint);
      

      然后您可以在循环时将该点放入您的库中。但是,如果您使用的 latlng 不在投影中(即屏幕外),我不知道会返回什么,因此您必须对其进行测试

      【讨论】:

        【解决方案3】:

        经过一番挖掘,我设法解决了这个问题,并在 github 上找到了这段代码。
        我现在正在使用这个library,它就像一个魅力。

        我的多边形点以字符串的形式存储在我的数据库中。

        [[3.65E-4,-1.1E-5],[-5.0E-6,3.54E-4],[-3.0E-6,-1.1E-4]]
        

        这是一个示例代码

        protected double[] points;
        
        public void getdata(){
        
            SQLHelper dbhelper = new SQLHelper(ctx);
            dbhelper.getReadableDatabase();
        
            String[] ls =dbhelper.getSingleBlocksPointsArray(block_code)
                        .replaceAll("\\[", "")
                        .replaceAll("\\]","")
                        .split(",");
            points = new double[ls.length];
            for(int i=0;i<ls.length;i++)
            {
        
                points[i] = Double.parseDouble(ls[i]);
            }
        }
        

        在 onCreateView 我使用这个:

        googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                if(contains(new Coordinate(latLng.latitude,latLng.longitude), points)) {
                    Toast.makeText(getActivity(),"True",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(getActivity(),"False",Toast.LENGTH_SHORT).show();
                }
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2012-07-01
          • 2013-08-29
          • 1970-01-01
          • 1970-01-01
          • 2015-02-05
          • 2011-12-03
          • 2012-06-15
          • 1970-01-01
          相关资源
          最近更新 更多