谷歌地图:iOS 中的自定义 LocationSource

Posted

技术标签:

【中文标题】谷歌地图:iOS 中的自定义 LocationSource【英文标题】:Google Maps: custom LocationSource in iOS 【发布时间】:2015-11-18 19:03:32 【问题描述】:

我已经构建了一个 android 应用程序,它能够使用 Google 地图显示用户的地理位置以及 Wifi、Cells 和 GPS 之外的其他一些信息,例如 QR 码、信标或任何我可以用来表示当前位置的信息(我没有考虑这些位置的实际准确性)。我正在使用LocationSource 并通过setLocationSource 将其传递给Google Maps API。

我必须使用 Google 地图,因为 Apple 地图的可用缩放级别有限,因此我无法放大建筑物。

是否可以提供一个自定义的LocationManager,它会通过某些操作定期更新,并将其注入到 Google Maps API 中,例如LocationSource

我知道有一些黑客可以在地图上放置自定义标记,但这使得无法使用谷歌地图的其他功能,例如通过点击“我的位置”按钮将相机移动到用户位置。

谢谢。

【问题讨论】:

CLLocationManagerLocationSource 不同,它会在用户位置或航向发生变化时更新数据。 【参考方案1】:

有一个解决方案。 Google Maps API 使用 Cocoa 框架类 CLLocationManager。每个想要了解当前 GPS 位置更改的人都必须符合 CLLocationManagerDelegate 并成为 CLLocationManager 对象的委托。更新通过 locationManager:didUpdateLocations: 委托方法。 这是每个人都知道的理论。所以为了模拟位置数据,我们需要找到一种方法来调用这个方法,将我们自己的数据传递给它。 幸运的是,可以通过 class_addMethodclass_replaceMethod 函数动态改变任何类的行为。因此,现在我们可以使用方法 override_abc 更改方法 abc 的实现,该方法可以在如下类别中实现:

let originalSelector = NSSelectorFromString("setDelegate:")
let newSelector = NSSelectorFromString("override_setDelegate:")

let originalMethod = class_getInstanceMethod(CLLocationManager.self, originalSelector)
let newMethod = class_getInstanceMethod(CLLocationManager.self, newSelector)

method_exchangeImplementations(originalMethod, newMethod)

对于我们的案例,我们需要更改位置管理器委托的 setter 并添加我们自己的 setter 作为扩展:

extension CLLocationManager 
    func override_setDelegate(delegate: CLLocationManagerDelegate) 
        // save a reference to self
        GMLocationManager = self
        override_setDelegate(delegate)
    

一旦我们保存了对 Google 地图位置管理器的引用,我们现在可以调用 locationManager:didUpdateLocations: 委托方法,使用额外的扩展方法模拟位置。

extension CLLocationManager 
    func simulateLocation(location: CLLocation) 
        self.delegate?.locationManager?(self, didUpdateLocations: [location])
    

// ...

GMLocationManager?.simulateLocation(fakeLocation)

【讨论】:

【参考方案2】:

最简单的解决方案是您描述的。您禁用地图的“我的位置”标记和“我的位置”按钮,创建自定义位置标记,在地图上添加自定义“我的位置”按钮,这将转到您的自定义标记。 要禁用默认的“我的位置”元素:

mMap.setMyLocationEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);

【讨论】:

【参考方案3】:

在我看来,目前无法将自定义位置从任意位置源注入 ios 上的 Google 地图。不幸的是,我们只能使用 pengrad 所述的自定义位置标记。但是,这意味着一些额外的缺点,例如 myLocation 按钮不起作用或使用当前位置进行导航。所以,我们在寻找的不是集成解决方案。

在 iOS 上,使用 Core Location Framework 并在其上绘制带有当前位置的自定义位图视图仍然是最好的,当搬出建筑物时,切换回通常的谷歌地图。

【讨论】:

以上是关于谷歌地图:iOS 中的自定义 LocationSource的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用程序中使用自己的自定义图像而不是谷歌地图

谷歌地图上的自定义标记

谷歌地图上的自定义标记如下图

谷歌地图上的自定义缩放级别

在颤动的谷歌地图的自定义标记中添加数字? [关闭]

用于文本叠加的自定义标记谷歌地图街景 Xcode