如何在Google App Engine上实现高效的地图图块引擎?

时间:2012-03-06 06:21:13

标签: google-app-engine map tile

我正在尝试在Google App Engine上实现地图图块引擎。

地图数据存储在数据库中,即数据存储区(大表)。问题是20个请求可能几乎同时进入,根据数据库中的同一组行绘制20个图块。

所以有20个请求进来,如果我编写代码来从数据库中读取每个请求,那么我将从数据库中执行20次读取操作,每次读取一个tile图像输出。由于每次读取都是相同的查询,因此执行相同的查询20次是没有意义的。事实上,这是非常低效的。

有人能建议更好的方法吗?

如果我使用memcache,我需要将数据放入memcache,但是有20个请求同时进入数据,那么如果我做了一个nieve实现,那么20个进程将写入memcache,因为它们都是同时进行的。

我正在使用Google App Engine上的Google Go第1版测试版编程,我在这里引用了Python文档,因为它们更完整。

参考文献:

Google数据存储http://code.google.com/appengine/docs/python/datastore/overview.html

Leaflet JS我用于显示地图图块http://leaflet.cloudmade.com/


澄清。

我从数据库中的数据生成平铺图像,也就是说,我在数据库中查询数据(这不是平铺图像),然后我将数据绘制到图像中并将图像渲染为JPEG。由于GAE可以有效地在服务器端http://blog.golang.org/2011/12/from-zero-to-go-launching-on-google.html

上绘制图像

3 个答案:

答案 0 :(得分:2)

  1. 整理图块实体,以便您可以通过密钥找到它们而不是查询它们,即使用get()代替query()。如果基于多个条件识别切片,则通过组合条件创建自然ID。例如。如果您在图像中找到基于垂直和水平位置的图块,那么您可以这样做:naturalID = imageID + verticalID + horizo​​ntalID(您还可以添加分隔符以便更好地查看)。

  2. 拥有自己的唯一ID后,您可以使用它在Memcache中保存磁贴。

  3. 如果您的图块是不可变的(=一旦创建,其内容不会更改),您也可以将它们缓存在实例中的全局图中。

  4. 编辑:删除了Objectify引用,因为我刚刚意识到您使用了python。 Edit2:添加了第3点。

答案 1 :(得分:2)

我不知道Google App Engine是如何做到的,但MySQL有一个查询缓存,因此如果连续两次询问同一个查询,那么它会使用第一个的结果来回答第二个问题。谷歌对事情很聪明,所以希望他们也这样做。 (你或许可以通过计时来弄清楚它们是不是。)

您可能需要确保的一件事是查询完全相同,而不仅仅是返回相同的结果。例如,您不希望query1成为    SELECT lat,lng FROM mytable WHERE tileX = 1 AND tileY = 1 和query2是    SELECT lat,lng FROM mytable WHERE tileX = 1 AND tileY = 2

我使用多边形的多边形制作瓷砖,当我进行计时和优化时,我惊讶地发现返回所有值并快速删除PHP中我不想要的那些比它坚持的更快SQL的WHERE子句。我认为部分原因是因为每个磁贴的WHERE子句都不同,所以MySQL服务器无法有效缓存。

答案 2 :(得分:1)

我想到了一些事情:

  1. 您如何查询瓷砖?您应该能够使用Key.get()获取切片,这比查询
  2. 更有效
  3. 尝试减少请求数量,使用级别应将数量减少到4个请求以检索地图。