城市和经纬度一致性验证

本文将介绍:

  • 把所有的县级市、地级市都统计起来到citys中;
  • 根据百度的api得到所有城市对应的经纬度;
  • 得到所有的数据并保存到json文件中;
  • 计算两个经纬度之间的距离;

PS:后期可利用json文件的数据,判断用户的地址信息和经纬度信息一致性验证。

1.请求得到所有城市对应的经纬度

下面是利用request向百度api请求得到每个城市的经纬度地址,并保存在json文件中。

#coding:utf-8
import requests
import json
import bs4
import uniout

url = 'http://api.map.baidu.com/geocoder/v2/'

ak = 'iHdBzBcfBFoX8Hdx93pxBP35dIEWGADT'

# 县级市 359个
# 地级市 291个
# 直辖市 4个
citys = set([ # 县级市 359个
             '晋州市', '新乐市', '辛集市', '遵化市', '迁安市', '武安市', '南宫市', '沙河市', '涿州市', '安国市', '高碑店市', '定州市', '泊头市', '任丘市', '黄骅市',
             '河间市', '霸州市', '三河市', '冀州市', '深州市','古交市','潞城市','高平市','介休市','河津市','永济市','原平市','侯马市','霍州市','孝义市','汾阳市',
             '霍林郭勒市','满洲里市','牙克石市','扎兰屯市','根河市','额尔古纳市','丰镇市','乌兰浩特市','阿尔山市','二连浩特市','锡林浩特市','新民市','瓦房店市',
             '普兰店市','庄河市','海城市','东港市','凤城市','凌海市','北镇市','大石桥市','盖州市','灯塔市','调兵山市','开原市','凌源市','北票市','兴城市',
             '德惠市','榆树市','舒兰市','桦甸市','蛟河市','磐石市','公主岭市','双辽市','梅河口市','集安市','临江市','扶余市','大安市','洮南市','延吉市','图们市',
             '敦化市','龙井市','珲春市','和龙市','尚志市','五常市','讷河市','密山市','虎林市','铁力市','同江市','富锦市','宁安市','海林市','穆棱市','绥芬河市',
             '北安市','五大连池市','安达市','肇东市','海伦市','江阴市','宜兴市','邳州市','新沂市','溧阳市','张家港市','常熟市','太仓市','昆山市','如皋市','海门市',
             '启东市','东台市','高邮市','仪征市','丹阳市','扬中市','句容市','靖江市','兴化市','泰兴市','建德市','临安市','余姚市','慈溪市','奉化市','瑞安市','乐清市',
             '海宁市','平湖市','桐乡市','诸暨市','嵊州市','兰溪市','义乌市','东阳市','永康市','江山市','温岭市','临海市','龙泉市','巢湖市','桐城市','天长市','明光市',
             '界首市','宁国市','福清市','长乐市','永安市','石狮市','晋江市','南安市','龙海市','邵武市','建瓯市','武夷山市','漳平市','福安市','福鼎市','乐平市','瑞昌市',
             '共青城市','贵溪市','瑞金市','井冈山市','丰城市','樟树市','高安市','德兴市','章丘市','胶州市','即墨市','平度市','莱西市','滕州市','龙口市','莱阳市','莱州市',
             '招远市','蓬莱市','栖霞市','海阳市','青州市','诸城市','寿光市','安丘市','高密市','昌邑市','曲阜市','邹城市','新泰市','肥城市','乳山市','荣成市','乐陵市',
             '禹城市','临清市','新郑市','新密市', '登封市','荥阳市','巩义市','偃师市','舞钢市','汝州市','林州市','卫辉市','辉县市','沁阳市','孟州市','禹州市','长葛市',
             '义马市','灵宝市','邓州市','永城市','项城市','济源市','大冶市','丹江口市','宜都市','当阳市','枝江市','老河口市','枣阳市','宜城市','钟祥市','应城市','安陆市',
             '汉川市','洪湖市','石首市','松滋市','麻城市','武穴市','赤壁市','广水市','恩施市','利川市','仙桃市','潜江市','天门市','浏阳市','醴陵市','湘乡市','韶山市',
             '耒阳市','常宁市','武冈市','临湘市','汨罗市','津市市','沅江市','资兴市','洪江市','冷水江市','涟源市','吉首市','乐昌市','南雄市','恩平市','台山市','开平市',
             '鹤山市','吴川市','廉江市','雷州市','化州市','信宜市','高州市','四会市','兴宁市','陆丰市','阳春市','英德市','连州市','普宁市','罗定市','岑溪市','东兴市',
             '桂平市','北流市','靖西市','宜州市','合山市','凭祥市','五指山市','琼海市','文昌市','万宁市','东方市','都江堰市','彭州市','邛崃市','崇州市','广汉市','什邡市',
             '绵竹市','江油市','峨眉山市','阆中市','华蓥市','万源市','简阳市','康定市','西昌市','清镇市','赤水市','仁怀市','兴义市','凯里市','都匀市','福泉市','安宁市',
             '宣威市','腾冲市','楚雄市','蒙自市','个旧市','开远市','弥勒市','文山市','景洪市','大理市','芒市','瑞丽市','香格里拉市','兴平市','韩城市','华阴市','玉门市',
             '敦煌市','临夏市','合作市','玉树市','德令哈市','格尔木市','灵武市','青铜峡市','哈密市','阿克苏市','喀什市','和田市','塔城市','乌苏市','阿勒泰市','昌吉市',
             '阜康市','博乐市','阿拉山口市','库尔勒市','阿图什市','伊宁市','奎屯市','霍尔果斯市','阿拉尔市','图木舒克市','五家渠市','北屯市','铁门关市','双河市','可克达拉市',
            # 地级市 291个
             '石家庄市','太原市','呼和浩特市','唐山市','大同市','包头市','秦皇岛市','阳泉市','乌海市','邯郸市','长治市','赤峰市','邢台市','晋城市','呼伦贝尔市','保定市',
             '朔州市','通辽市','张家口市','忻州市','乌兰察布市','承德市','吕梁市','鄂尔多斯市','沧州市','晋中市','巴彦淖尔市','廊坊市','临汾市','衡水市','运城市','沈阳市',
             '长春市','哈尔滨市','大连市','吉林市','齐齐哈尔市','鞍山市','四平市','牡丹江市','抚顺市','辽源市','佳木斯市','本溪市','通化市','大庆市','丹东市','白山市','伊春市',
             '锦州市','白城市','鸡西市','营口市','松原市','鹤岗市','阜新市','双鸭山市','辽阳市','七台河市','盘锦市','绥化市','铁岭市','黑河市','朝阳市','葫芦岛市','南京市',
             '杭州市','合肥市','福州市','南昌市','济南市','无锡市','宁波市','芜湖市','莆田市','赣州市','青岛市','徐州市','温州市','蚌埠市','泉州市','宜春市','淄博市','常州市',
             '绍兴市','淮南市','厦门市','吉安市','枣庄市','苏州市','湖州市','马鞍山市','漳州市','上饶市','东营市','南通市','嘉兴市','淮北市','龙岩市','抚州市','烟台市','连云港市',
             '金华市','铜陵市','三明市','九江市','潍坊市','淮安市','衢州市','安庆市','南平市','景德镇市','济宁市','盐城市','台州市','黄山市','宁德市','萍乡市','泰安市','扬州市',
             '丽水市','阜阳市','新余市','威海市','镇江市','舟山市','宿州市','鹰潭市','日照市','泰州市','滁州市','滨州市','宿迁市','六安市','德州市','宣城市','聊城市','池州市',
             '临沂市','亳州市','菏泽市','莱芜市','郑州市','武汉市','长沙市','开封市','黄石市','株洲市','洛阳市','十堰市','湘潭市','平顶山市','荆州市','衡阳市','安阳市','宜昌市',
             '邵阳市','鹤壁市','襄阳市','岳阳市','新乡市','鄂州市','张家界市','焦作市','荆门市','益阳市','濮阳市','黄冈市','常德市','许昌市','孝感市','娄底市','漯河市','咸宁市',
             '郴州市','三门峡市','随州市','永州市','商丘市','怀化市','周口市','驻马店市','南阳市','信阳市','广州市','南宁市','海口市','深圳市','柳州市','三亚市','珠海市','桂林市',
             '儋州市','汕头市','梧州市','三沙市','佛山市','北海市','韶关市','崇左市','湛江市','来宾市','肇庆市','贺州市','江门市','玉林市','茂名市','百色市','惠州市','河池市',
             '梅州市','钦州市','汕尾市','防城港市','河源市','贵港市','阳江市','清远市','东莞市','中山市','潮州市','揭阳市','云浮市','成都市','贵阳市','昆明市','拉萨市',
             '绵阳市','六盘水市','昭通市','昌都市','自贡市','遵义市','曲靖市','日喀则市','攀枝花市','铜仁市','玉溪市','林芝市','泸州市','毕节市','普洱市','德阳市','安顺市',
             '保山市','广元市','丽江市','遂宁市','临沧市','内江市','乐山市','资阳市','宜宾市','南充市','达州市','雅安市','广安市','巴中市','眉山市','西安市','兰州市','西宁市',
             '银川市','乌鲁木齐市','铜川市','嘉峪关市','海东市'   ,'石嘴山市','克拉玛依市','宝鸡市','金昌市','吴忠市','吐鲁番市','咸阳市','白银市','固原市','渭南市','天水市',
             '中卫市'  ,'汉中市','酒泉市','安康市','张掖市','商洛市','武威市','延安市','定西市','榆林市','陇南市','平凉市','庆阳市',
             # 直辖市 4个
             '北京市','上海市','天津市','重庆市',
             # 直辖市的区
             '北京市东城区','北京市西城区','北京市朝阳区','北京市丰台区','北京市石景山区','北京市海淀区','北京市门头沟区','北京市房山区','北京市通州区','北京市顺义区',
             '北京市昌平区','北京市大兴区','北京市怀柔区','北京市平谷区','北京市密云区','北京市延庆区','上海市黄浦区','上海市徐汇区','上海市长宁区','上海市静安区','上海市普陀区',
             '上海市虹口区','上海市杨浦区','上海市闵行区','上海市宝山区','上海市嘉定区','上海市浦东新区','上海市金山区','上海市松江区','上海市青浦区','上海市奉贤区','上海市崇明县',
             '天津市和平区','天津市河东区','天津市河西区','天津市南开区','天津市红桥区','天津市河北区','天津市东丽区','天津市西青区','天津市津南区','天津市北辰区','天津市武清区',
             '天津市宝坻区','天津市宁河区','天津市静海区','天津市滨海新区','天津市蓟县','重庆市渝中区','重庆市大渡口区','重庆市江北区','重庆市沙坪坝区','重庆市九龙坡区',
             '重庆市南岸区','重庆市北碚区','重庆市綦江区','重庆市大足区','重庆市渝北区','重庆市巴南区','重庆市万州区','重庆市涪陵区','重庆市黔江区','重庆市长寿区','重庆市合川区',
             '重庆市永川区','重庆市江津区','重庆市南川区'
])

city_loc_dict = {}

for x in citys:
    params = {
        'ak' : ak,
        'address': x
    }

    response = requests.get(url, params = params)

    soup1 = bs4.BeautifulSoup(response.text)
    loc = {}
    if soup1.location:
        loc['lng'] = soup1.location.lng.string
    else:
        loc['lng'] = ''
    if soup1.location:
        loc['lat'] = soup1.location.lat.string
    else:
        loc['lat'] = ''
    city_loc_dict[x] = loc

print city_loc_dict

with open('city_lat_lng_info.json', 'w') as f:
    json.dump(city_loc_dict, f)

我们可以打开json文件放入json.cn中进行查看:
这里写图片描述


2.下面的函数可以计算出两个经纬度之间距离。

如果给一个用户的城市地址和经纬度地址,我们可以根据城市地址得到一个经纬度地址。两个经纬度地址计算距离。如果距离在一个范围内(如30km),则可以判定为城市与经纬度地址一致。

from math import radians,sin,cos,asin,sqrt

# 计算两个经纬度的距离
def cal_dis(latitude1, longitude1,latitude2, longitude2):
    """
    :param latitude1:  地址一的经度
    :param longitude1: 地址一的维度
    :param latitude2:  地址二的经度
    :param longitude2: 地址二的维度
    :return:
    """
    lon1, lat1, lon2, lat2 = map(radians, [longitude1, latitude1, longitude2, latitude2])

    # haversine公式
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * asin(sqrt(a))
    r = 6371  # 地球平均半径,单位为公里
    return c * r

3.学习参考:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值