谷歌地图Android点在多边形
我正在创建一个使用谷歌地图android api的android应用程序。 该应用程序需要有点击多边形功能,但由于谷歌地图android api v2上没有该功能。我做了一些研究,找到了一个解决这个功能的方法。 我最后做的是检查一个点是否在多边形方法中。 我在用这个。如果您手动创建边界,它工作得非常好。 If可以在循环中创建边界来解决我的问题。 我从数据库中获取多边形点 以下是我的MapFragment代码:谷歌地图Android点在多边形,android,google-maps,polygon,Android,Google Maps,Polygon,我正在创建一个使用谷歌地图android api的android应用程序。 该应用程序需要有点击多边形功能,但由于谷歌地图android api v2上没有该功能。我做了一些研究,找到了一个解决这个功能的方法。 我最后做的是检查一个点是否在多边形方法中。 我在用这个。如果您手动创建边界,它工作得非常好。 If可以在循环中创建边界来解决我的问题。 我从数据库中获取多边形点 以下是我的MapFragment代码: public class MapBlocksMapView extends Fragm
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();
}
}
如果有些人有其他的解决方案或建议会有所帮助。
谢谢我也有同样的问题,但我还没有找到解决这个问题的好办法
最后,我将所有多边形保存在一个列表中,并使用单击位置对其进行迭代。但是要小心;也许你在这个位置有不止一个多边形,这个库不会有多大帮助,因为你有地理位置,库需要屏幕位置,所以大部分工作都是你自己做的 您需要获取每个latlng并通过获取地图投影将其转换为屏幕点
Point point = googleMap.getProjection().toScreenLocation(myLatLngPoint);
然后,您可以在循环时按需要将该点放入库中。但是,我不知道如果您正在使用的latlng不在投影中(即屏幕外),将返回什么,因此您必须测试我在github上挖掘并找到此代码后设法解决了此问题。 我现在用这个,效果很好 我的多边形点以字符串的形式存储在数据库中
[[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]);
}
}
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]);
}
}
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();
}
}
});