QQ地图通过地址字符串获取坐标

刚刚做一个应用,因为在应用里面嵌入了 QQ地图,然后有 3600+ 的会员填写了地址。

现在需要根据这个地址来显示地图,但是通过手动的方式来处理显然不可能。

然后呢,就去 QQ 地图寻找 API,发现很多 API 定位都极不准确(最开始打算使用 WebService API,但是定位不准确),最后还是使用了 JSAPI。

QQ地图JSAPI:http://lbs.qq.com/javascript_v2/index.html

Geo Coder 示例http://lbs.qq.com/javascript_v2/case-run.html#sample-geocoding-simple

关键点在于使用这个 GeoCoder 对象,调用部分核心代码如是:

<script charset="utf-8" src="http://map.qq.com/api/js?v=2.exp"></script>

<script>
var geocoder = new qq.maps.Geocoder({
    complete : function(result){
        var loc = result.detail.location;
        console.log(loc);
    }
});
geocoder.getLocation('佛山市顺德区乐从镇乐从大道西12号');
</script>

简单而言,先定义一个 geocoder 对象并且定义好回调函数(回调函数的参数 result 是一个 LatLng 坐标对象);

然后再通过 getLocation 方法进行调用。

可以看到,查询一个地址字符串对应的坐标肯定是一个异步 AJAX 请求,而且已经被 javascript 库封装,那么我们只能在前端进行查询;

下面是我的一段实际代码,用于实际生成 data[] 数组里面的会员地址的坐标。

由于短时间内同一个 IP 大量请求这个接口会被封禁限制,因此下面这段代码使用了 PHP 增量获取并且持久化到文件中的轮询方式来实现,如果刷到 IP 被限制之后,就重新 ADSL 拨号一下,然后就可以逐步生成所有的地址,存放到 data.json 这个文件中,最后手动将结果导进后台。

<?php
// $result = json_decode(file_get_contents('data.json'), true);
// var_dump($result); exit;

if(isset($_POST['data'])) {
    file_put_contents('data.json', $_POST['data']);
}
?><!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script charset="utf-8" src="http://map.qq.com/api/js?v=2.exp"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
$(function() {
    var geocoder,map,marker = null;
    var init = function() {
        var data = [
            ['G.BC00001','佛山市顺德区乐从镇上华工业大道30号'],
            ['G.BC00002','顺德区乐从镇荷村工业区工业东路57-63号'],
            ['G.BC00003','顺德区乐从镇良教工业区'],
            ['G.BC00005','顺德区乐从镇罗沙工业区'],
        ];

        var i;
        var addr;

        var remain = 500;

        for(i = 0; i < data.length && remain > 0; ++i) {
            addr = data[i];
            if(!d[addr[0]]) {
                remain -= 1;
                (function() {
                    var addr_local = addr;
                    geocoder = new qq.maps.Geocoder({
                        complete : function(result){
                            var loc = result.detail.location;
                            var axis = loc.lat + ', ' + loc.lng;
                            d[addr_local[0]] = axis;
                            console.log(addr_local[0] + ": " + axis);
                        }
                    });
                    geocoder.getLocation(addr_local[1]);
                })();
            }
        }

    }

    var d = JSON.parse('<?=file_get_contents('data.json')?>' || '{}');

    setTimeout(function() {
        $('#hfdata').val(JSON.stringify(d));
        $('#form_main').submit();
    }, 10000);

    init();

});
</script>
</head>
<body>
    <form id="form_main" method="post" />
        <input id="hfdata" type="hidden" value="" name="data" />
        <input type="submit" />
    </form>
</body>
</html>

这种手法顶多算一种打补丁式的半自动方法,如果需要在后台自动整合更好的实现方式,需要研究一下其他更可靠的 API 调用,这只是一个权宜之计。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2015/07/qq-map-address-search.html【QQ地图通过地址字符串获取坐标】

发表评论

电子邮件地址不会被公开。 必填项已用*标注