Android 如何检查一个点是否在谷歌地图上的一个或多个圆圈内?
我是android编程新手,正在开发的地图应用程序有问题。该应用程序允许通过单击将圆圈放置在地图上,如果当前位置在圆圈内,则会显示一条消息,如果圆圈外,则会显示另一条消息。问题是在开始检查圆的过程中,它只检测到最后创建的圆的内部或外部,而不是所有可用的圆。我不确定是什么导致了这个问题。代码片段如下所示:Android 如何检查一个点是否在谷歌地图上的一个或多个圆圈内?,android,google-maps-api-2,Android,Google Maps Api 2,我是android编程新手,正在开发的地图应用程序有问题。该应用程序允许通过单击将圆圈放置在地图上,如果当前位置在圆圈内,则会显示一条消息,如果圆圈外,则会显示另一条消息。问题是在开始检查圆的过程中,它只检测到最后创建的圆的内部或外部,而不是所有可用的圆。我不确定是什么导致了这个问题。代码片段如下所示: // Opening the sharedPreferences object sharedPreferences = getSharedPreferences("locati
// Opening the sharedPreferences object
sharedPreferences = getSharedPreferences("location", 0);
// Getting number of locations already stored
locationCount = sharedPreferences.getInt("locationCount", 0);
// Getting stored zoom level if exists else return 0
//String zoom = sharedPreferences.getString("zoom", "0");
// If locations are already saved
if(locationCount!=0){
String lat = "";
String lng = "";
// Iterating through all the locations stored
for(int i=0;i<locationCount;i++){
// Getting the latitude of the i-th location
lat = sharedPreferences.getString("lat"+i,"0");
// Getting the longitude of the i-th location
lng = sharedPreferences.getString("lng"+i,"0");
double latitude = Double.parseDouble(lat);
double longitude = Double.parseDouble(lng);
startCircle = googleMap.addCircle(new CircleOptions().center(new LatLng (latitude, longitude)).radius(CIRCLE_RADIUS).fillColor(0x55888888));
}
}
public void onStart(){
super.onStart();
//Create a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Set accuracy of criteria to address level
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//Get the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
//Get Current Location
Location myLocation = locationManager.getLastKnownLocation(provider);
double lat = myLocation.getLatitude();
double lon = myLocation.getLongitude();
LatLng latlng = new LatLng(lat,lon);
if(startCircle == null){
return;
}
else{
float[] distance = new float[2];
marker = googleMap.addMarker(new MarkerOptions().position(latlng).visible(false));
myLocation.distanceBetween( marker.getPosition().latitude, marker.getPosition().longitude,
startCircle.getCenter().latitude, startCircle.getCenter().longitude, distance);
if( distance[0] < startCircle.getRadius()){
Toast.makeText(getBaseContext(), "Inside", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getBaseContext(), "Outside", Toast.LENGTH_LONG).show();
}
}
}
//打开SharedReferences对象
SharedReferences=GetSharedReferences(“位置”,0);
//正在获取已存储的位置数
locationCount=SharedReferences.getInt(“locationCount”,0);
//获取存储的缩放级别(如果存在),否则返回0
//字符串缩放=SharedReferences.getString(“缩放”,“0”);
//如果已保存位置
如果(位置计数!=0){
字符串lat=“”;
字符串lng=“”;
//遍历存储的所有位置
对于(inti=0;i,我在Javascript中使用:
google.maps.geometry.poly.containsLocation(pos, selectedPolygon);
此方法可在谷歌地图API 3中找到(听起来好像不行)
但是试着写一些基于圆面积的数学函数
非常简单。计算两个坐标之间的距离:
public static float distFrom2LocationsInMeter() {
double lat1 = ...;
double lng1 = ...;
double lat2 = ...;
double lng2 =...;
//lat1 /= 1000000; // sometimes Android returns location in 10^6 form
//lng1 /= 1000000;
//lat2 /= 1000000;
// lng2 /= 1000000;
double earthRadius = 3958.75;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
int meterConversion = 1609;
return Float.valueOf((float)(dist * meterConversion ));
}
检查半径后:
如果R>distFrom2LocationsInMeter()//您在里面
如果R
问题是在开始检查圆的过程中,它只检测到最后创建的圆的内部或外部,而不是所有可用的圆。我不确定是什么导致了此问题。
问题是,当你创建一个圆时,你正在覆盖上一个创建的圆,因此startCircle
始终是最后一个创建的圆
要查看如何检查一个点是否在一个对象内,我会检查这个链接,因为当我需要这样做时,它对我非常有用
Toast.makeText(MapActivity.this,String.valueOf(isInside(latitude\u location\u place,经度\u location\u place,0.002,map.getMyLocation().getLatitude(),map.getMyLocation().GetLength()),Toast.LENGTH\u SHORT.show()
公共布尔isInside(双圆x,双圆y,
双弧度,双x,双y){
map.addCircle(新的CircleOptions()
.中心(新车床(圆x,圆y))
.半径(200)
//大约20米
//对于20米,您最多设置rad=0.002
.strokeColor(颜色.红色)
.fillColor(R.color.color_圈));
map.addMarker(新的MarkerOptions().position(新的LatLng(x,y)));
if((x-圆x)*(x-圆x)+
(y-圆y)*(y-圆y)示例:
Toast.makeText(MapActivity.this,String.valueOf(isInside(latitude_location_place, longitude_location_place,0.002,map.getMyLocation().getLatitude(),map.getMyLocation().getLongitude())) , Toast.LENGTH_SHORT).show();
public boolean isInside(double circle_x, double circle_y,
double rad, double x, double y) {
map.addCircle(new CircleOptions()
.center(new LatLng(circle_x, circle_y))
.radius(200)
//its about 20 meter
// you most set rad=0.002 for 20 meter
.strokeColor(Color.RED)
.fillColor(R.color.color_circle));
map.addMarker(new MarkerOptions().position(new LatLng(x, y)));
if ((x - circle_x) * (x - circle_x) +
(y - circle_y) * (y - circle_y) <= rad*rad)
return true;
else
return false;
}
Toast.makeText(MapActivity.this,String.valueOf(isInside(latitude\u location\u place,longitude\u location\u place,0.002,map.getMyLocation().getLatitude(),map.getMyLocation().getLongitude()),Toast.LENGTH\u SHORT.show();
公共布尔isInside(双圆x,双圆y,
双弧度,双x,双y){
map.addCircle(新的CircleOptions()
.中心(新车床(圆x,圆y))
.半径(200)
//大约20米
//对于20米,您最多设置rad=0.002
.strokeColor(颜色.红色)
.fillColor(R.color.color_圈));
map.addMarker(新的MarkerOptions().position(新的LatLng(x,y)));
if((x-圆x)*(x-圆x)+
(y-圈y)*(y-圈y)不幸的是,这在AndroidEP中是不可用的,这是我在我的帖子中说的。因为圈不是问题,玩一下数学;)虽然此代码可能提供问题的解决方案,但最好添加有关其工作原因/方式的上下文。这可以帮助未来用户学习,并将这些知识应用到他们自己的代码中。在解释代码时,用户也可能会以赞成票的形式给予积极反馈。
Toast.makeText(MapActivity.this,String.valueOf(isInside(latitude_location_place, longitude_location_place,0.002,map.getMyLocation().getLatitude(),map.getMyLocation().getLongitude())) , Toast.LENGTH_SHORT).show();
public boolean isInside(double circle_x, double circle_y,
double rad, double x, double y) {
map.addCircle(new CircleOptions()
.center(new LatLng(circle_x, circle_y))
.radius(200)
//its about 20 meter
// you most set rad=0.002 for 20 meter
.strokeColor(Color.RED)
.fillColor(R.color.color_circle));
map.addMarker(new MarkerOptions().position(new LatLng(x, y)));
if ((x - circle_x) * (x - circle_x) +
(y - circle_y) * (y - circle_y) <= rad*rad)
return true;
else
return false;
}