文章目录

  • 1、简介
  • 2、百度
  • 3、高德
  • 4、google map
  • 5、nominatim
    • 5.1 overview
    • 5.2 web api
    • 5.3 python api (geopy)
  • 6、geocode
  • 7、geocoder
    • 7.1 arcgis通过地址查询经纬度
    • 7.2 arcgis通过经纬度查询地址
    • 7.3 osm通过地址查询经纬度
    • 7.4 osm通过经纬度查询地址
    • 7.5 mapbox通过地址查询经纬度
    • 7.6 mapbox通过经纬度查询地址
  • 8、其他
  • 后记

1、简介

地理编码 (Geocoding)是一个街道、地址或者其他位置(经度、纬度)转化为坐标的过程。反向地理编码 (Reverse geocoding)是将坐标转换为地址(经度、纬度)的过程。一组反向地理编码结果间可能会有所差异。例如:一个结果可能包含最临近建筑的完整街道地址,而另一个可能只包含城市名称和邮政编码。

2、百度

  • 拾取坐标系统
    https://api.map.baidu.com/lbsapi/getpoint/index.html
    1、支持地址 精确/模糊 查询;
    2、支持POI点坐标显示、复制;
    3、坐标鼠标跟随显示;
    4、 支持坐标查询(需要将坐标反查框勾选);

  • Geocoding API
    https://api.map.baidu.com/lbsapi/cloud/webservice-geocoding.htm

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

Geocoding API包括地址解析和逆地址解析功能。

  • 地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,且支持名胜古迹、标志性建筑名称直接解析返回百度经纬度。例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”,“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885”
  • 逆地理编码,即逆地址解析,由百度经纬度信息得到结构化地址信息。例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。

百度地图Geocoding API是一套免费对外开放的API,无使用次数限制。使用方法:

  • 第一步:申请ak(即获取密钥),若无百度账号则首先需要注册百度账号。
  • 第二步,拼写发送http请求的url,注意需使用第一步申请的ak。
  • 第三步,接收http请求返回的数据(支持json和xml格式)。
http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=E4805d16520de693a3fe707cdc9620
http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderReverse&location=39.983424,116.322987&output=json&pois=1
http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderReverse&location=39.983424,116.322987&output=xml&pois=1

这里通过编写Python脚本实现地理编码功能如下:

#***********************************************************************
#   Purpose:   基于geopy库实现geocoder功能
#   Author:    爱看书的小沐
#   Date:      2022-3-25
#   Languages: Python
#   Platform:  Python 3.9.7 win64
#   OS:        Win10 win64
# ***********************************************************************import requestsaddr="Harvard University"
key="your key"
url= f'http://api.map.baidu.com/geocoder?address={addr}&output=json&key={key}'
ret = requests.get(url).json()print("**************************************")
print("【address to latlon】:", ret)
print(ret['result']['location'])lng_lat=[121.498794,31.182546]
key="your key"
url=f"http://api.map.baidu.com/geocoder?callback=renderReverse&location={lng_lat[1]},{lng_lat[0]}&output=json&pois=1&key={key}"
ret = requests.get(url).json()
print("**************************************")
print("【latlon to address】:", ret)

3、高德

https://lbs.amap.com/demo/javascript-api/example/geocoder/geocoding

4、google map

https://developers.google.com/maps/documentation/javascript/geocoding

var geocoder;var map;function initialize() {geocoder = new google.maps.Geocoder();var latlng = new google.maps.LatLng(-34.397, 150.644);var mapOptions = {zoom: 8,center: latlng}map = new google.maps.Map(document.getElementById('map'), mapOptions);}function codeAddress() {var address = document.getElementById('address').value;geocoder.geocode( { 'address': address}, function(results, status) {if (status == 'OK') {map.setCenter(results[0].geometry.location);var marker = new google.maps.Marker({map: map,position: results[0].geometry.location});} else {alert('Geocode was not successful for the following reason: ' + status);}});}<body onload="initialize()"><div id="map" style="width: 320px; height: 480px;"></div><div><input id="address" type="textbox" value="Sydney, NSW"><input type="button" value="Encode" onclick="codeAddress()"></div>
</body>

Here is a typical example of retrieving a Lat & Lng from Google using Python,
things shouldn’t be this hard.

import requests
url = 'https://maps.googleapis.com/maps/api/geocode/json'
params = {'sensor': 'false', 'address': 'Mountain View, CA'}
resp = requests.get(url, params=params)
results = resp.json()['results']
location = results[0]['geometry']['location']
location['lat'], location['lng']
(37.3860517, -122.0838511)

5、nominatim

https://nominatim.org/

Nominatim:Open-source geocoding with OpenStreetMap data
Nominatim uses OpenStreetMap data to find locations on Earth by name and address (geocoding). It can also do the reverse, find an address for any location on the planet.

5.1 overview

  • Geocoding
    Find places by name or address (Geocoding):
    Nominatim can power the search box on your website, allowing your users to type free-form queries (“Cafe Paris, New York”) in any language. It also offers a structured query mode (“postcode=12345”, “city=London”, “type=cafe”) that helps you to automate geocoding of extensive address lists.
  • Reverse geocoding
    Look up addresses for a location (Reverse geocoding)
    Given a latitude and longitude anywhere on the planet, Nominatim can find the nearest address. It can do the same for any OSM object given its ID.

5.2 web api

https://nominatim.org/release-docs/develop/api/Overview/

Nominatim indexes named (or numbered) features within the OpenStreetMap (OSM) dataset and a subset of other unnamed features (pubs, hotels, churches, etc).

Nominatim API,Its API has the following endpoints for querying the data:

- /search - search OSM objects by name or type
- /reverse - search OSM object by their location
- /lookup - look up address details for OSM objects by their ID
- /status - query the status of the server
- /deletable - list objects that have been deleted in OSM but are held back in Nominatim in case the deletion was accidental
- /polygons - list of broken polygons detected by Nominatim
- /details - show internal details for an object (for debugging only)
http://localhost:8088/status.php
http://localhost:8088/search.php?q=Berlin
http://localhost:8088/reverse.php?lat=27.1750090510034&lon=78.04209025
  • search.php
#***********************************************************************
#   Purpose:   基于https访问search.php实现geocode功能
#   Author:    爱看书的小沐
#   Date:      2022-3-25
#   Languages: Python
#   Platform:  Python 3.9.7 win64
#   OS:        Win10 win64
# ***********************************************************************import requests
url = 'https://nominatim.openstreetmap.org/search.php?q=哈佛大学&format=jsonv2'
response = requests.get(url)
print(response.text)
# print(response.json())
print(type(response.status_code), response.status_code)
print(type(response.headers), response.headers)
print(type(response.cookies), response.cookies)
print(type(response.url), response.url)
print(type(response.history), response.history)# import requests
# url = 'https://nominatim.openstreetmap.org/search.php'
# params = {'q': '哈佛大学', 'format': 'jsonv2'}
# response = requests.get(url, params=params)
# print(response.text)
  • reverse.php
#***********************************************************************
#   Purpose:   基于https访问reverse.php实现反向geocode功能
#   Author:    爱看书的小沐
#   Date:      2022-3-25
#   Languages: Python
#   Platform:  Python 3.9.7 win64
#   OS:        Win10 win64
# ***********************************************************************import requests
url = 'https://nominatim.openstreetmap.org/reverse.php?lat=42.36790855&lon=-71.12678237443698&zoom=18&format=jsonv2'
response = requests.get(url)
print(response.text)
print(response.json())# import requests
# url = 'https://nominatim.openstreetmap.org/reverse.php'
# params = {'lat': '42.36790855', 'lon': '-71.12678237443698', 'format': 'jsonv2'}
# response = requests.get(url, params=params)
# print(response.text)

5.3 python api (geopy)

安装python的第三方库geopy,如下:

pip install geopy


这里通过编写Python脚本实现相关功能如下:

  • 地理编码(python)
#***********************************************************************
#   Purpose:   基于geopy库实现geocode功能
#   Author:    爱看书的小沐
#   Date:      2022-3-25
#   Languages: Python
#   Platform:  Python 3.9.7 win64
#   OS:        Win10 win64
# ***********************************************************************from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimitergeolocator = Nominatim(user_agent="test",timeout=None)
result = geolocator.geocode("Harvard University")
if result != None:print(result)print("latitude: ", result.latitude)print("longitude: ", result.longitude)print("address: ", result.address)print("altitude: ", result.altitude)print("point: ", result.point)
else:print("No data.")
  • 反向地理编码(python)
#***********************************************************************
#   Purpose:   基于geopy库实现geocode.reverse功能
#   Author:    爱看书的小沐
#   Date:      2022-3-25
#   Languages: Python
#   Platform:  Python 3.9.7 win64
#   OS:        Win10 win64
# ***********************************************************************from geopy.geocoders import Nominatimgeolocator = Nominatim(user_agent="test",timeout=None)
lat = 30.2768278
lon = 120.13663990955736
print('.....{}, {}........'.format(lat, lon))
result = geolocator.reverse([lat, lon])
if result != None:print(result)print("latitude: ", result.latitude)print("longitude: ", result.longitude)print("address: ", result.address)print("altitude: ", result.altitude)print("point: ", result.point)print("raw: ", result.raw)
else:print("No data.")

6、geocode

Many online providers such as Google & Bing have geocoding services,
these providers do not include Python libraries and have different
JSON responses between each other.

It can be very difficult sometimes to parse a particular geocoding provider
since each one of them have their own JSON schema.

https://geocode.maps.co/search?q={address}
https://geocode.maps.co/reverse?lat={latitude}&lon={longitude}

7、geocoder

Geocoder is a simple and consistent geocoding library.

https://pypi.org/project/geocoder/
https://geocoder.readthedocs.io/

安装如下python第三方库:

pip install geocoder

  • Providers
Provider Optimal Usage Policy Multiple results Reverse Proximity Batch
[ArcGIS][ArcGIS] World yes yes
[Baidu][Baidu] China API key yes
[Bing][Bing] World API key yes yes yes
[CanadaPost][CanadaPost] Canada API key yes
[FreeGeoIP][FreeGeoIP] World
[Gaode][Gaode] China API key yes
[Geocoder.ca][Geocoder.ca] (Geolytica) CA & US Rate Limit
[GeocodeFarm][GeocodeFarm] World [Policy][GeocodeFarm-Policy] yes yes
[GeoNames][GeoNames] World Username yes yes
[GeoOttawa][GeoOttawa] Ottawa yes
[Gisgraphy][Gisgraphy] World API key yes yes yes
[Google][Google] World Rate Limit, [Policy][G-Policy] yes yes yes
[HERE][HERE] World API key yes yes
[IPInfo][IPInfo] World Rate Limit, [Plans][IP-Plans]
[Komoot][Komoot] (OSM powered) World yes yes
[LocationIQ][LocationIQ] World API Key yes yes
[Mapbox][Mapbox] World API key yes yes yes
[MapQuest][MapQuest] World API key yes yes yes
[Mapzen][Mapzen] Shutdown API key yes yes
[MaxMind][MaxMind] World
[OpenCage][OpenCage] World API key yes yes
[OpenStreetMap][OpenStreetMap] World [Policy][OpenStreetMap-Policy] yes yes
[Tamu][Tamu] US API key
[TGOS][TGOS] Taiwan
[TomTom][TomTom] World API key yes
[USCensus][USCensus] US yes yes
[What3Words][What3Words] World API key yes
[Yahoo][Yahoo] World
[Yandex][Yandex] Russia yes yes

这里我们看看geocoder都有哪些接口,调试如下:

import geocoder
print(dir(geocoder))

运行结果如下:

[‘author’, ‘author_email’, ‘builtins’, ‘cached’,
copyright’, ‘doc’, ‘file’, ‘license’, ‘loader’,
name’, ‘package’, ‘path’, ‘spec’, ‘title’,
version’, ‘absolute_import’, ‘api’, ‘arcgis’, ‘arcgis_reverse’,
‘baidu’, ‘baidu_reverse’, ‘base’, ‘bing’, ‘bing_batch’,
‘bing_batch_forward’, ‘bing_batch_reverse’, ‘bing_reverse’,
‘canadapost’, ‘cli’, ‘distance’, ‘elevation’, ‘freegeoip’, ‘gaode’,
‘gaode_reverse’, ‘geocodefarm’, ‘geocodefarm_reverse’, ‘geolytica’,
‘geonames’, ‘geonames_children’, ‘geonames_details’,
‘geonames_hierarchy’, ‘get’, ‘gisgraphy’, ‘gisgraphy_reverse’,
‘google’, ‘google_elevation’, ‘google_places’, ‘google_reverse’,
‘google_timezone’, ‘here’, ‘here_reverse’, ‘ip’, ‘ipinfo’, ‘keys’,
‘komoot’, ‘komoot_reverse’, ‘location’, ‘locationiq’,
‘locationiq_reverse’, ‘mapbox’, ‘mapbox_reverse’, ‘mapquest’,
‘mapquest_batch’, ‘mapquest_reverse’, ‘mapzen’, ‘mapzen_reverse’,
‘maxmind’, ‘nokia’, ‘opencage’, ‘opencage_reverse’, ‘osm’,
‘osm_reverse’, ‘ottawa’, ‘places’, ‘reverse’, ‘tamu’, ‘tgos’,
‘timezone’, ‘tomtom’, ‘uscensus’, ‘uscensus_batch’,
‘uscensus_reverse’, ‘w3w’, ‘w3w_reverse’, ‘yahoo’, ‘yandex’,
‘yandex_reverse’]

7.1 arcgis通过地址查询经纬度

import geocoder
g = geocoder.arcgis('Harvard University')
print(g.latlng)
print(g.geojson)
print(g.json)
print(g.wkt)
print(g.osm)

7.2 arcgis通过经纬度查询地址

import geocoder
g = geocoder.arcgis([31.18698, 121.48482], method='reverse')
print(g.address)

7.3 osm通过地址查询经纬度

import geocoder
g = geocoder.osm('Harvard University')
print(g.osm)
#print(g.json)

7.4 osm通过经纬度查询地址

import geocoder
g = geocoder.osm([31.18698, 121.48482], method='reverse')
print(g.osm)
#print(g.json)

7.5 mapbox通过地址查询经纬度

import geocoder
latlng = [34, 114]
g = geocoder.mapbox("Harvard University", proximity=latlng, key='your key')
#print(g.json)
print(g.osm)

7.6 mapbox通过经纬度查询地址

import geocoder
latlng = [31.188118, 121.484889]
g = geocoder.mapbox(latlng, method='reverse', key='your key')
#print(g.json)
print(g.osm)

8、其他

百度地图——拾取坐标系统
网址:http://api.map.baidu.com/lbsapi/getpoint/index.html高德地图——高德开放平台
网址:https://lbs.amap.com/console/show/picker腾讯地图——坐标拾取器
网址:https://lbs.qq.com/tool/getpoint/arcgis
https://developers.arcgis.com/documentation/mapping-apis-and-services/search/tutorials/reverse-geocode/

后记

如果你觉得该方法或代码有一点点用处,可以给作者点个赞、赏杯咖啡;╮( ̄▽ ̄)╭
如果你感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进。o_O???
谢谢各位童鞋们啦( ´ ▽´ )ノ ( ´ ▽´)っ!!!

【GIS开发】地理编码服务Geocoder(Python)相关推荐

  1. 百度开放平台-地理编码服务

     地理编码服务 地理编码服务(又名Geocoder)是一类Web API接口服务: 正地理编码服务提供将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点(经纬度)功能: 地理编码服务当前 ...

  2. 基于Leaflet和高德Web API扩展地理编码服务

    需求背景: 需求很简单就是想调用高德地图的地理编码服务,单独扩展一个类出来. 参考地址: Leaflet类扩展:https://leafletjs.com/examples/extending/ext ...

  3. IOS开发地理编码与反向编码

    IOS开发地理编码与反向编码 #import <CoreLocation/CoreLocation.h> 选中项目导入相应的框架 // // LJReveceGeocoderViewCon ...

  4. 谷歌地图JavaScript API第3版 地理编码服务

    地理编码服务 概观 地理编码请求 地理编码响应 地理编码结果 地址组件类型 状态代码 反向地理编码 视口偏置 区码偏置 概观 地理编码地址(如"1600剧场百汇,山景,CA")转换 ...

  5. 百度地图Web服务API——正/逆地理编码服务

    正/逆地理编码服务(又名Geocoding API)是一类Web API接口服务: 正向地理编码服务提供将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点(经纬度)功能: 逆向地理编码服 ...

  6. Arcgis javascript那些事儿(十七)——地理编码服务的发布与使用

    一.引言 地理编码是按照主要是地理位置描述与地理坐标的相互转换,主要包括地理编码与反地理编码. 地理编码指的是根据地名获取位置信息: 反地理编码指的是根据位置信息获取地名: 这个的使用我们要根据需求来 ...

  7. android谷歌反地理,android – 谷歌地理编码服务是不可用的(协调地址)

    这个问题的常见答案是您必须重新启动设备. 当然你不能告诉你的用户重启设备以使你的应用程序运行,所以我的解决方案是使用HTTP回退,这是我在我的代码中使用的AsyncTask. 你必须根据你的情况修改它 ...

  8. 在infoWindow中显示Geocode server(地理编码服务)

    定义locator标签 <esri:Locatorid="locator" url="http://geocode.arcgis.com/arcgis/rest/s ...

  9. php 百度逆地理编码,百度地图开放平台 Web服务API --Geocoding API (地理编码和逆地理编码)...

    百度地图开放平台地理编码服务和逆地理编码服务的api文档地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geoco ...

最新文章

  1. hdu2489-DFS+最小生成树
  2. 机器学习中的逻辑回归
  3. 干货 | extern的用法解析
  4. Azkaban运行报错:我找到的几个错误问题
  5. java 线程池 wait,Java 多线程 之 wait等待 线程实例
  6. 海明码编码和校验原理与实现【转载】
  7. mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
  8. [补档]noip2019集训测试赛(九)
  9. 教你辨别Access用户级安全的两个密码
  10. 新手搭建网站服务器(Ubuntu+LAMP)
  11. c语言字符串反转栈,【C语言】利用栈将数组中字符串逆序
  12. 信号课组(一) 信号与系统 Review 1 信号与系统综述
  13. 问题解决:wireshark之npcap无法安装、winpcap无法安装问题解决
  14. vue 倒计时 插件_vue倒计时组件
  15. c# 调用巴斯勒相机 进行图像识别
  16. 实践课题选题管理(C语言)(选课系统)
  17. android 手机解锁声音,新奇玩法:教大家一个手机声控解锁的方法!识别率很高噢!...
  18. 虚幻引擎4总是遇到崩溃卡顿情况,这8个方法一定要试试
  19. AutoSAR系列讲解(深入篇)13.1-闪烁一颗LED灯 1
  20. ABAP术语-ALE

热门文章

  1. MATLAB设计FIR数字滤波器GUI界面
  2. *4-2 CCF 2014-12-2 Z字形扫描
  3. 什么是格局?如何提升自我格局?做到这一点就够了!
  4. 用Java编写CGI小结
  5. Leetcode动态规划部分典型题目分类及总结
  6. 项目八总结 数据库安全与维护
  7. JAVA:获取用户访问ip地址
  8. python怎么绘制渐变图_有没有一种使用Python生成渐变位图的简单方法?
  9. java让线程空转_详解Java编程中对线程的中断处理
  10. SSRF漏洞之常见Bypass篇