异步从数据存储中提取数据并绘制地图

时间:2010-08-23 16:09:49

标签: google-app-engine spring-mvc google-maps-api-3

我有一个在Google App Engine上运行的Spring MVC 3应用程序(使用JSP)并在数据存储区中保存信息。我正在使用Google Maps API v3通过绘制形状,着色等来在地图上投影一些数据。我的数据库可能会有数百万条目。

我想知道最好的方法是从数据存储中提取数据并将它们投影到地图上,直到没有更多的数据库条目留给项目。我需要这样做以避免达到30秒的限制(并获得DeadlineExceededException),同时也为了获得良好的用户体验。

是否值得使用GWT?

任何建议都会很棒。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用类似于此处描述的分页技术的光标:

Pagination in Google App Engine with Java

当您加载地图的页面加载时,让它使用空白游标参数发出AJAX请求。请求处理程序将获取少量实体,然后返回包含它们的响应和游标(如果还有实体)。

从客户端javascript中,在地图上显示项目后,如果响应中有游标,则以光标作为参数启动新请求。在请求处理程序中,如果提供了游标,请在进行查询时使用它。

这将建立一个连续的AJAX请求循环,直到所有项目都被提取并显示在地图上。

更新

您可以编写一个返回JSON的服务:

{
    items: 
    [
        { lat: 1.23, lon: 3.45, abc = 'def' },
        { lat: 2.34, lon: 4.56, abc = 'ghi' }
    ],
    cursor: '1234abcd'
}

因此,它包含一个项目数组(使用lat / lon以及每个项目需要的其他信息),以及一个游标(在获取最后一个实体时为null)。

然后,在客户端,我建议使用jQueryajax函数来进行ajax调用,如下所示:

$(document).ready(function()
{
    // first you may need to initialise the map - then start fetching items
    fetchItems(null);
});

function fetchItems(cursor)
{
    // build the url to request the items - include the cursor as an argument
    // if one is specified
    var url = "/path/getitems";
    if (cursor != null)
        url += "?cursor=" + cursor;

    // start the ajax request
    $.ajax({
        url: url,
        dataType: 'json',
        success: function(response)
        {
            // now handle the response - first loop over the items
            for (i in response.items)
            {
                var item = response.items[i];
                // add something to the map using item.lat, item.lon, etc
            }

            // if there is a cursor in the response then there are more items,
            // so start fetching them
            if (response.cursor != null)
                fetchItems(response.cursor);
        }});
}