百度MapAPI之地理编码

Posted gg-bond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度MapAPI之地理编码相关的知识,希望对你有一定的参考价值。

地理编码:将具体地址数据转换为对应坐标点经纬度功能

大致思路:

1、从数据库取得具体地理位置

2、将地址作为参数访问API接口,获取返回数据

3、处理response数据并将经度(lng、longitude)、纬度(lat、latitude)存入数据库

 

API接口:http://api.map.baidu.com/geocoder/v2/?address=地址(&city=城市名)&output=json&ak=ak(密钥)

address:详细地址

city:可选参数,address所在城市名,起过滤作用

output:返回数据格式,json/xml

ak:访问百度API密钥,必须有,申请很容易。EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx

 

数据库表设计

技术图片

 

语言选择:python(python处理数据和访问url都比java方便简单)

import pymysql
import requests
import json
import redef getLocation():
    #数据库连接
    conn = pymysql.Connect(host=‘localhost‘,
                           port=3306,
                           user=‘root‘,
                           passwd=‘root‘,
                           db=‘AnalyseBusiness‘,
                           charset=‘utf8‘)
    try:
        # 获取游标
        cur = conn.cursor()
        # 执行sql语句  选择经纬度为空的记录
        cur.execute(‘select * from BusinessInfo where longitude is null or latitude is null‘)
        # 取得select返回的记录
        data = cur.fetchall()
        for d in data:
            # url = "http://api.map.baidu.com/geocoder/v2/?address=天安门&city=北京&output=json&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx"
            # 将address和city加入构成访问url   get请求
            url = "http://api.map.baidu.com/geocoder/v2/?address=" + d[0] + "&city=" + d[
                1] + "&output=json&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx"
            response = requests.get(url)

            ## 正则表达式获取经纬度  若查询无相关结果  取值异常  if判断list是否为空  为空设置经纬度为999作为标识
            text = response.text
            pattern_lng = "lng":(.*?),"
            pattern_lat = "lat":(.*?)}"
            lng = re.findall(pattern_lng, text)
            lat = re.findall(pattern_lat, text)
            if lng or lat:
                data = (lng[0], lat[0])
            else:
                # 纬度:从赤道向北和向南,各分90°,北纬为正数,南纬为负数
                # 经度:向东到180°或向西到180°
                # 若查询不到  存入非法经纬度值 作为标识
                data = ("999", "999")
            sql = "update BusinessInfo set longitude=‘%s‘, latitude=‘%s‘ WHERE address=‘" + d[0] + "‘"
            cur = conn.cursor()
            cur.execute(sql % data)
            conn.commit()
        cur.close()
        conn.close()
    except Exception:
        conn.rollback()
        conn.close()
        print("定位失败")
if __name__ == ‘__main__‘:
    getLocation()

 结果

技术图片

 

提示:百度Map获取到的是百度经纬度坐标,如需要转换为国测局坐标(GCJ02)的坐标系,需调用地址转换API

API接口:http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=密钥 //GET请求

import requests
import re
import json

def addCity(): try: print("百度坐标") url = "http://api.map.baidu.com/geocoder/v2/?address=大雁塔&city=陕西省西安市&output=json&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx" response = requests.get(url) text = response.text print(type(text)) pattern_lng = "lng":(.*?)," pattern_lat = "lat":(.*?)}" lng = re.findall(pattern_lng, text) lat = re.findall(pattern_lat, text) print("lng:" + lng[0]) print("lat:" + lat[0]) print("国测局(GCJ02)坐标") url1 = "http://api.map.baidu.com/geoconv/v1/?coords=" + lng[0] + "," + lat[ 0] + "&from=3&to=5&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx" text2 = requests.get(url1).text pattern_x = "x":(.*?)," pattern_y = "y":(.*?)}" x = re.findall(pattern_x, text2) y = re.findall(pattern_y, text2) print("x:" + x[0]) print("y:" + y[0]) except Exception: print("error") if __name__ == ‘__main__‘: addCity()

结果

技术图片

 

以上是关于百度MapAPI之地理编码的主要内容,如果未能解决你的问题,请参考以下文章

Android应用中使用百度地图API之POI

百度地图集成_POi搜索和正反地理编码

百度MapApi1.4------addControl各种控件初始化

C#语言,从百度地图反向地理编码api返回的json数据中提取信息

调用百度地图API出现 error inflating class com.baidu.mapapi.map.mapview

逆地理编码-离线版-part1