- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 GoogleMaps SDK,目前我正在尝试将 GMSVisibleRegion 转换为 CLRegion。
GMSVisibleRegion 定义为:
typedef struct {
CLLocationCoordinate2D nearLeft;
CLLocationCoordinate2D nearRight;
CLLocationCoordinate2D farLeft;
CLLocationCoordinate2D farRight;
} GMSVisibleRegion;
最快的方法是什么?
不幸的是,很难理解开发人员使用“近”和“远”命名的含义。我认为这条评论也很有用:
/**
* Returns the region (four location coordinates) that is visible according to
* the projection.
*
* The visible region can be non-rectangular. The result is undefined if the
* projection includes points that do not map to anywhere on the map (e.g.,
* camera sees outer space).
*/
- (GMSVisibleRegion)visibleRegion;
非常感谢!
编辑:好的,我的第一步是创建 GMSVisibleRegion 的 MKCoordinateRegion。
我建议使用以下代码将 GMSVisibleRegion 转换为 MKCoordinateRegion。任何异议。
+ (MKCoordinateRegion)regionForCenter:(CLLocationCoordinate2D)center andGMSVisibleRegion:(GMSVisibleRegion)visibleRegion
{
CLLocationDegrees latitudeDelta = visibleRegion.farLeft.latitude - visibleRegion.nearLeft.latitude;
CLLocationDegrees longitudeDelta = visibleRegion.farRight.longitude - visibleRegion.farLeft.longitude;
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
return MKCoordinateRegionMake(center, span);
}
最佳答案
我的猜测是“近”是指屏幕底部 View 的角,而“远”是指屏幕顶部的角。这是因为如果您倾斜 View ,则底角离相机最近,而顶角离相机最远。
将其变成CLRegion
的一种方法可能是使用相机的目标作为中心,然后计算从最大距离到四个角的半径。这可能不是该区域上最紧密的拟合圆,但由于圆无论如何都无法拟合 View 的四边形,因此它可能足够接近。
下面是一个辅助函数,用于计算两个 CLLocationCoordinate
值之间的距离(以米为单位):
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
的更新,您的示例代码可能无法正常工作。如果 map 旋转了 90 度,则 farLeft
和 nearLeft
将具有相同的纬度,而 farRight
和 farLeft
将具有相同的经度,因此您的纬度和经度增量将为零。
您需要遍历所有四个 farLeft
、farRight
、nearLeft
、nearRight
,计算每个纬度和经度的最小值和最大值,然后从中计算增量。
适用于 iOS 的 Google Maps SDK 包含一个帮助程序类,它已经为您做了一些这样的事情 - GMSCoordinateBounds
。它可以用 GMSVisibleRegion
初始化:
GMSMapView* mapView = ...;
....
GMSVisibleRegion visibleRegion = mapView.projection.visibleRegion;
GMSCoordinateBounds bounds =
[[GMSCoordinateBounds alloc] initWithRegion: visibleRegion];
GMSCoordinateBounds
然后具有定义边界的 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);
关于ios - 将 GMSVisibleRegion 转换为 CLRegion 或 MKCoordinateRegion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15208181/
我将此代码用于iPhone iOS 5.0设备。一切都很好: self.mapView = [[[MKMapView alloc]init] autorelease]; mapView.delegat
如何创建 MKCoordinateRegion 。 NSString *latitudeString = [locationString substringToIndex:startRang
我正在缩放 MKMapView 以适应图钉集合的边界区域,但是当显示图钉时,我注意到理想情况下缩放可以更紧一些。我提出的解决方案是使区域增量稍微小一些: // SMALL ZOOM region.sp
我有一个坐标区域,我已确定该区域包含我想为我的应用程序显示的内容的限制。我已将其设置为具有中心点纬度、经度和跨度的 MKCoordinateRegion。如何确定当前 userLocation 是否在
所以我有以下功能来为我的应用程序设置我的 map 区域: func mapRegion() -> MKCoordinateRegion { databaseHandle = databaseR
背景:我正在构建一系列大量使用 map 的基于位置的应用程序。这些 map 用从服务器获取的位置进行注释,我将需要数据的 map 区域传递给这些 map (定义为纬度/经度和纬度/长三角,很像 MKC
MKCoordinateRegion 的跨度是表示中心到每个边界的距离还是边界到边界的距离? 如果我想计算区域的边界,我从中心添加/减去跨度,还是需要/2? lowerLatitude=center-
(根据评论修改问题:) 好的,我会尝试以其他方式询问......我怎样才能得到这个圆覆盖的边界坐标: (原题:) 我的 iPhone 应用程序出现奇怪的问题。我有 MKCoordinateRegion
是否可以在@App Storage 中保存 MKCoordinateRegion 值? 我试过这个。但它不起作用。我收到错误“调用初始化程序时没有完全匹配”。 @AppStorage("reg
我正在使用以下代码缩小 map MKMapView 。 float zoom=1.5; MKCoordinateRegion region; //Set Zoom level using Span M
当使用 MKCoordinateRegionMakeWithDistance 为 MKMapView 设置区域时,生成的区域总是给出错误的结果,其中的尺寸总是比我为其他手机型号获得的最佳尺寸略大。 例
我在 map 上显示了一些注释(某些点) map 会放大或缩小以适合所有点 - 请参阅下面的工作代码。 MKPolygon *poly = [MKPolygon polygonWithPoints:s
我正在尝试合并两个 MKCoordinateRegion。有人知道如何执行此操作吗? 最佳答案 有一个 MKMapRectUnion 函数接受两个 MKMapRects 所以你可以先将每个 MKCoo
我的应用程序中有一个方形 MKMapView,我希望设置一个中心点和以米为单位的 View 的确切高度/宽度。 创建一个 MKCoordinateRegion 并将 map 设置到它(如在此代码中..
我有一个 CLLocation 点(纬度/经度),我想知道它是否在确定的 MKCoordinateRegion 中。我想知道哪个区域是以前制作的 CLLocation 点。 谢谢。 我找到了解决方案。
我注意到,如果我使用 MKMapView 的 selectAnnotation:animated:,如果 MKAnnotation 未显示在我的 map 显示的当前 MKCoordinateRegio
它们都指定了 map 中心和方框的大小。 那么为什么要同时使用两者呢? MKMapview 中的一些函数使用一个,一些使用另一个 (MKCoordinateRegion)regionThatFits:
我正在使用 GoogleMaps SDK,目前我正在尝试将 GMSVisibleRegion 转换为 CLRegion。 GMSVisibleRegion 定义为: typedef struct {
我需要检查用户位置是否属于 MKCoordinateRegion。我很惊讶没有为此找到简单的函数,类似于:CGRectContainsCGPoint(rect, point)。 我找到了以下代码: C
我有一个纬度和经度坐标,我想将其作为 map 的焦点。它们存储为 NSStrings 并转换为以下位置: NSString *placeLatitude = [elementCoords object
我是一名优秀的程序员,十分优秀!