2012-03-06 47 views
1

我正试图在Google App Engine上实现地图切片引擎。如何在Google App Engine上实现高效的地图切片引擎?

地图数据存储在数据库,数据存储(大表)中。问题是20个请求可能大约在同一时间基于数据库中相同的一组行来绘制20个图块。

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

任何人都可以提出一个更好的方法来做到这一点?

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

我在Google App引擎上的Google Go版本1测试版中进行编程,因为它们更完整,所以我在这里提到Python文档。

参考文献:

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

传单JS我使用的用于显示地图图块http://leaflet.cloudmade.com/


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

回答

1

有几件事情想到绘制图像:

  1. 你如何查询瓷砖?你应该可以使用Key.get()方法来获取tile,这比查询效率更高效
  2. 尽量减少请求数量,使用级别应该将数量减少到大约4个请求来检索地图。
+0

我从数据库中的数据生成平铺图像,即查询数据库中的数据,然后将数据绘制成图像并将图像呈现为JPEG格式。由于GAE在服务器端绘制图像效率很高http://blog.golang.org/2011/12/from-zero-to-go-launching-on-google.html – Phil 2012-03-06 06:58:13

+0

@Phil我认为PNG会给你地图图像数据的更好结果(质量/压缩)。 – 2012-03-06 06:59:52

+0

@Phil下载图片客户端也会更好吗?这就是所有地图服务(Google/Bing/Quest)如何执行此操作的方式。 – 2012-03-06 07:01:28

2
  1. 组织瓷砖实体,从而使您可以通过密钥,而不是查询他们,即使用get()代替query()找到它们。如果您根据多个条件识别图块,则可以通过组合条件来创建自然ID。例如。如果你可以在图像中找到基于垂直和水平位置的图块,那么你应该这样做:naturalID = imageID + verticalID + horizo​​ntalID(你也可以添加分隔符以获得更好的查看效果)。

  2. 一旦你有你自己的唯一ID,你可以用它来保存在Memcache瓷砖。

  3. 如果你的贴图不可变(=一旦创建,它们的内容不会改变),你也可以将它们缓存在实例中的全局映射中。

编辑:刚才我意识到你使用Python删除物化参考。 EDIT2:加点3

2

我不知道谷歌应用程序引擎是怎么做的,但MySQL有一个查询缓存,这样,如果同一个查询被连续问了两次,然后它使用结果从第一个回答第二个。谷歌对事情很聪明,所以希望他们也能做到。 (您可能能够弄清楚它们是否按时间排序。)

您可能需要确定的一件事是查询完全相同,而不仅仅是返回相同的结果。例如,你不想QUERY1是 选择纬度,经度FROM MYTABLE WHERE tileX = 1 AND tileY = 1 和QUERY2是 选择纬度,经度FROM MYTABLE WHERE tileX = 1 AND tileY = 2

我用多边形的gazillions瓷砖,当我做了时间和优化,我发现我感到惊讶的是,返回所有值和删除那些我不想在PHP中比它坚持在WHERE子句中更快到SQL。我认为部分原因是因为WHERE子句对每个磁贴都不同,所以MySQL服务器无法有效缓存。

相关问题