私の推測では、「近い」は画面の下部にあるビューの隅であり、「遠い」は画面の上部にある隅です。これは、ビューを傾けた場合、下隅がカメラに最も近く、上隅がカメラから最も遠いためです。
これを に変換する 1 つの方法CLRegion
は、カメラのターゲットを中心として使用し、最大距離から 4 つのコーナーまでの半径を計算することです。これは、領域上で最もぴったりと合う円ではないかもしれませんが、いずれにしても円はビューの四角形に収まらないため、十分に近い可能性があります。
CLLocationCoordinate
2 つの値の間のメートル単位の距離を計算するヘルパー関数を次に示します。
double getDistanceMetresBetweenLocationCoordinates(
CLLocationCoordinate2D coord1,
CLLocationCoordinate2D coord2)
{
CLLocation* location1 =
[[CLLocation alloc]
initWithLatitude: coord1.latitude
longitude: coord1.longitude];
CLLocation* location2 =
[[CLLocation alloc]
initWithLatitude: coord2.latitude
longitude: coord2.longitude];
return [location1 distanceFromLocation: location2];
}
次に、は次のCLRegion
ように計算できます。
GMSMapView* mapView = ...;
...
CLLocationCoordinate2D centre = mapView.camera.target;
GMSVisibleRegion* visibleRegion = mapView.projection.visibleRegion;
double nearLeftDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.nearLeft);
double nearRightDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.nearRight);
double farLeftDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.farLeft);
double farRightDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.farRight);
double radiusMetres =
MAX(nearLeftDistanceMetres,
MAX(nearRightDistanceMetres,
MAX(farLeftDistanceMetres, farRightDistanceMetres)));
CLRegion region = [[CLRegion alloc]
initCircularRegionWithCenter: centre radius: radius identifier: @"id"];
アップデート:
の更新に関してMKCoordinateRegion
、サンプル コードが機能しない可能性があります。マップが 90 度回転している場合、farLeft
とnearLeft
は同じ緯度になりfarRight
、farLeft
と は同じ経度になるため、緯度と経度のデルタはゼロになります。
、farLeft
、farRight
、の 4 つすべてをループし、それぞれの緯度と経度の最小値と最大値を計算し、そこからデルタを計算する必要があります。nearLeft
nearRight
Google Maps SDK for iOS にはヘルパー クラスが含まれており、このクラスの一部が既に実行されています - GMSCoordinateBounds
. で初期化できますGMSVisibleRegion
:
GMSMapView* mapView = ...;
....
GMSVisibleRegion visibleRegion = mapView.projection.visibleRegion;
GMSCoordinateBounds bounds =
[[GMSCoordinateBounds alloc] initWithRegion: visibleRegion];
GMSCoordinateBounds
then には、境界を定義する プロパティnorthEast
とプロパティがあります。southWest
したがって、次のようにデルタを計算できます。
CLLocationDegrees latitudeDelta =
bounds.northEast.latitude - bounds.southWest.latitude;
CLLocationDegrees longitudeDelta =
bounds.northEast.longitude - bounds.southWest.longitude;
境界から中心を計算することもできるため、MKCoordinateRegion
次のようになります。
CLLocationCoordinate2D centre = CLLocationCoordinate2DMake(
(bounds.southWest.latitude + bounds.northEast.latitude) / 2,
(bounds.southWest.longitude + bounds.northEast.longitude) / 2);
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
return MKCoordinateRegionMake(centre, span);