前言
客戶有一批數據,只有中文地址,想要在GIS上展示每個數據的位置。百度開發者網站查找了一下,找到了地理編碼服務可以解決問題。
地理編碼服務
地理編碼服務(又名Geocoder)是一類Web API接口服務;
地理編碼服務提供將結構化地址數據(如:北京市海淀區上地十街十號)轉換爲對應座標點(經緯度)功能;
地理編碼服務當前未推出國際化服務,解析地址僅限國內;
功能介紹
用戶可通過該功能,將結構化地址(省/市/區/街道/門牌號)解析爲對應的位置座標。地址結構越完整,地址內容越準確,解析的座標精度越高。
java代碼
直接執行main函數,當然除了java其他語言也很方便。
package geocoding;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
public class LatitudeUtils {
public static final String KEY_1 = "自己的AK";
public static Map getGeocoderLatitude(String address) {
BufferedReader in = null;
try {
// 將地址轉換成utf-8的16進制
address = URLEncoder.encode(address, "UTF-8");
URL tirc = new URL("http://api.map.baidu.com/geocoder/v2/?address=" + address + "&output=json&ak=" + KEY_1);
in = new BufferedReader(new InputStreamReader(tirc.openStream(), "UTF-8"));
String res;
StringBuilder sb = new StringBuilder("");
while ((res = in.readLine()) != null) {
sb.append(res.trim());
}
String str = sb.toString();
Map map = null;
if (StringUtils.isNotEmpty(str)) {
int lngStart = str.indexOf("lng\":");
int lngEnd = str.indexOf(",\"lat");
int latEnd = str.indexOf("},\"precise");
if (lngStart > 0 && lngEnd > 0 && latEnd > 0) {
String lng = str.substring(lngStart + 5, lngEnd);
String lat = str.substring(lngEnd + 7, latEnd);
map = new HashMap();
map.put("lng", lng);
map.put("lat", lat);
return map;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static void main(String[] args) {
Map map = getGeocoderLatitude("北京市海淀區上地十街十號");
System.out.println(map.get("lng")+","+map.get("lat"));
}
}