怎么样用Python实现地理编码

以物流行业为例,分析了 postgresql 与 greenplum 在地理位置信息处理,最佳路径算法,机器学习等方面的物流行业应用方法。其中提到了地址转换成坐标的问题,更专业些的名词应该是“地理编码”,即知道一个地址,如北京市海淀区上地十街10号,怎么样可以获取到对应的经纬度位置信息(40,116),或者反过来。

地理编码概念

很多地图相关的厂商都提供了相关的API,我们可以直接利用这些API得到这些信息。比如百度的Geocoding API。

Geocoding API是一类接口,用于提供从地址到经纬度坐标或者从经纬度坐标到地址的转换服务,用户可以使用C# 、C++、Java等开发语言发送请求且接收JSON、XML的返回数据。Geocoding API包括地址解析和逆地址解析功能:

t0128f824aa7ed65fdd.png

借用ESRI文档中更直观的一张图

立即学习“Python免费学习笔记(深入)”;

t0128f824aa7ed65fdd.png

地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”。同时,地理编码也支持名胜古迹、标志性建筑名称直接解析返回百度经纬度,例如:“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885” 。

逆地理编码:即逆地址解析,由百度经纬度信息得到结构化地址信息,例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。

不过,需要说明的一点是,若想使用百度的这套API的前提是,有百度账号并申请相应的Key。其实,除了百度之外,谷歌、ESRI、微软的Bing等都有类似的地理编码服务。不过这些服务大多没有专门针对Python的库并且彼此之间的Json结构也不一致。于是乎专治不服的Python大神做了一个专门的地理编码工具geocoder,将这些不同厂商的服务整合统一起来。

地理编码工具geocoder

首先看一下它都支持哪些公司的地理编码服务:

t0128f824aa7ed65fdd.png

安装

pip install geocoder

登录后复制

地理编码

import geocoderg = geocoder.google("1403 Washington Ave, New Orleans, LA 70130")g = geocoder.arcgis(u"北京市海淀区上地十街10号")g.latlng

登录后复制

输出为

[29.9287839, -90.08421849999999]

登录后复制

也可以查看完整的geojson

g.geojson

登录后复制

输出为

{'bbox': [-90.0855674802915,  29.9274349197085,  -90.0828695197085,  29.9301328802915], 'geometry': {'coordinates': [-90.08421849999999, 29.9287839],  'type': 'Point'}, 'properties': {'accuracy': u'ROOFTOP',  'address': u'1403 Washington Ave, New Orleans, LA 70130, USA',  'bbox': [-90.0855674802915,   29.9274349197085,   -90.0828695197085,   29.9301328802915],  'city': u'New Orleans',  'confidence': 9,  'country': u'US',  'county': u'Orleans Parish',  'encoding': 'utf-8',  'housenumber': u'1403',  'lat': 29.9287839,  'lng': -90.08421849999999,  'location': '1403 Washington Ave, New Orleans, LA 70130',  'neighborhood': u'Garden District',  'ok': True,  'place': u'ChIJGyFHWc2lIIYRYSoneaXAUiw',  'postal': u'70130',  'provider': 'google',  'quality': u'street_address',  'state': u'LA',  'status': 'OK',  'status_code': 200,  'street': u'Washington Ave'}, 'type': 'Feature'}

登录后复制

直接用Google尝试查询中文地址时失败

g = geocoder.google(u"北京市海淀区上地十街10号")g.ok

登录后复制

输出为

False

登录后复制

用百度应该没问题,不过我没有申请相应的key。切换到arcgis,能够成功编码

g = geocoder.arcgis(u"北京市海淀区上地十街10号")g.latlng

登录后复制

输出为

[40.050934, 116.30079]

登录后复制

逆地理编码

g = geocoder.google([29.9287839, -90.08421849999999], method='reverse')print g.addressprint g.cityprint g.stateprint g.country

登录后复制

输出为

1403 Washington Ave, New Orleans, LA 70115, USANew OrleansLAUS

登录后复制

换成中国的地址

g = geocoder.google([40.050934, 116.30079], method='reverse')print g.addressprint g.cityprint g.stateprint g.country

登录后复制

输出为

Bai Du Da Sha, Haidian Qu, Beijing Shi, China, 100193BeijingBeijing ShiCN

登录后复制

用arcgis的服务试试

g = geocoder.arcgis([40.050934, 116.30079], method='reverse')print g.addressprint g.cityprint g.stateprint g.country

登录后复制

输出为

None北京市北京市CHN

登录后复制

Google转换成的是英文,但地址比较全。arcgis虽然是中文,但是详细的地址居然输出为了None,这有个X用。

其他

geocoder 的功能不止于此,它还可以查IP(包括自己的)。

g = geocoder.ip('199.7.157.0')print g.latlngprint g.cityg = geocoder.ip('me')print g.latlngprint g.city

登录后复制

输出为

[43.6934, -79.4857]Toronto[51.05, 13.75]Dresden

登录后复制

查询一个城市的空间包围盒

g = geocoder.arcgis(u"山东")g.bbox

登录后复制

输出为

{'northeast': [38.976997, 121.976998], 'southwest': [33.022997, 116.022998]}

登录后复制

小结

空间信息既可以利用行政区划、自然地理区域等文本信息描述,也可以用坐标系统、数字(邮编等)来标识。利用地理编码技术,可以将空间信息的地理定位要素与相应的文本信息关联起来。本文主要介绍了geocoder地理编码这一小工具,可以方便快捷的利用地图等相关厂商提供的地理编码服务,将文字描述的位置转换成地图上的经纬度,或者通过地图上的某个位置坐标获得相应的位置信息文字描述。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2282794.html

(0)
上一篇 2025年2月27日 19:41:56
下一篇 2025年2月24日 18:19:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python-切片

    取一个list或者tuple的一部分是十分常见的操作。我们除了利用循环通过索引一个个获取元素外,python还为我们提供了方便的切片(slice)操作符:。 我们定义一个list,以供下面举例使用。 L = [‘apple&#8…

    编程技术 2025年2月27日
    200
  • Python 有序字典

    有序字典-OrderedDict简介 示例 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。参见下面的例子: import collectionsprint ‘Regular dictionary…

    编程技术 2025年2月27日
    200
  • Python linecache模块

    linecache 今天分享一个python的小模块: linecache, 可以用它方便地获取某一文件某一行的内容。而且它也被 traceback 模块用来获取相关源码信息来展示。用法很简单: >>> import li…

    编程技术 2025年2月27日
    200
  • Python 信号处理 signal 模块

    signal模块简介 最近在看linux signal 相关内容,signal可以被用来进程间通信和异步处理。python标准库提供了signal包可以用来处理信号相关。这里讨论的是unix系统中python的signal模块。 signa…

    编程技术 2025年2月27日
    200
  • Python中单线程、多线程和多进程的效率对比实验

    对比实验 资料显示,如果多线程的进程是cpu密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是io密集型,多线程进程可以利用io阻塞等待时的空闲时间执行其他线程,提升效率。所以我…

    2025年2月27日
    200
  • 一张图看懂Python Web高效开发

    一张图看懂Python Web高效开发,5秒看图,受益一生

    2025年2月27日
    200
  • python解析二维码

    由于需要对二维码图片进行解析,操作环境是centos7.2,python版本是2.7.5,由于zbar只支持到python2.6,所以准备采用源码编译安装的方式。具体步骤如下: 1、安装依赖包 yum install pdftk Image…

    2025年2月27日
    200
  • Python Scrapy爬虫:同步和异步分页的DEMO

    分页交互在请求数据时有同步和异步两种情况,同步时页面整体刷新,异步时页面局部刷新。对于这两种分页的数据在进行爬虫时,处理的方式是不一样的。 demo仅供学习,域名全部匿为test 同步分页 同步分页时,页面整体刷新,url地址栏会发生变化 …

    2025年2月27日
    200
  • python获取字母在字母表对应位置的几种方法及性能对比较

    python获取字母在字母表对应位置的几种方法及性能对比较 某些情况下要求我们查出字母在字母表中的顺序,A = 1,B = 2 , C = 3, 以此类推,比如这道题目 https://projecteuler.net/problem=42…

    编程技术 2025年2月27日
    200
  • Python 函数 类 语法糖

    Python 语法糖 ,换行连接 s = ”s += ‘a’ +      ‘b’ +      ‘c’n = 1 + 2 + 3# 6 登录后复制 while,for 循环外的 else 如果 while 循环正常结束(没有break退…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论