从 web api 加载谷歌地图所需的标记,并在相机移动时动态加载其他标记

Posted

技术标签:

【中文标题】从 web api 加载谷歌地图所需的标记,并在相机移动时动态加载其他标记【英文标题】:Load needed markers for google map from web api and load others dynamically as camera move 【发布时间】:2018-07-13 16:08:53 【问题描述】:

在我的 android 应用程序中,我想在谷歌地图上动态显示标记。我有很多可以通过我的网络 api 获得的标记位置数据,并且需要根据用户需要查看的内容来加载它们(例如,只需获取属于地图该部分的标记,并在相机以异步模式移动时加载其他标记)。

我进行了很多搜索,但找不到任何直接的解决方案,我的问题是执行此类功能的最佳实践和解决方案是什么?有没有为此提供的指南?

P.S:我使用集群管理器在 android google map 中加载所有标记没有任何问题,但是当标记数量变大时,获取所有标记需要太多时间。

【问题讨论】:

要么更新您的 webapi 以支持空间查询(在相机移动时使用屏幕的 latlngbounds),要么使用 firebase/geofire,然后为每个标记保存键/webapi url,并再次使用屏幕的 latlngbounds 进行更新geofire 查询。 @Andy 感谢您的评论,我更新了我的 api 以获取屏幕位置内的位置... 【参考方案1】:

您可以使用 Google 地图聚类 获取更多标记数据。它将为您提供有效的 Google 地图 体验。通过对标记进行聚类,您可以在地图上放置大量标记,而不会使地图难以阅读。

这里是官方文档,你可以关注here

示例代码。

// Declare a variable for the cluster manager.
private ClusterManager<MyItem> mClusterManager;

private void setUpClusterer() 
    // Position the map.
    getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10));

    // Initialize the manager with the context and the map.
    // (Activity extends context, so we can pass 'this' in the constructor.)
    mClusterManager = new ClusterManager<MyItem>(this, getMap());

    // Point the map's listeners at the listeners implemented by the cluster
    // manager.
    getMap().setOnCameraIdleListener(mClusterManager);
    getMap().setOnMarkerClickListener(mClusterManager);

    // Add cluster items (markers) to the cluster manager.
    addItems();


private void addItems() 

    // Set some lat/lng coordinates to start with.
    double lat = 51.5145160;
    double lng = -0.1270060;

    // Add ten cluster items in close proximity, for purposes of this example.
    for (int i = 0; i < 10; i++) 
        double offset = i / 60d;
        lat = lat + offset;
        lng = lng + offset;
        MyItem offsetItem = new MyItem(lat, lng);
        mClusterManager.addItem(offsetItem);
    

通过使用此示例代码,您需要将 api 数据配置为根据您的要求进行聚类并在地图上显示标记。

显然,由于大量标记数据,加载到集群管理器需要时间,并且还取决于您连接的网络。

【讨论】:

感谢您的回答,但我无法理解这对从 web api 加载数据有何帮助?例如我有 100000 个位置数据,我应该先加载所有这些数据吗?我认为它效率不高,而且连接速度慢。 OnCameraIdleListener 是处理api调用的关键...谢谢

以上是关于从 web api 加载谷歌地图所需的标记,并在相机移动时动态加载其他标记的主要内容,如果未能解决你的问题,请参考以下文章

想用java 做一个平台,能够调用百度或谷歌地图并在地图上显示定位位置和轨迹回放,涉及java 的那些知识

以 45 度角查看的 Web 地图 api

刷新/重新加载地图:谷歌地图 API V2

如何在谷歌地图上放置图标标记,图标数量是不是有配额?

在谷歌地图上加载 100-200K 标记

从 Xcode 9 构建中缺少所需的图标文件