地址解析:将地址转化为地理坐标过程,
可以用Google的API,但是这个有一定次数限制,具体可以查选google map官方说明。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class GoogleGeocoder { public static final String OUTPUT_JSON="json"; public static final String OUTPUT_XML="xml"; public static final String OUTPUT_KML="kml"; public static final String OUTPUT_CSV="csv"; static String url = "http://ditu.google.cn/maps/geo?sensor=false&oe=utf8&q="; public static String parseAddress(String admin,String query,String outputType) throws IOException{ String queryURL = url + admin+query+"&output="+outputType; URL myURL = null; URLConnection httpsConn = null; try { myURL = new URL(queryURL); } catch (MalformedURLException e) { e.printStackTrace(); throw e; } StringBuilder sb = new StringBuilder(4*4096); httpsConn = (URLConnection) myURL.openConnection(); InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8"); BufferedReader br = new BufferedReader(insr); String data = null; while ((data = br.readLine()) != null) { sb.append(data); if(sb.length()>=4*4096) break; } httpsConn.close(); return sb.toString(); } public static void main(String argv[]) { try { String xml= parseAddress("中国,北京市,","人民大学",OUTPUT_XML); System.out.println(xml); } catch (IOException e) { e.printStackTrace(); } } }
返回结果为XML(等价于KML),也可以改为JSON或者CSV。
上面是用请求输出按照UTF-8格式输出,然后用UTF-8格式读取输出流。
<?xml version="1.0" encoding="UTF-8" ?><kml xmlns="http://earth.google.com/kml/2.0"><Response> <name>中国,北京市,人民大学</name> <Status> <code>200</code> <request>geocode</request> </Status> <Placemark id="p1"> <address>中国北京市海淀区中关村大街59号中国人民大学</address> <AddressDetails Accuracy="9" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><AdministrativeArea><AdministrativeAreaName>北京市</AdministrativeAreaName><Locality><LocalityName>北京市</LocalityName><DependentLocality><DependentLocalityName>海淀区</DependentLocalityName><Thoroughfare><ThoroughfareName>中关村大街59号中国人民大学</ThoroughfareName></Thoroughfare><AddressLine>中国人民大学</AddressLine></DependentLocality></Locality></AdministrativeArea></Country></AddressDetails> <ExtendedData> <LatLonBox north="39.9795316" south="39.9624293" east="116.3301154" west="116.2981006" /> </ExtendedData> <Point><coordinates>116.3141080,39.9709810,0</coordinates></Point> </Placemark></Response></kml>
如果需要高效的解析方式,最好在查询参数中指定BOUNDER 即地图的左下和右上坐标。