2014-10-27 181 views
0

我创建一个使用谷歌地图android api的安卓应用程序。
这个程序需要有一个点击多边形功能,但因为它不适用于谷歌地图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); 

如果一些有其他的解决方案或建议将是有益的。
谢谢

回答

0

我在设法解决这个问题后,发现了一些东西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(); 
     } 
    } 
}); 
0

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

最后,我将所有多边形保存在一个列表中,并通过点击位置遍历它。 (但要小心;也许你在这个位置上有多个多边形)

+1

感谢我设法解决它 – Gilbert92 2014-10-27 15:56:57

0

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

你需要采取每一个经纬度信息,并将其通过获取地图投影

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

,那么你可以把到这点您的图书馆像你需要循环时转换成屏幕上的点。然而,我不知道如果您使用的latlng不在投影中(即屏幕外),将会返回什么,因此您将不得不测试那个

+0

感谢我设法解决这个问题 – Gilbert92 2014-10-27 15:57:42