Android 如何检查一个点是否在谷歌地图上的一个或多个圆圈内?

Android 如何检查一个点是否在谷歌地图上的一个或多个圆圈内?,android,google-maps-api-2,Android,Google Maps Api 2,我是android编程新手,正在开发的地图应用程序有问题。该应用程序允许通过单击将圆圈放置在地图上,如果当前位置在圆圈内,则会显示一条消息,如果圆圈外,则会显示另一条消息。问题是在开始检查圆的过程中,它只检测到最后创建的圆的内部或外部,而不是所有可用的圆。我不确定是什么导致了这个问题。代码片段如下所示: // Opening the sharedPreferences object sharedPreferences = getSharedPreferences("locati

我是android编程新手,正在开发的地图应用程序有问题。该应用程序允许通过单击将圆圈放置在地图上,如果当前位置在圆圈内,则会显示一条消息,如果圆圈外,则会显示另一条消息。问题是在开始检查圆的过程中,它只检测到最后创建的圆的内部或外部,而不是所有可用的圆。我不确定是什么导致了这个问题。代码片段如下所示:

     // 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;
    }