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 đỡ ạ!
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)
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.
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 );
}
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à
Bạn chỉ cần random 2 chỉ số là bán kính và gó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.
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;
}
}
}
});
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;
}
}
}
}));