【问题标题】:Generate random LatLng given device location and radius生成给定设备位置和半径的随机 LatLng
【发布时间】:2015-11-28 21:38:34
【问题描述】:

我正在尝试在给定位置附近的地图上生成随机点。我有一个circle 形状,它围绕半径为 100 的用户位置,我想在这个圆形区域内生成随机 LatLng 坐标。到目前为止我已经想出了以下功能,但是点标记仍然出现在圆圈范围之外。

    double lat = location.getLatitude();
    double lon = location.getLongitude();

    for (int i = 0; i < markers.size(); i++) {
        Marker mrk = markers.get(i);

            Random random = new Random();


            double radiusInDegrees =mCircle.getRadius();

            double u = random.nextDouble();
            double v = random.nextDouble();
            double w = radiusInDegrees * Math.sqrt(u);
            double t = 2 * Math.PI * v;
            double x = w * Math.cos(t);
            double y = w * Math.sin(t);

            // Adjust the x-coordinate for the shrinking of the east-west distances
            double new_x = x / Math.cos(lat);

            double newLongitude = new_x + lon;
            double newLatitude = y + lat;


            mrk.setPosition(new LatLng(newLatitude,newLongitude));

    }

【问题讨论】:

    标签: android google-maps android-maps-v2


    【解决方案1】:

    借助这个 https://gis.stackexchange.com/a/68275

    我可以制作一个函数,在一定半径内生成随机 LatLng 点,其中半径以米为单位。

    public LatLng getRandomLocation(LatLng point, int radius) {
    
            List<LatLng> randomPoints = new ArrayList<>();
            List<Float> randomDistances = new ArrayList<>();
            Location myLocation = new Location("");
            myLocation.setLatitude(point.latitude);
            myLocation.setLongitude(point.longitude);
    
            //This is to generate 10 random points
            for(int i = 0; i<10; i++) {
                double x0 = point.latitude;
                double y0 = point.longitude;
    
                Random random = new Random();
    
                // Convert radius from meters to degrees
                double radiusInDegrees = radius / 111000f;
    
                double u = random.nextDouble();
                double v = random.nextDouble();
                double w = radiusInDegrees * Math.sqrt(u);
                double t = 2 * Math.PI * v;
                double x = w * Math.cos(t);
                double y = w * Math.sin(t);
    
                // Adjust the x-coordinate for the shrinking of the east-west distances
                double new_x = x / Math.cos(y0);
    
                double foundLatitude = new_x + x0;
                double foundLongitude = y + y0;
                LatLng randomLatLng = new LatLng(foundLatitude, foundLongitude);
                randomPoints.add(randomLatLng);
                Location l1 = new Location("");
                l1.setLatitude(randomLatLng.latitude);
                l1.setLongitude(randomLatLng.longitude);
                randomDistances.add(l1.distanceTo(myLocation));
            }
            //Get nearest point to the centre
            int indexOfNearestPointToCentre = randomDistances.indexOf(Collections.min(randomDistances));
            return randomPoints.get(indexOfNearestPointToCentre);
        }
    

    for 循环的目的只是为了确保获得最近的随机点,因为我已经看到点在我增加半径时超出了圆圈。您可以删除循环。

    【讨论】:

      【解决方案2】:

      这个答案应该会有所帮助。看起来就像您将半径从米转换为度所执行的操作一样。

        // Convert radius from meters to degrees
      double radiusInDegrees = radius / 111000f;
      

      See link here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 2023-04-05
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        相关资源
        最近更新 更多