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

问题描述 投票:2回答:4

我是不熟悉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();

        }

    }
}
android google-maps-api-2
4个回答
0
投票

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始终是最后一个创建的圆。您需要保留在地图上绘制的所有圆的列表;

查看如何检查点是否在对象内,我将检出此链接,因为当我需要这样做时,它对我非常有用

How can I determine whether a 2D Point is within a Polygon?


0
投票

我使用的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


0
投票

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 ();


0
投票

[示例]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() ;

© www.soinside.com 2019 - 2024. All rights reserved.