将相机移动到 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)
我正在制作 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)