Gooogle Maps API v2를 사용하는 Android 애플리케이션에서 작업하고 있습니다. 내지도에 마커가 있으며 그 중 하나를 선택하고 싶습니다. Circle and Circle Options 클래스를 사용하여 쉽게 관리 할 수있었습니다. 그러나 마커처럼 확대 또는 축소 할 때도 화면에 동일한 크기를 유지하도록 내 서클을 원합니다. 원이 픽셀 단위로 일정한 반경을 가져야 함을 의미합니다. 안타깝게도 API v2에서는 반경을 픽셀 단위로 설정할 수 없습니다.Google지도 API v2에서 일정 크기의 원을 화면에 그립니다.
몇 가지 해결책을 시도했지만 만족스럽지 않습니다. 첫 번째에서
, 난 그냥 곱 또는 반경을 분할 : 처음 일 듯@Override
public void onCameraChange(CameraPosition position)
{
if(previousZoom > position.zoom) {
mSelectionCircle.setRadius(Math.abs(position.zoom - previousZoom)*2*mSelectionCircle.getRadius());
}
else if(previousZoom < position.zoom) {
mSelectionCircle.setRadius(Math.abs(position.zoom - previousZoom)*mSelectionCircle.getRadius()/2);
}
previousZoom = position.zoom;
}
,하지만 빠르게 확대 또는 손가락으로 확대 할 때 잘못된 결과를 얻을 수 있습니다. 또한, 화면에 스케일링이 선명하게 표시됩니다.
두 번째 해결책은 픽셀 - 미터 변환을 사용합니다. 이 아이디어는 확대/축소 할 때 반지름을 미터 단위로 다시 계산하기 때문에 화면의 원 크기가 일정합니다.
Point p2 = new Point(p1.x + radiusInPixels, p1.y);
int radiusInPixels = 40;
:
Point p1 = mMap.getProjection().toScreenLocation(mSelectionCircle.getCenter());
그런 다음 내가 원의 가장자리에 또 다른 지점을 만들 :이를 위해, 나는 화면에 원형의 현재 위치를 얻을 수
그 후,이 두 점 사이의 거리를 미터로 반환하는 함수를 사용합니다.
private double convertPixelsToMeters(Point point1, Point point2) {
double angle = Math.acos(Math.sin(point1.x) * Math.sin(point2.x)
+ Math.cos(point1.x) * Math.cos(point2.x) * Math.cos(point1.y- point2.y));
return angle * Math.PI * 6378100.0; // distance in meters
}
6378100은 평균 지구 반지름이다. 마지막으로, 나는 원의 새로운 반경 설정 : (! 10^7m)
mSelectionCircle.setRadius(convertPixelsToMeters(p1, p2));
그것은 이론적으로 작동해야하지만 말도 반경 값을 얻을 수 있습니다. 변환 함수가 잘못되었을 수 있습니까?
이렇게하는 것이 더 간단한 방법일까요, 그렇지 않다면 제 2의 soluton이 작동하지 않는 이유를 이해하도록 도와 주시겠습니까?
감사합니다.
아마도 Maps Circle을 사용하지 않고 대신 캔버스를 그리는 것이 더 편리할까요? – FWeigl