我是不熟悉android编程的人,我正在使用的地图应用程序有问题。该应用程序允许通过单击将圆放置在地图上,如果当前位置在圆内,则显示一条消息,如果在圆外,则显示另一条消息。问题是在对圆进行onStart检查时,它仅检测到最后创建的圆的内部或外部,而不是所有可用的圆。我不确定是什么引起了这个问题。代码段如下:
// 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();
}
}
}
The problem is during the onStart check of the circles it only detects inside or outside of the last created circle instead of all available ones. I am not sure what is causing this problem.
问题是,当您创建一个圆时,您将覆盖最后一个创建的圆,因此startCircle
始终是最后一个创建的圆。您需要保留在地图上绘制的所有圆的列表;
查看如何检查点是否在对象内,我将检出此链接,因为当我需要这样做时,它对我非常有用
我使用的Java语言:
google.maps.geometry.poly.containsLocation(pos, selectedPolygon);
此方法在google-maps 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
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 ();
[示例]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() ;