30/09/2018, 22:28

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) - Google Map API Android

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 đỡ ạ!

Dương Nguyễn Văn viết 00:36 ngày 01/10/2018

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.

Lê Thị Huyền Trang viết 00:34 ngày 01/10/2018

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 );
}
Dương Nguyễn Văn viết 00:39 ngày 01/10/2018

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à

Minh Hoàng viết 00:32 ngày 01/10/2018

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.

vi.wikipedia.org

Hệ tọa độ cực

Trong toán học, hệ tọa độ cực là một hệ tọa độ hai chiều trong đó mỗi điểm M bất kỳ trên một mặt phẳng được biểu diễn bằng 2 thành phần: Hệ tọa độ cực hữu ích trong những trường hợp trong đó quan hệ giữa hai điểm dễ được viết dưới dạng góc và khoảng cách. Trong các hệ tọa độ thông thường như hệ tọa độ Descartes, quan hệ này chỉ có thể được biểu diễn dưới dạng công thức lượng giác. Khái niệm góc và bán kính đã được người xưa sử dụng từ thế kỷ thứ nhất trước Công nguyên. Nhà thiên văn học Hipparc...

Lê Thị Huyền Trang viết 00:37 ngày 01/10/2018

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 ạ?

Minh Hoàng viết 00:29 ngày 01/10/2018

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

        }
    });
Lê Thị Huyền Trang viết 00:29 ngày 01/10/2018

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

Lê Thị Huyền Trang viết 00:43 ngày 01/10/2018

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;
                }
            }
        }
    }));
Bài liên quan
0