Làm thế nào để tạo random các địa điểm gần vị trí của mình trong bán kính bất kỳ (VD: 1km)

Như tiêu đề ạ. Mình đang học với Google Maps API trong Android, và muốn tạo ngẫu nhiên một vài địa điểm gần với địa điểm của mình trong bán kính 1km đồng thời marker chúng. Mong mọi người giúp đỡ ạ!

Bạn đã có bán kính rồi. Vậy thì random latlng trong khoảng từ latlng giữa màn hình đến vị trí latlng+1km.
Dễ hiểu hơn thì bạn tính xem từ vị trí giữa màn hình + 1km thì tọa độ là bao nhiêu là MAX theo hình vuông nhé. rồi lấy ngẫu nhiên 2 đối số latlng đó là đc.

1 Like

mình làm thế này không biết đúng ý bạn không? Vì vẫn còn dư một đoạn nằm ở góc hình vuông không nằm trong bán kính.

private static LatLng toRadiusLatLng(LatLng center, double radius) {

    Random random = new Random();
    double radiusAngle = Math.toDegrees(radius / RADIUS_OF_EARTH_METERS) /
            Math.cos(Math.toRadians(center.latitude));
    double maxLat = center.latitude +  radiusAngle;
    double minLat = center.latitude -  radiusAngle;
    double maxLon = center.longitude +  radiusAngle;
    double minLon = center.longitude -  radiusAngle;

    double foundLat = random.nextDouble() * (maxLat - minLat) + minLat;
    double foundLon = random.nextDouble()*(maxLon - minLon) + minLon;

    return new LatLng(foundLat, foundLon );
}
1 Like

Bây giờ bạn lấy tọa độ của điểm ở 2 góc của hình vuông. Rồi random latlng trong khoảng đó. là lấy đc mà

1 Like

Bạn chỉ cần random 2 chỉ số là bán kínhgóc. Đổi hệ tọa độ cực này ra latlng là được. Chuyển đổi giữa 2 hệ tọa độ ở đây. Hệ tọa độ Descarter phù hợp cho “hình vuông” hơn, còn hệ tọa độ cực thì phù hợp cho “hình tròn” hơn.

1 Like

OK cảm ơn mọi người. Cũng trong chủ đề Google Map, mình mong moị người giúp đỡ một chút. Ở dưới Map mình có một Recyclerview hiển thị danh sách tất cả vị trí được Marker trên màn hình. Mình muốn tạo sự kiện sao cho khi ấn giữ một item của Recyclerview thì marker tương ứng vị trí đó trên Map đổi màu, cho đến khi thả tay ra thì marker trở lại màu mặc định ban đầu. Trường hợp này thì làm như thế nào ạ?

Tạo sự kiện Longclick

map.setOnMapLongClickListener(new OnMapLongClickListener() {
        @Override
        public void onMapLongClick(LatLng latLng) {
            for(Marker marker : yourMarkerList) {
                if(Math.abs(marker.getPosition().latitude - latLng.latitude) < 0.05 && Math.abs(marker.getPosition().longitude - latLng.longitude) < 0.05) {
                    Toast.makeText(MapActivity.this, "got clicked", Toast.LENGTH_SHORT).show(); //do some stuff
                    break;
                }
            }

        }
    });
1 Like

Mình set sự kiện cho item của listview mà bạn

Mình cũng dùng onLongClick cho recyclerview và bắt được đúng Marker của nó, nhưng mà vẫn loay hoay mãi không thể xử lý được việc khi nhấn giữ xong và bỏ tay ra thì marker nó trở lại như khi không thực hiện long click

   public void onLongClick(View view, int position) {
            for (Marker marker1 : radiusMarkers) {
                if(marker1.getPosition().latitude == latLngList.get(position).latitude
                        && marker1.getPosition().longitude == latLngList.get(position).longitude) {
                    marker1.setIcon(BitmapDescriptorFactory.defaultMarker(
                            BitmapDescriptorFactory.HUE_ROSE));
                    break;
                }
            }
        }
    }));
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?