谷歌地图使用three.js和webgl

时间:2013-05-30 07:59:00

标签: google-maps three.js webgl

我有数千个点需要在谷歌地图上绘制,并使用https://github.com/ubilabs/google-maps-api-threejs-layer中的示例获得响应迅速的地图。 有没有人在这玩,并想知道是否有可能有不同的彩色标记和可能的标记点击事件?

在线欣赏任何指针或示例。

4 个答案:

答案 0 :(得分:4)

可以使用webgl在Google地图上绘制数百万个可点击的数据点。

数据点由画布上的位置的x,y对表示,大小为int,屏幕外颜色和屏幕颜色。这些值存储在单独的类型化数组中。

每个数据点都有一个唯一的rgb颜色,可作为数据点ID查找表中的键。

创建纹理以存储屏幕外颜色并将其渲染到屏幕外缓冲区。在事件中,加载屏幕外缓冲区并使用glReadPixels检索单击的像素的rgb颜色,然后在查找表中查找id。屏幕缓冲区上的点,用户看到的内容,可以共享一种共同的颜色。

canvas.addEventListener('click', function(ev) {
  # insert code to get mouse x,y position on canvas
  pixels = new Uint8Array(4);
  gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
  gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
  if (colorToId[pixels[0] + " " + pixels[1] + " " + pixels[2]]) {
    # Pixel clicked is a data point on the map
  }
});

Webgl代码很长,因此只包含click事件。

这是live demorepo。 (角和咖啡)

这是使用普通js的第二个例子:webgl-picking-geo-polygons

这是react-webgl-leaflet

该解决方案基于Brendan Kenny的Google Maps + HTML5 + Spatial Data Visualization,它解释了上述摘录中30分钟的部分代码和Displaying WebGL data on Google Maps

该演示功能少于10个数据点,但您可以使用rgb值的所有组合轻松绘制超过1600万个可选数据点。

答案 1 :(得分:1)

上周我发现了OpenLayers。非常非常令人印象深刻我强烈建议你去看看。 OpenLayers.org是一个开源JavaScript网页映射库,与其他替代方案(如Leaflet或Google Maps API)区别开来,因为它有大量的组件。

我花了整个周末通过将OpenLayers与API(如MapBox,WebGL等)集成来创建示例应用程序......毕竟说完了,我对OpenLayers印象非常深刻 - 我打算在即将到来的POC /项目中使用OpenLayers。


这是我的test harness的链接。从那里你也可以下载所有例子的代码。

答案 2 :(得分:0)

这是jQuery / google地图应用的链接。不完全是你想要的;但是你可能会发现这个例子很有用。随意使用 - 可以从我的网站下载。

Link to app on my website

Click here to download the zip

答案 3 :(得分:0)

2021 年更新!!

Google Maps JS 现在有一个 WebglOverlayView 类并公开 WebGL 上下文。

const webglOverlayView = new google.maps.WebglOverlayView();

webglOverlayView.onAdd = () => {
  // Do setup that does not require access to rendering context.
}

webglOverlayView.onContextRestored = gl => {
  // Do setup that requires access to rendering context before onDraw call.
}

webglOverlayView.onDraw = (gl, coordinateTransformer) => {
  // Render objects.
}

webglOverlayView.onContextLost = () => {
  // Clean up pre-existing GL state.
}

webglOverlayView.onRemove = () => {
  // Remove all intermediate objects.
}

webglOverlayView.setMap(map);

此外,@googlemaps/three 扩展了这个类以便更容易与 ThreeJS 一起使用。

// instantiate a ThreeJS Scene
const scene = new Scene();

// Create a box mesh
const box = new Mesh(
  new BoxBufferGeometry(10, 50, 10),
  new MeshNormalMaterial(),
);

// set position at center of map
box.position.copy(latLngToVector3(mapOptions.center));
// set position vertically
box.position.setY(25);

// add box mesh to the scene
scene.add(box);

// instantiate the ThreeJS Overlay with the scene and map
new ThreeJSOverlayView({
  scene,
  map,
});