DELPHI调用百度定位API,根据IP获取城市及GPS信息等

缘由:因智能助理在用户说出“天气如何”时,需要自动获取城市,所以这里需要根据用户IP自动获取城市,所以有了这篇文章 QQ508882988

//根据百度API,根据来访IP自动获取出该IP所在的位置及更多信息,参数IP为空时,会使用当前访问者的IP地址作为定位参数

//sServerAK为用户密钥 string 必选,在lbs云官网注册的access key,作为访问的依据,定期从http://lbsyun.baidu.com/apiconsole/key获取

//参考http://lbsyun.baidu.com/index.php?title=webapi/ip-api#.E6.9C.8D.E5.8A.A1.E5.9C.B0.E5.9D.80

//function GetLocInfByIP_BaiDu(sIP, sServerAK: string): string;

uses SuperObject;

function GetLocInfByIP_BaiDu(sIP, sServerAK: string): string;

var sUrl, ak, sIPS, sR: string;

vJson, vj: ISuperObject;

response: TStringStream;

FHttp: TIdHTTP;

begin

sR := '';

ak := '9fe55cc6597c6b331754b19a048accd4';

if sIP <> '' then begin

sIPS := '&ip='+ sIP;

end else begin

sIPS := '';

end;

sUrl := 'http://api.map.baidu.com/location/ip?ak='+sServerAK + sIPS;

response := TStringStream.create('', tencoding.utf8);

FHttp := TIdHttp.Create(nil);

sR := FHttp.Post(sUrl, response);

FHttp.Free;

vJson := SO((sr));

//我这里只用到城市,所以如下取出,各位客官可自行根据情况获取

result := SO(SO(vJson.S['content']).S['address_detail']).S['city'];

end;

返回的结果json串形如下:

  {  
        address: "CN|北京|北京|None|CHINANET|1|None",   #地址  
        content:       #详细内容  
        {  
        address: "北京市",   #简要地址  
        address_detail:      #详细地址信息  
        {  
        city: "北京市",        #城市  
        city_code: 131,       #百度城市代码  
        district: "",           #区县  
        province: "北京市",   #省份  
        street: "",            #街道  
        street_number: ""    #门址  
        },  
        point:               #百度经纬度坐标值  
        {  
        x: "116.39564504",  
        y: "39.92998578"  
        }  
        },  
        status: 0     #返回状态码  
    }