2014-10-27 169 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