普通IP定位是一套以HTTP/HTTPS形式提供的轻量级定位接口,用户可以通过该服务,根据IP定位来获取大致位置。
目前该服务同时支持 IPv4 和 IPv6 来获取位置信息。
利用IP获取大致位置,调用API接口,返回请求参数中指定上网IP的大致位置信息(一般为城市级别),位置信息包括:经纬度、省、市等地址信息。
如果请求参数中未指定上网IP,则默认返回当前服务请求来源的IP所对应的大致位置信息。
该服务所返回的经纬度信息只是一个大概的位置,一般为城市中心点。
适用于对定位精度要求不高的IP请求定位的应用。
如果您的应用为Android Native App,建议使用Android定位SDK,定位效果最佳,精度可达到10m,且无任何使用配额及并发量的限制。
参数名称 |
参数含义 |
类型 |
备注 |
ip |
用户上网的IP地址,请求中如果不出现或为空,会针对发来请求的IP进行定位。如您需要通过IPv6来获取位置信息,请提交工单申请。 |
string |
可选 |
ak |
开发者密钥,可在API控制台申请获得 |
string |
必填 |
sn |
若用户所用AK的校验方式为SN校验时该参数必填(什么是SN校验?)。其他AK校验方式的可不填写 |
string |
可选 |
coor |
设置返回位置信息中,经纬度的坐标类型,分别如下: coor不出现、或为空:百度墨卡托坐标,即百度米制坐标 coor = bd09ll:百度经纬度坐标,在国测局坐标基础上二次加密而来 coor = gcj02:国测局02坐标,在原始GPS坐标基础上,按照国家测绘行业统一要求,加密后的坐标
百度地图的坐标类型为bd09ll,如果结合百度地图使用,请注意坐标选择 |
string |
可选 |
结果字段 | 字段含义 | 类型 |
address | 详细地址信息 | string |
content | address | 简要地址信息 |
address_detail | city | 城市 |
city_code | 百度城市代码 |
province | 省份 |
point | x | 当前城市中心点经度 |
y | 当前城市中心点纬度 |
status | 结果状态返回码,请参考后面的介绍 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
address: "CN|北京|北京|None|CHINANET|1|None", #详细地址信息
content: #结构信息
{
address: "北京市", #简要地址信息
address_detail: #结构化地址信息
{
city: "北京市", #城市
city_code: 131, #百度城市代码
province: "北京市", #省份
},
point: #当前城市中心点
{
x: "116.39564504", #当前城市中心点经度
y: "39.92998578" #当前城市中心点纬度
}
},
status: 0 #结果状态返回码
}
|
状态码 |
定义 |
注释 |
0 |
正常 |
|
1 |
服务器内部错误 |
该服务响应超时或系统内部错误 |
10 |
上传内容超过8M |
Post上传数据不能超过8M |
101 |
AK参数不存在 |
请求消息没有携带AK参数 |
102 |
Mcode参数不存在,mobile类型mcode参数必需 |
对于Mobile类型的应用请求需要携带mcode参数,该错误码代表服务器没有解析到mcode |
200 |
APP不存在,AK有误请检查再重试 |
根据请求的AK,找不到对应的APP |
201 |
APP被用户自己禁用,请在控制台解禁 |
|
202 |
APP被管理员删除 |
恶意APP被管理员删除 |
203 |
APP类型错误 |
当前API控制台支持Server(类型1), Mobile(类型2, 新版控制台区分为Mobile_Android(类型21)及Mobile_IPhone(类型22)及Browser(类型3),除此之外的其他类型被认为是APP类型错误 |
210 |
APP IP校验失败 |
在申请Server类型应用的时候选择IP校验,需要填写IP白名单,如果当前请求的IP地址不在IP白名单或者不是0.0.0.0/0就认为IP校验失败 |
211 |
APP SN校验失败 |
SERVER类型APP有两种校验方式:IP校验和SN校验,当用户请求的SN和服务端计算出来的SN不相等的时候,提示SN校验失败 |
220 |
APP Referer校验失败 |
浏览器类型的APP会校验referer字段是否存在,且在referer白名单里面,否则返回该错误码 |
230 |
APP Mcode码校验失败 |
服务器能解析到mcode,但和数据库中不一致,请携带正确的mcode |
240 |
APP 服务被禁用 |
用户在API控制台中创建或设置某APP的时候禁用了某项服务 |
250 |
用户不存在 |
根据请求的user_id, 数据库中找不到该用户的信息,请携带正确的user_id |
251 |
用户被自己删除 |
该用户处于未激活状态 |
252 |
用户被管理员删除 |
恶意用户被加入黑名单 |
260 |
服务不存在 |
服务器解析不到用户请求的服务名称 |
261 |
服务被禁用 |
该服务已下线 |
301 |
永久配额超限,限制访问 |
配额超限 |
302 |
天配额超限,限制访问 |
配额超限 |
401 |
当前并发量已经超过约定并发配额,限制访问 |
并发控制超限,请控制并发量 |
402 |
当前并发量已经超过约定并发配额,并且服务总并发量也已经超过设定的总并发配额,限制访问 |
并发控制超限,请控制并发量 |
1001 |
没有IPv6地址访问的权限 |
如需通过IPv6来获取位置信息,请提交工单申请 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private Thread located_dataget = new Thread() {
@Override
public void run() {
link = "https://api.map.baidu.com/location/ip?ak=自己的ak&ip="+dev_ip+"&coor=bd09ll";
located_result = GData.requestGet(link);
handler_located.postDelayed(located_datashow,1000);
}
};
private Runnable located_datashow = new Runnable() {
@Override
public void run() {
if(located_result!=null){
//解析返回的json数据
}
}
};
private Runnable start = new Runnable() {
@Override
public void run() {
located_dataget.start();
}
};
|
◎ 浏览器访问返回结果
1
2
3
4
5
6
7
8
9
10
11
|
try{
JSONObject jsonObject1 = new JSONObject(located_result);
String data1 = jsonObject1.getString("content");
JSONObject jsonObject2 = new JSONObject(data1);
String data2 = jsonObject2.getString("point");
JSONObject jsonObject3 = new JSONObject(data2);
latitude = jsonObject3.getString("y");
longitude = jsonObject3.getString("x");
}catch (Exception e){
e.printStackTrace();
}
|
参考百度地图开发之全球逆地理编码
◎ 浏览器访问返回结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
public class Device_location_ip extends AppCompatActivity {
private boolean isFirstLocate=true;
private MapView mapView;
private BaiduMap baiduMap;
String link,result;
private Handler handler = new Handler();
private String latitude,longitude;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//隐藏手机顶部状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.device_location_ip);
Intent intent = getIntent();
latitude = intent.getStringExtra("latitude");
longitude = intent.getStringExtra("longitude");
//获取控件MapView,先显示百度地图
mapView = (MapView) findViewById(R.id.mapview);
baiduMap = mapView.getMap();
//允许在地图上显示我的位置
baiduMap.setMyLocationEnabled(true);
navigateTo(Double.parseDouble(latitude),Double.parseDouble(longitude));
handler.post(start);、
}
//对传入的经纬度参数进行处理,并在地图上显示出来
private void navigateTo(double laititude,double longitude) {
if (isFirstLocate) {
//Toast.makeText(this, "nav to " + location.getAddrStr(), Toast.LENGTH_SHORT).show();
LatLng ll = new LatLng(laititude, longitude);
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);
baiduMap.animateMapStatus(update);
isFirstLocate = false;
}
//在地图上显示我的位置
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(laititude);
locationBuilder.longitude(longitude);
MyLocationData locationData = locationBuilder.build();
baiduMap.setMyLocationData(locationData);
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
}
private Thread dataget = new Thread() {
@Override
public void run() {
link = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=your's ak&output=json&coordtype=wgs84ll&location=latitude,longitude";
result = GData.requestGet(link);
handler.postDelayed(datashow,1000);
}
};
private Runnable datashow = new Runnable() {
@Override
public void run() {
if(result!=null){
Log.d("link",link);
Log.d("result:", result);
try{
JSONObject jsonObject1 = new JSONObject(result);
String data1 = jsonObject1.getString("result");
JSONObject jsonObject2 = new JSONObject(data1);
}catch (Exception e){
e.printStackTrace();
}
}
}
};
private Runnable start = new Runnable() {
@Override
public void run() {
dataget.start();
}
};
}
|
◎ 效果