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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#语言,从百度地图反向地理编码api返回的json数据中提取信息相关的知识,希望对你有一定的参考价值。

renderReverse&&renderReverse("status":0,"result":"location":"lng":118.24691803795,"lat":35.502509941703,"formatted_address":"山东省临沂市沂南县","business":"","addressComponent":"city":"临沂市","country":"中国","direction":"","distance":"","district":"沂南县","province":"山东省","street":"","street_number":"","country_code":0,"pois":["addr":"临沂市沂南县","cp":"NavInfo","direction":"东南","distance":"830","name":"安乐庄村","poiType":"行政地标","point":"x":118.24266069864,"y":35.507519566229可能是电话号码,是否拨号?,"tag":"行政地标;村庄","tel":"","uid":"251374c990ccfe3ea01de9a9","zip":""],"poiRegions":[],"sematic_description":"安乐庄村东南830米","cityCode":234)

如上是返回的一次json数据,C# 语言,怎么提取特定的值,比如从"district":"沂南县"中提取城市名,沂南县,怎么处理

安装json.net控件,并using Newtonsoft.Json.Linq;
这样就可以获取想要的tag对应的内容了。
string text = "renderReverse&&renderReverse(\"status\":0,\"result\":\"location\":\"lng\":116.32298703399,\"lat\":39.983424051248,\"formatted_address\":\"北京市海淀区中关村大街27号1101-08室\",\"business\":\"中关村,人民大学,苏州街\",\"addressComponent\":\"city\":\"北京市\",\"country\":\"中国\",\"direction\":\"附近\",\"distance\":\"7\",\"district\":\"海淀区\",\"province\":\"北京市\",\"street\":\"中关村大街\",\"street_number\":\"27号1101-08室\",\"country_code\":0,\"pois\":[\"addr\":\"北京北京海淀海淀区中关村大街27号(地铁海淀黄庄站A1\",\"cp\":\"NavInfo\",\"direction\":\"内\",\"distance\":\"0\",\"name\":\"北京远景国际公寓(中关村店)\",\"poiType\":\"房地产\",\"point\":\"x\":116.3229458916,\"y\":39.983610361549,\"tag\":\"房地产\",\"tel\":\"\",\"uid\":\"35a08504cb51b1138733049d\",\"zip\":\"\",\"addr\":\"海淀区中关村北大街27号\",\"cp\":\"NavInfo\",\"direction\":\"附近\",\"distance\":\"25\",\"name\":\"中关村大厦\",\"poiType\":\"房地产\",\"point\":\"x\":116.32285606105,\"y\":39.983568897877,\"tag\":\"房地产;写字楼\",\"tel\":\"\",\"uid\":\"06d2dffdaef1b7ef88f15d04\",\"zip\":\"\",\"addr\":\"中关村大街29\",\"cp\":\"NavInfo\",\"direction\":\"北\",\"distance\":\"62\",\"name\":\"海淀医院激光整形美容部\",\"poiType\":\"医疗\",\"point\":\"x\":116.32317046798,\"y\":39.983016046485,\"tag\":\"医疗;专科医院\",\"tel\":\"\",\"uid\":\"b1c556e81f27cb71b4265502\",\"zip\":\"\",\"addr\":\"中关村大街27号中关村大厦1层\",\"cp\":\"NavInfo\",\"direction\":\"附近\",\"distance\":\"1\",\"name\":\"中国人民财产保险中关村营业部\",\"poiType\":\"金融\",\"point\":\"x\":116.32298182382,\"y\":39.983416864194,\"tag\":\"金融;投资理财\",\"tel\":\"\",\"uid\":\"060f5e53137d20d7081cc779\",\"zip\":\"\",\"addr\":\"北京市海淀区\",\"cp\":\"NavInfo\",\"direction\":\"东北\",\"distance\":\"58\",\"name\":\"北京市海淀医院-输血科\",\"poiType\":\"医疗\",\"point\":\"x\":116.322685383,\"y\":39.983092063819,\"tag\":\"医疗;其他\",\"tel\":\"\",\"uid\":\"cf405905b6d82eb9b55f1e89\",\"zip\":\"\",\"addr\":\"北京市海淀区中关村大街27号中关村大厦二层\",\"cp\":\"NavInfo\",\"direction\":\"附近\",\"distance\":\"0\",\"name\":\"眉州东坡酒楼(中关村店)\",\"poiType\":\"美食\",\"point\":\"x\":116.32298182382,\"y\":39.983423774823,\"tag\":\"美食\",\"tel\":\"\",\"uid\":\"2c0bd6c57dbdd3b342ab9a8c\",\"zip\":\"\",\"addr\":\"北京市海淀区中关村大街29号(海淀黄庄路口)\",\"cp\":\"NavInfo\",\"direction\":\"东北\",\"distance\":\"223\",\"name\":\"海淀医院\",\"poiType\":\"医疗\",\"point\":\"x\":116.32199368776,\"y\":39.982083099537,\"tag\":\"医疗;综合医院\",\"tel\":\"\",\"uid\":\"fa01e9371a040053774ff1ca\",\"zip\":\"\",\"addr\":\"北京市海淀区中关村大街28号\",\"cp\":\"NavInfo\",\"direction\":\"西北\",\"distance\":\"229\",\"name\":\"海淀剧院\",\"poiType\":\"休闲娱乐\",\"point\":\"x\":116.32476945179,\"y\":39.982622137118,\"tag\":\"休闲娱乐;电影院\",\"tel\":\"\",\"uid\":\"edd64ce1a6d799913ee231b3\",\"zip\":\"\",\"addr\":\"海淀黄庄地铁站旁\",\"cp\":\"NavInfo\",\"direction\":\"西北\",\"distance\":\"375\",\"name\":\"中发电子市场(中关村大街)\",\"poiType\":\"购物\",\"point\":\"x\":116.32529945204,\"y\":39.981537146849,\"tag\":\"购物;家电数码\",\"tel\":\"\",\"uid\":\"69130523db34c811725e8047\",\"zip\":\"\",\"addr\":\"北京市海淀区知春路128号\",\"cp\":\"NavInfo\",\"direction\":\"西北\",\"distance\":\"434\",\"name\":\"泛亚大厦\",\"poiType\":\"房地产\",\"point\":\"x\":116.32600013033,\"y\":39.981516414381,\"tag\":\"房地产;写字楼\",\"tel\":\"\",\"uid\":\"d24e48ebb9991cc9afee7ade\",\"zip\":\"\"],\"poiRegions\":[],\"sematic_description\":\"北京远景国际公寓(中关村店)内0米\",\"cityCode\":131)";
//只保留Json内容
text = text.Remove(text.Length - 1).Remove(0, 29);
JObject jo = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(text);
//获取指定TAG的内容
MessageBox.Show(jo["result"]["addressComponent"]["district"].ToString());
参考技术A 安装json.net控件,并using Newtonsoft.Json.Linq;
这样你就可以获取你想要的tag对应的内容了。
string text = "renderReverse&&renderReverse(\"status\":0,\"result\":\"location\":\"lng\":116.32298703399,\"lat\":39.983424051248,\"formatted_address\":\"北京市海淀区中关村大街27号1101-08室\",\"business\":\"中关村,人民大学,苏州街\",\"addressComponent\":\"city\":\"北京市\",\"country\":\"中国\",\"direction\":\"附近\",\"distance\":\"7\",\"district\":\"海淀区\",\"province\":\"北京市\",\"street\":\"中关村大街\",\"street_number\":\"27号1101-08室\",\"country_code\":0,\"pois\":[\"addr\":\"北京北京海淀海淀区中关村大街27号(地铁海淀黄庄站A1\",\"cp\":\"NavInfo\",\"direction\":\"内\",\"distance\":\"0\",\"name\":\"北京远景国际公寓(中关村店)\",\"poiType\":\"房地产\",\"point\":\"x\":116.3229458916,\"y\":39.983610361549,\"tag\":\"房地产\",\"tel\":\"\",\"uid\":\"35a08504cb51b1138733049d\",\"zip\":\"\",\"addr\":\"海淀区中关村北大街27号\",\"cp\":\"NavInfo\",\"direction\":\"附近\",\"distance\":\"25\",\"name\":\"中关村大厦\",\"poiType\":\"房地产\",\"point\":\"x\":116.32285606105,\"y\":39.983568897877,\"tag\":\"房地产;写字楼\",\"tel\":\"\",\"uid\":\"06d2dffdaef1b7ef88f15d04\",\"zip\":\"\",\"addr\":\"中关村大街29\",\"cp\":\"NavInfo\",\"direction\":\"北\",\"distance\":\"62\",\"name\":\"海淀医院激光整形美容部\",\"poiType\":\"医疗\",\"point\":\"x\":116.32317046798,\"y\":39.983016046485,\"tag\":\"医疗;专科医院\",\"tel\":\"\",\"uid\":\"b1c556e81f27cb71b4265502\",\"zip\":\"\",\"addr\":\"中关村大街27号中关村大厦1层\",\"cp\":\"NavInfo\",\"direction\":\"附近\",\"distance\":\"1\",\"name\":\"中国人民财产保险中关村营业部\",\"poiType\":\"金融\",\"point\":\"x\":116.32298182382,\"y\":39.983416864194,\"tag\":\"金融;投资理财\",\"tel\":\"\",\"uid\":\"060f5e53137d20d7081cc779\",\"zip\":\"\",\"addr\":\"北京市海淀区\",\"cp\":\"NavInfo\",\"direction\":\"东北\",\"distance\":\"58\",\"name\":\"北京市海淀医院-输血科\",\"poiType\":\"医疗\",\"point\":\"x\":116.322685383,\"y\":39.983092063819,\"tag\":\"医疗;其他\",\"tel\":\"\",\"uid\":\"cf405905b6d82eb9b55f1e89\",\"zip\":\"\",\"addr\":\"北京市海淀区中关村大街27号中关村大厦二层\",\"cp\":\"NavInfo\",\"direction\":\"附近\",\"distance\":\"0\",\"name\":\"眉州东坡酒楼(中关村店)\",\"poiType\":\"美食\",\"point\":\"x\":116.32298182382,\"y\":39.983423774823,\"tag\":\"美食\",\"tel\":\"\",\"uid\":\"2c0bd6c57dbdd3b342ab9a8c\",\"zip\":\"\",\"addr\":\"北京市海淀区中关村大街29号(海淀黄庄路口)\",\"cp\":\"NavInfo\",\"direction\":\"东北\",\"distance\":\"223\",\"name\":\"海淀医院\",\"poiType\":\"医疗\",\"point\":\"x\":116.32199368776,\"y\":39.982083099537,\"tag\":\"医疗;综合医院\",\"tel\":\"\",\"uid\":\"fa01e9371a040053774ff1ca\",\"zip\":\"\",\"addr\":\"北京市海淀区中关村大街28号\",\"cp\":\"NavInfo\",\"direction\":\"西北\",\"distance\":\"229\",\"name\":\"海淀剧院\",\"poiType\":\"休闲娱乐\",\"point\":\"x\":116.32476945179,\"y\":39.982622137118,\"tag\":\"休闲娱乐;电影院\",\"tel\":\"\",\"uid\":\"edd64ce1a6d799913ee231b3\",\"zip\":\"\",\"addr\":\"海淀黄庄地铁站旁\",\"cp\":\"NavInfo\",\"direction\":\"西北\",\"distance\":\"375\",\"name\":\"中发电子市场(中关村大街)\",\"poiType\":\"购物\",\"point\":\"x\":116.32529945204,\"y\":39.981537146849,\"tag\":\"购物;家电数码\",\"tel\":\"\",\"uid\":\"69130523db34c811725e8047\",\"zip\":\"\",\"addr\":\"北京市海淀区知春路128号\",\"cp\":\"NavInfo\",\"direction\":\"西北\",\"distance\":\"434\",\"name\":\"泛亚大厦\",\"poiType\":\"房地产\",\"point\":\"x\":116.32600013033,\"y\":39.981516414381,\"tag\":\"房地产;写字楼\",\"tel\":\"\",\"uid\":\"d24e48ebb9991cc9afee7ade\",\"zip\":\"\"],\"poiRegions\":[],\"sematic_description\":\"北京远景国际公寓(中关村店)内0米\",\"cityCode\":131)";
//只保留Json内容
text = text.Remove(text.Length - 1).Remove(0, 29);
JObject jo = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(text);
//获取指定TAG的内容
MessageBox.Show(jo["result"]["addressComponent"]["district"].ToString());本回答被提问者采纳

百度地图API调用

百度地图API调用

这次主要用到的是地理编码服务

1. 什么是地理编码服务

1.1 介绍

地理编码服务(又名Geocoder)是一类Web API接口服务;

地理编码服务提供将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点(经纬度)功能;

地理编码服务当前未推出国际化服务,解析地址仅限国内;

白话说就是把一个地点的经度和纬度返回

1.2 功能介绍

用户可通过该功能,将结构化地址(省/市/区/街道/门牌号)解析为对应的位置坐标。地址结构越完整,地址内容越准确,解析的坐标精度越高。

lng: 经度 lat: 纬度

2. 使用流程

2.1 注册开发者

http://lbsyun.baidu.com/apiconsole/center

填写完信息后, 邮箱会收到一条激活开发者的邮件, 点击激活即可.

2.2 创建应用

http://lbsyun.baidu.com/apiconsole/key#/home

应用名称可以随便填写, 请求校验方式为IP白名单校验/当然你也可以用sn校验方式, 但是sn后面还要写代码获取sn

所以这里我就省事用ip白名单校验. 0.0.0.0/0 代表任何ip都可以访问.

2.3 阅读官方文档

http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

http://api.map.baidu.com/geocoding/v3/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation

注意: 网上很多教程都是老版本的接口了, 老用户可以使用但是新用户不可以, 所以这一点一定要注意一下.

具体参数, 返回值, 以及状态码我就不一一介绍了, 详情请看官方文档.

2.4 实例代码

如果你已经是一个经常写接口的老司机了, 那么这段话你可以选择不看, 主要是大致讲解一些关于接口的一些白话.

首先这个接口的作用是返回一个地点的经纬度, 那么这个经纬度的查询是谁做的呢? 就是这个接口做的事. 你可以

把接口想象成一个人, 这个人只会最一件事, 那就是你告诉他一个地点,他告诉你这个地点的经纬度. 具体这个人是

怎么实现的, 这你就不需要考虑了.

# 只需要把 ak=你创建应用的ak 改为你自己应用的ak就行了 

import requests
import json
import re

# 获取用户输入的地点
region = input(\'请输入你要查询的地点:\').strip()
# api接口
url = f\'http://api.map.baidu.com/geocoding/v3/?address={region}&output=json&ak=你创建应用的ak&callback=showLocation\'
# 发送get请求
response = requests.get(url=url)
# 解析数据
result = re.findall(r\'showLocation&&showLocation\\((.*?)\\)\', response.text,re.S)[0]
data = json.loads(result)
# 获取 经度 纬度  
lng = data[\'result\'][\'location\'][\'lng\']
lat = data[\'result\'][\'location\'][\'lat\']
level = data[\'result\'][\'level\']
print(\'{} 经度:{} 纬度:{} 行业:{}\'.format(region, lng, lat, level))

查看应用ak

如果返回的状态码为 240 建议重新创建一个应用即可

3.补充

3.1 sn校验

如果有朋友选择了sn检验方式 就需要查看一下sn的校验方法

官方文档: http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix

这时你不但需要 ak 还需要 sk

请求的url是:

http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
//后面的sn就是要计算的,sk不需要在url里出现,但是在计算sn的时候需要sk(假设sk=yoursk) 下面提供java、PHP、C#、python 2.7的参考代码。

3.2 计算sn

看到这里你肯定会说我pycharm都打开了,你给我看python2.7 ?

python 2.7参考代码如下:

# -*- coding: utf-8 -*- 
# 第一行必须有,否则报中文字符非ascii码错误
import urllib
import hashlib

# 以get请求为例http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak
queryStr = \'/geocoder/v2/?address=百度大厦&output=json&ak=yourak\'

# 对queryStr进行转码,safe内的保留字符不转换
encodedStr = urllib.quote(queryStr, safe="/:=&?#+!$,;\'@()*[]")

# 在最后直接追加上yoursk
rawStr = encodedStr + \'yoursk\'

# md5计算出的sn值7de5a22212ffaa9e326444c75a58f9a0
# 最终合法请求url是http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
print hashlib.md5(urllib.quote_plus(rawStr)).hexdigest()

还好我准备了python3的实例代码:

# -*- coding: utf-8 -*-
# 第一行必须有,否则报中文字符非ascii码错误
import urllib.request, urllib.parse, urllib.error
import hashlib

# 以get请求为例http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak
queryStr = \'/geocoder/v2/?address=百度大厦&output=json&ak=你的ak\'

# 对queryStr进行转码,safe内的保留字符不转换
encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;\'@()*[]")

# 在最后直接追加上yoursk
rawStr = encodedStr + \'你的sk\'

# md5计算出的sn值7de5a22212ffaa9e326444c75a58f9a0
# 最终合法请求url是http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
print(hashlib.md5(urllib.parse.quote_plus(rawStr).encode()).hexdigest())

ok到这里就结束了, 只需要那把 url 改为你的 url 即可

3.3 关与py2转py3

不知道你好奇不好奇我是怎么将py2的代码转成py3的, 实际上很多官方文档里面的示例代码还是python2.X代码,

当然有的也能直接在python3上运行, 但是为了保证万无一失, 最好还是转成python3

这里采用的是python3自带的一个内置模块2to3.py

上教程:

  1. 切换到你的python安装路径下找到 Tools/scripts/2to3.py

  2. 复制2to3.py到你需要转换代码的同目录下

    如: 这里我想把demo.py中的py2代码转换成python3代码

  1. 命令行/pycharm的Terminal 切换到这两个文件的路径下

  2. 执行命令 python 2to3.py -w demo.py 即可

  3. 新生成一个文件

这时 demo.py中代码就是python3的代码了, demo.py.bak是原python2代码的文件

以上是关于C#语言,从百度地图反向地理编码api返回的json数据中提取信息的主要内容,如果未能解决你的问题,请参考以下文章

百度地图API调用

反向地理编码不返回邮政编码

我可以从 HERE 的反向地理编码 API 调整返回的地址标签吗?

谷歌地图反向地理编码不返回正确/准确的地址

使用 iPhone 的纬度和经度进行反向地理编码

Java百度地图高德地图ArcGIS地图逆地理编码