检索城市Google Map API的位置

时间:2014-06-28 23:15:40

标签: javascript google-maps-api-3 google-fusion-tables

我想使用Google地图检索世界上每个城市的纬度和经度。 我使用a Google Fusion table

function requestCities()
{
    var script = document.createElement('script');
    var url = ['https://www.googleapis.com/fusiontables/v1/query?'];
    url.push('sql=');
    //var query = 'SELECT CITY_NAME, geometry, POP_RANK, STATUS FROM ' + '1jmboG7oPaWTAUKubEl__YMVvkIkmhKTxxfD3wNo' + " WHERE 'CNTRY_NAME' = '"+ focusedCountry +"'";
    var query = 'SELECT CITY_NAME, geometry, POP_RANK, STATUS, FIPS_CNTRY, GMI_ADMIN FROM ' + '1ld4KaHF-E6UbFoN_VdCUp_s0_liEE7poZ7v4OmU' + " WHERE 'POP_RANK' \< 5";
    //var query = 'SELECT CITY_NAME, geometry, POP_RANK, STATUS FROM ' + '1jmboG7oPaWTAUKubEl__YMVvkIkmhKTxxfD3wNo';

    var encodedQuery = encodeURIComponent(query);
    url.push(encodedQuery);
    url.push('&callback=setCities');
    url.push('&key=AIzaSyACrx-nlt1KZ8cDNpsvW_FW8JPEKfbpF8g');
    script.src = url.join('');
    var body = document.getElementsByTagName('body')[0];
    body.appendChild(script);
}

在我的回调函数I try to add a marker on each city中:

function setCities(data)
{
    var rows = data['rows'];
    console.log(rows[0]);

    var nbInfobox = document.getElementById("infobox-wrapper").getElementsByTagName("div").length;

    for (var i in rows)
    {
        var name = rows[i][0];
        var pop_rank = rows[i][2];
        var status = rows[i][3];
        //var countryCode = rows[i][4];
        var cityCode = rows[i][5];
        var countryCode = cityCode.substring(0,2);
        var capital = eval(status[0] == "N");

        var myLatlng = new google.maps.LatLng(rows[i][1]['geometry']['coordinates'][1], rows[i][1]['geometry']['coordinates'][0]);

        var image = 'img/marker_'+ pop_rank+ '.png';
        if (capital)
        {
            var image = 'img/marker_capital.png';
            pop_rank = 0;
        }

        var marker = new google.maps.Marker(
            {
                position: myLatlng,
                title: name,
                zIndex: 7 - pop_rank,
                icon: image
            });


        //Create infobox for selected cities
        $("#infobox-wrapper").append("<div id=\"infobox" + nbInfobox + "\" class=\"infoboxcountry\" />");

        var info = new InfoBox({
            content: document.getElementById("infobox" + nbInfobox),
            position: marker.getPosition(),
            disableAutoPan: true,
            pixelOffset: new google.maps.Size(0, 0),
            zIndex: 0,
            closeBoxURL: ""
        });

        $("#infobox" + nbInfobox).html(marker.getTitle());

        var city = new City(i, marker, info, pop_rank, countryCode, cityCode);

        overlays.cities.push(city);

        google.maps.event.addListener(marker, 'click', function() {
            cityClick(this);
        });

        ++nbInfobox;
    }

}

我的查询结果是一个包含世界上所有城市的数组:

 ["Lima", "<Point><coordinates>", "1", "National and provincial capital", "PE", "PER-LIM"]

但我总是得到这个错误:

 Uncaught TypeError: Cannot read property 'coordinates' of undefined 

我不知道如何从我的数组var行获取坐标。如果有人知道,谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

由于此表中的数据似乎有问题。

当我查看https://www.google.com/fusiontables/DataSource?docid=1ld4KaHF-E6UbFoN_VdCUp_s0_liEE7poZ7v4OmU&pli=1#map:id=3地图上没有标记时,geometry无法正确识别。

e.g。特定的行应如下所示:

["Lima",{"geometry":{"type":"Point","coordinates":[-77.0450036007242,-12.0819959357647]}},"1","National and provincial capital","PE","PER-LIM"]

如您所见,第二列与您的回复<Point><coordinates>

不同

我无法告诉你为什么会发生这种情况,可能是因为高度几何的KML中使用了NaN

<Point><coordinates>-77.0450036007242,-12.0819959357647,NaN</coordinates></Point>

但是,为了进行测试,我制作了一份表格副本,并且通过魔术,副本似乎正常工作:

https://www.google.com/fusiontables/data?docid=1re5M5ZjS7oUTux3ng538gQZMP3ralKTxPtfZJplB#map:id=3

所以你可以尝试相同的...创建一个表的副本(不要使用我的副本,我会在某一天删除表)

答案 1 :(得分:2)

您的数据源存在问题。查看您的脚本,您正在执行select ... from 1ld4KaHF-E6UbFoN_VdCUp_s0_liEE7poZ7v4OmU。所以我搜索了那个并找到了融合表Copy of World Cities.csv。查看信息,我发现它是从this table (1TJk4Fh8AU5IIhMDmvJOhcAOu9I5EB6xu9uKxI30)复制的。我创建了一个JSFiddle并在调用函数中放置了一个调试器。当脚本从您在问题中的表中选择时,geometry属性未定义,因为rows[i][1]不是JSON,而是始终是格式错误的XML "<Point><coordinates>",无论是什么城市是。但是,如果您将脚本切换为从1TJk4Fh8AU5IIhMDmvJOhcAOu9I5EB6xu9uKxI30(原始融合表,而不是您正在使用的副本)中进行选择,则以下代码可为您提供正确的坐标:rows[i][1]['geometry']['coordinates'][1]。因此,在requestCities中,使用以下查询而不是您拥有的内容:

var query = 'SELECT CITY_NAME, geometry, POP_RANK, STATUS, FIPS_CNTRY, GMI_ADMIN FROM ' + '1TJk4Fh8AU5IIhMDmvJOhcAOu9I5EB6xu9uKxI30' + " WHERE 'POP_RANK' \< 5";