将相机移动到 googlemap 上的热图显示

Move camera to heat map display on the googlemap

我正在制作 google 地图以显示热图

我可以显示热图,但我需要移动地图才能看到我的热图。所以现在我正在使用 LatLngBounds 在地图上移动相机。但是我得到一个白色的网格屏幕,因为地图没有加载。

我正在从文本文件中获取 LatLong,它有超过 5000 个点。

这是我的努力

使用 WeightedLatLng

添加热图
//Method for adding Heat Map overlay to existing map with heat map points from RoamIO
   
public void addHeatMap(final List<WeightedLatLng> list) {
    mProvider = new HeatmapTileProvider.Builder()
            .weightedData(list)
            .build();
    storageAccess.logMessage("Adding heat map");
    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            mOverlay = mGoogleMap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider));

            zoom2HeatMap(list);
        }
    });
}

这是我的 zoom2HeatMap 方法

    public void zoom2HeatMap(List<WeightedLatLng> list){

    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    LatLngBounds bounds = builder.build();
    int padding = 20; // offset from edges of the map in pixels
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);

    mGoogleMap.animateCamera(cu, 2000, new GoogleMap.CancelableCallback() {
        @Override
        public void onFinish() {
            //Here you can take the snapshot or whatever you want
            roamIO.setVisible(true);
        }

        @Override
        public void onCancel() {

        }
    });
}

如果您有任何问题,请随时提出。

非常感谢任何帮助

谢谢

有几种方法可以从 List<WeightedLatLng> list 访问 LatLng。 (这可以被视为 class 的一个缺点,它没有简单地保存原始 LatLng。)

如果有人感兴趣我可以展开。无论如何,如果您能 post 如何创建 WeightedLatLng 列表,那将会很有帮助,因为这将有助于第一个选项。

维护一个单独的列表

在创建您的 List<WeightedLatLng> list 时,还要创建一个 List<LatLng> latlngList,然后您可以将其用于 LatLngBounds.Builder。这两个列表将具有相同的结构 - 相同的长度等 - 并且有几种方法可以做到这一点。

扩展 WeightedLatLng

它似乎不是最终的 class,因此您可以扩展 WeightedLatLng 并覆盖构造函数以将提供的 LatLng 保存为字段,然后调用超级 class 构造函数。在这里,您只是将该 LatLng 添加到您的扩展版本的 WeightedLatLng(他们可能首先应该这样做)。

使用 SphericalMercatorProjection

在同一个 android-maps-utils 中使用 class 将您的 x/y 点(来自 WeightLatLng)转换回 LatLng。您可以查看 WeightLatLng 的 source,看看他们使用 SphericalMercatorProjection,然后执行相反的操作(使用 toLatLng 方法)。由于它的 SphericalMercatorProjection 实例是私有的,因此您必须使用 WorldWidth 常量创建自己的实例(如源代码中所做的那样)。这似乎还不错,所以我可能会走这条路。但是,我不能保证它与您可能需要的精度对称。 (即 A => B => A',其中 A ~= A' - 我可能 运行 一些测试。)

如其他答案中所述,SphericalMercatorProjection 可用于将 com.google.maps.android.heatmaps.WeightedLatLng 点转换回 LatLng。 WeightedLatLng 实现使用此 class 的实例将提供的 LatLng 转换为热图统计中使用的 x/y 点,但不公开其实例。因此,需要使用相同的“世界宽度”参数 1 的新实例。(worldWidth 参数会影响 x/y 坐标系的缩放比例,如果使用两个不同的世界宽度,则会对逆坐标系产生不利影响。)

在我实现旧金山周围犯罪数据的热图时,我简单地从 WeightedLatLnt.getPoint() 中添加了 toLatLng 的使用,发现逆运算几乎是一致的,至少对于球体的那部分:

// Create an instance of the projection class using the same "world width" value used as the WeightedLatLng implementation.
SphericalMercatorProjection smp = new SphericalMercatorProjection(1);  // Size of the world (arbitrary).

// Method which gets a list of WeightedLatLngs and uses a parallel list of LatLngs -
// and for this snippet also logs the conversion of the WeightedLatLng back to LatLng using the toLatLng of projection class.
public void addWeightedDots() {
    List<WeightedLatLng> dots = new CrimeData().getWeightedPositions();
    List<LatLng> positions = new CrimeData().getPositions();
    for (int i = 0; i < dots.size(); i++) {
        Log.i(TAG,"pos="+positions.get(i)+" wLL="+dots.get(i).getPoint()+" toLatLng="+smp.toLatLng(dots.get(i).getPoint()));
    }
    // ... more irrelevant code....
}

和一些示例输出:

pos=lat/lng: (38.48538062,-121.5374388) wLL=Point{x=0.16239600333333332, y=0.38401196188724207} toLatLng=lat/lng: (38.48538062,-121.5374388)
pos=lat/lng: (38.55462435,-121.458819) wLL=Point{x=0.16261439166666664, y=0.3837661209021186} toLatLng=lat/lng: (38.55462434999998,-121.458819)
pos=lat/lng: (38.61474191,-121.4461725) wLL=Point{x=0.16264952083333334, y=0.3835524891142911} toLatLng=lat/lng: (38.61474191,-121.4461725)
pos=lat/lng: (38.54221766,-121.4374105) wLL=Point{x=0.1626738597222222, y=0.38381018666163447} toLatLng=lat/lng: (38.54221766,-121.43741050000001)
pos=lat/lng: (38.61295423,-121.5005071) wLL=Point{x=0.1624985913888889, y=0.38355884433643966} toLatLng=lat/lng: (38.61295422999999,-121.5005071)
pos=lat/lng: (38.60307405,-121.420291) wLL=Point{x=0.1627214138888889, y=0.3835939656295897} toLatLng=lat/lng: (38.60307404999999,-121.420291)
pos=lat/lng: (38.47433721,-121.4189709) wLL=Point{x=0.1627250808333333, y=0.3840511482481476} toLatLng=lat/lng: (38.474337209999995,-121.4189709)
pos=lat/lng: (38.45471595,-121.4381169) wLL=Point{x=0.1626718975, y=0.38412075739044343} toLatLng=lat/lng: (38.45471595,-121.4381169)
pos=lat/lng: (38.52555366,-121.43427) wLL=Point{x=0.16268258333333335, y=0.38386936146458267} toLatLng=lat/lng: (38.52555366,-121.43427)
pos=lat/lng: (38.62147929,-121.4278524) wLL=Point{x=0.16270040999999996, y=0.38352853623062677} toLatLng=lat/lng: (38.62147929,-121.42785240000002)
pos=lat/lng: (38.47614715,-121.4598152) wLL=Point{x=0.16261162444444444, y=0.38404472628068015} toLatLng=lat/lng: (38.47614715,-121.45981520000001)