【Python】百度地图API获取地理信息
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Python】百度地图API获取地理信息,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4097字,纯文字阅读大概需要6分钟。
内容图文
![【Python】百度地图API获取地理信息](/upload/InfoBanner/zyjiaocheng/1189/7eae4dbb7df3463d85d201e14c952ab7.jpg)
接口文档:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-placeapi#service-page-anchor-1-3
1、示例中的数据是从链家拿到的北京小区信息,包含小区名和所在行政区,例如朱雀门/西城,实例化CheckEstateData(朱雀门, 西城)
2、API中region可以多维度组合,为防止全国或同行政区有重名,例如北京有多个万达广场,最好加上region=市+区
3、有一些百度API会把小区名莫名解释成错误的名称,例如《东四西大街50号院》->《东4西大街》,这类数据不会直接更新数据,set status = -1,需要手动维护数据
# -*- coding: utf-8 -*- import urllib2, json, sys, time reload(sys) sys.setdefaultencoding( " utf8 " ) GLOBAL_URL = "http://api.map.baidu.com/place/v2/search?region=北京%s&city_limit=true&query=%s&page_size=10&output=json&ak=%s" GLOBAL_AK = "" GLOBAL_SQL = "SELECT `name`, `district` FROM estate WHERE location IS NULL and `status` IS NULL LIMIT 100 " COLUMN_LIST = ["area", "address", "location", "province", "city", "uid"] UPDATE_SQL = """ UPDATE estate SET %s, source_name = ‘%s‘, `status` = %s, `result` = ‘%s‘ WHERE `name` = ‘%s‘ AND `district` = ‘%s‘ """""" estate的status字段 更新数据状态 小区名全匹配且全属性 0 小区名全匹配属性不全 1 小区名全匹配无detail=1 2 小区名无全匹配第一个detail=1的全属性数据 3 小区名无全匹配第一个detail=1的属性不全数据 4 小区名无全匹配没有detail=1的数据 5 没搜到任何数据 -1 """
class CheckEstate:
def __init__(self):
# 本地存
pass
class CheckEstateData: def__init__(self, name, district): self.name = name self.district = district self.error = None self.msg = None self.__get_data__() if self.datas: self.do() def__get_data__(self): try: print"URL: %s" % (GLOBAL_URL % (self.district, self.name, GLOBAL_AK)) html = urllib2.urlopen(GLOBAL_URL % (self.district, self.name, GLOBAL_AK)) b = html.read() c = json.loads(b) if c["status"] == 0 and c["message"] == "ok": self.datas, self.error = c["results"], None else: self.datas, self.error = None, "ERR: API return %s" % c["message"] except Exception, e: self.datas, self.error = None, "ERR: get data %s %s" % (self.name, str(e)) def update(self, sql): print"INFO: sql %s" % sql s = CheckEstate(sql) if s.error: self.error = "ERR: UPDATE ERR, %s" % s.error else: self.msg = "INFO: %s ok" % self.name def check_colunm(self, data): ifnot set(COLUMN_LIST).difference([k for k in data]): return True return False def get_info(self): for d in self.datas: if d["name"] == self.name and"detail"in d and d["detail"] == 1: r = check_colunm(d) if r: return d, 0 else: return d, 1 # if self.name in [row["name"] for row in self.datas]:# return None, 2for d in self.datas: if"detail"in d and d["detail"] == 1: r = self.check_colunm(d) if r: return d, 3 else: return d, 4 return None, -1 def do(self): r, status = self.get_info() if r: value = ", ".join( [ "%s = ‘%s‘" % (k, json.dumps(r[k])) if k == "location"else"%s = ‘%s‘" % (k, r[k]) for k in [key for key in r if key in COLUMN_LIST] ] ) sql = UPDATE_SQL % (value, r["name"], status, json.dumps(self.datas, ensure_ascii=False), self.name, self.district) else: sql = "UPDATE estate set `status` = %s, `result` = ‘%s‘ WHERE `name` = ‘%s‘ and district = ‘%s‘" % (status, json.dumps(self.datas, ensure_ascii=False), self.name, self.district) self.update(sql) def get_estate_info(): c = CheckEstate(None) if c.error: print c.error return c.error for d in c.r: estate = CheckEstateData(d["name"], d["district"]) if estate.error: print estate.error else: print estate.msg time.sleep(0.5) return None if__name__ == "__main__": get_estate_info()
为防止链家和百度的小区名有差异,在存储时将API的所有数据本地存一份
CREATE TABLE `estate` ( `id` bigint(20) unsigned NOTNULL AUTO_INCREMENT, `name` varchar(50) NOTNULL COMMENT ‘小区名‘, `source_name` varchar(50) DEFAULTNULL COMMENT ‘baidu小区原名‘, `district` varchar(20) DEFAULTNULL COMMENT ‘区(链家侧数据)‘, `area` varchar(20) DEFAULTNULL COMMENT ‘区(百度侧数据)‘, `street_id` varchar(50) DEFAULTNULL COMMENT ‘街景图id‘, `address` varchar(100) DEFAULTNULL COMMENT ‘地址‘, `location` json DEFAULTNULL COMMENT ‘坐标‘, `province` varchar(30) DEFAULTNULL COMMENT ‘省份‘, `city` varchar(30) DEFAULTNULL COMMENT ‘城市‘, `uid` varchar(100) DEFAULTNULL COMMENT ‘poi的唯一标示,可用于详情检索‘, `status` tinyint(4) DEFAULTNULL COMMENT ‘更新数据状态,具体含义看代码‘, `result` json DEFAULTNULL COMMENT ‘接口返回的数据‘, PRIMARYKEY (`id`), KEY `idx_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=8192DEFAULT CHARSET=utf8mb4;
原文:https://www.cnblogs.com/jiangxu67/p/12668001.html
内容总结
以上是互联网集市为您收集整理的【Python】百度地图API获取地理信息全部内容,希望文章能够帮你解决【Python】百度地图API获取地理信息所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。