地区经纬度信息获取利用Google地图API获取.docx
《地区经纬度信息获取利用Google地图API获取.docx》由会员分享,可在线阅读,更多相关《地区经纬度信息获取利用Google地图API获取.docx(33页珍藏版)》请在冰豆网上搜索。
地区经纬度信息获取利用Google地图API获取
地区经纬度信息获取(利用Google地图API获取)
packagecom.leg3s.rld.util;
importjava.io.BufferedReader;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
importjava.io.UnsupportedEncodingException;
import.HttpURLConnection;
import.URL;
import.URLConnection;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importjava.util.Map.Entry;
importorg.apache.log4j.Logger;
/**
*地址经纬度信息获取工具类
*
*@authorliuw
*@createdate2010/01/18
*/
publicclassAddressLatLngUtil
{
privatestaticfinalStringREQUEST_ENCODE="UTF-8";
privatestaticfinalStringADDRESS_KEY="\"address\"";
privatestaticfinalStringADDRESS_COUNTRY_KEY="\"CountryName\"";
privatestaticfinalStringADDRESS_REGION_KEY="\"AdministrativeAreaName\"";
privatestaticfinalStringADDRESS_CITY_KEY="\"LocalityName\"";
privatestaticfinalStringADDRESS_POINT_KEY="\"coordinates\"";
privatestaticfinalStringADDRESS_SPLIT_STR=":
";
privatestaticfinalStringLOCATION_COUNTRY_KEY="\"country\"";
privatestaticfinalStringLOCATION_REGION_KEY="\"region\"";
privatestaticfinalStringLOCATION_CITY_KEY="\"city\"";
//privatestaticfinalStringLOCATION_POINT_KEY="\"location\"";
privatestaticfinalStringLOCATION_POINT_LATITUDE_KEY="\"latitude\"";
privatestaticfinalStringLOCATION_POINT_LONGITUDE_KEY="\"longitude\"";
privatestaticfinalStringLOCATION_POINT_PRECISIONY_KEY="\"accuracy\"";
privatestaticfinalStringLOCATION_SPLIT_STR=",";
publicstaticfinalintMIN_ZOOM=11;
publicstaticfinalintMAX_ZOOM=18;
privatestaticfinalintDOWNNUM_FOR_PROXY=8000;
privatestaticfinalintCONNECT_TIMEOUT=30000;//30秒
privatestaticfinalintTHREAD_SLEEP_MILLIS=200;
privatestaticbooleanflag=false;
privatestaticintdownNum=0;
privatestaticStringproxyHost="165.228.128.10";
privatestaticStringproxyPort="3128";
privatestaticStringproxySet="true";
privatestaticfinalLoggerlogger=Logger.getLogger(AddressLatLngUtil.class);
/**
*获取地址详细信息及经纬度信息
*
*@paramaddress
*@returnMap<地址,经纬度>
*/
publicstaticMapgetAddressLatLng(Stringaddress)
{
StringBuilderurlBuilder=newStringBuilder();
urlBuilder.append("
urlBuilder.append("?
output=json");
urlBuilder.append("&oe=utf-8");
urlBuilder.append("&q=").append(encodeURLForUTF8(address));
urlBuilder.append("&key=ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA");
urlBuilder.append("&mapclient=jsapi");
urlBuilder.append("&hl=zh-CN");
urlBuilder.append("&callback=_xdc_._1g4gm5mh3");
//logger.info(urlBuilder.toString());
HttpURLConnectionhttpConnection=null;
try
{
//1、构造HttpURLConnection连接
URLurl=newURL(urlBuilder.toString());
URLConnectionurlConnection=url.openConnection();
httpConnection=(HttpURLConnection)urlConnection;
httpConnection.setDoInput(true);
httpConnection.setDoOutput(true);
httpConnection.setConnectTimeout(CONNECT_TIMEOUT);
httpConnection.connect();
//2、接收响应结果
InputStreaminStream=httpConnection.getInputStream();
StringhtmlContent=getContentByStream(inStream,REQUEST_ENCODE);
//关闭流资源
inStream.close();
//3、解析结果
Mapmap=parseAddressLatLng(htmlContent);
updateProxy();
returnmap;
}catch(Exceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
logger.error("===========获取经纬度信息异常!
请求地址:
"+address,e);
returnjava.util.Collections.emptyMap();
}finally
{
//关闭连接
if(null!
=httpConnection)
{
httpConnection.disconnect();
}
}
}
/**
*根据地址信息获取经纬度
*
*@paramaddressList地址集合
*@returnList
*/
publicstaticList
{
List
if(null==addressList||addressList.isEmpty())
{
returnlist;
}
for(Stringaddress:
addressList)
{
try
{
//休息一下
Thread.sleep(THREAD_SLEEP_MILLIS);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
MapaddrMap=getAddressLatLng(address);
if(false==addrMap.isEmpty())
{
list.add(addrMap);
}
else
{
//System.out.println(address+"pointisnull!
!
!
");
logger.warn("===========获取经纬度信息为空!
请求地址:
"+address);
}
}
returnlist;
}
/**
*解析网页内容地址信息及经纬度信息
*
*@paramhtmlContent
*@returnMap<地址,经纬度>
*/
privatestaticMapparseAddressLatLng(StringhtmlContent)
{
Mapaddr=newHashMap
(1);
if(isNullOrEmpty(htmlContent))
{
returnaddr;
}
String[]contents=htmlContent.split("\r\n");
String[]ss=null;
Stringaddress=null;
Stringcountry=null;
Stringregion=null;
Stringcity=null;
Pointpoint=null;
for(Stringline:
contents)
{
if(isNullOrEmpty(line))
{
continue;
}
line=line.trim();
if(line.contains(ADDRESS_POINT_KEY))
{
/*
*"coordinates":
[113.9465830,22.5309650,0]
*/
ss=line.split(ADDRESS_SPLIT_STR);
if(null!
=ss&&ss.length>1)
{
StringpointStr=getMiddleStr(ss[1],"[","]");
String[]pss=pointStr.split(",");
if(null!
=pss&&pss.length>1)
{
doubledefaultValue=0D;
point=newPoint(isNullOrEmpty(pss[0])?
defaultValue:
Double.parseDouble(pss[0].trim()),
isNullOrEmpty(pss[1])?
defaultValue:
Double.parseDouble(pss[1].trim()));
}
}
}
elseif(line.contains(ADDRESS_KEY))
{
address=getValue(line,ADDRESS_KEY);
}
elseif(line.contains(ADDRESS_COUNTRY_KEY))
{
country=getValue(line,ADDRESS_COUNTRY_KEY);
}
elseif(line.contains(ADDRESS_REGION_KEY))
{
region=getValue(line,ADDRESS_REGION_KEY);
}
elseif(line.contains(ADDRESS_CITY_KEY))
{
city=getValue(line,ADDRESS_CITY_KEY);
}
//默认取第一个地址信息
if(false==isNullOrEmpty(address)
&&null!
=point)
{
point.setCountry(country);
point.setRegion(region);
point.setCity(city);
break;
}
}//end-for-contents
//如果地址不为空
if(false==isNullOrEmpty(address))
{
addr.put(address,point);
}
returnaddr;
}
/**
*获取中间字符串内容
*
*@paramcontent
*@parambeginStr
*@paramendStr
*@return
*/
privatestaticStringgetMiddleStr(Stringcontent,StringbeginStr,StringendStr)
{
Stringstr="";
if(isNullOrEmpty(content))
{
returnstr;
}
content=content.trim();
intbIndex=content.indexOf(beginStr);
inteIndex=-1;
if(null!
=beginStr&&beginStr.equals(endStr))
{
intindex=content.substring(bIndex+beginStr.length()).indexOf(endStr);
eIndex=content.substring(0,bIndex+beginStr.length()).length()+index;
}
elseif(null!
=endStr&&false==endStr.equals(beginStr))
{
eIndex=content.indexOf(endStr);
}
if(-1!
=bIndex&&-1!
=eIndex)
{
str=content.substring(bIndex+beginStr.length(),eIndex);
}
returnstr;
}
privatestaticfinalStringPROXY_HOST_KEY="http.proxyHost";
privatestaticfinalStringPROXY_PORT_KEY="http.proxyPort";
privatestaticfinalStringPROXY_SET_KEY="http.proxySet";
/**
*切换代理
*/
privatestaticsynchronizedvoidupdateProxy()
{
downNum++;
if(downNum%DOWNNUM_FOR_PROXY==0)
{
if(flag)
{
clearProxy();
flag=false;
}
else
{
setProxy();
flag=true;
}
}
}
privatestaticvoidsetProxy()
{
System.setProperty(PROXY_HOST_KEY,proxyHost);
System.setProperty(PROXY_PORT_KEY,proxyPort);
System.setProperty(PROXY_SET_KEY,proxySet);
logger.info("setProxy====="+proxyHost+":
"+proxyPort);
//System.out.println("setProxy====="+proxyHost+":
"+proxyPort);
}
privatestaticvoidclearProxy()
{
System.clearProperty(PROXY_HOST_KEY);
System.clearProperty(PROXY_PORT_KEY);
System.clearProperty(PROXY_SET_KEY);
logger.info("clearProxy=====");
//System.out.println("clearProxy=====");
}
privatestaticStringencodeURLForUTF8(Stringstr)
{
try
{
str=.URLEncoder.encode(str,"UTF-8");
}catch(UnsupportedEncodingExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
logger.error("字符串转码异常,字符串:
"+str,e);
}
returnstr;
}
/**
*按照指定编码从流中读取信息
*
*@paraminStream
*@paramencode
*@return
*@throwsIOException
*/
privatestaticStringgetContentByStream(InputStreaminStream,Stringencode)throwsIOException
{
if(null==inStream)
{
returnnull;
}
StringBuildercontent=newStringBuilder();
//采用指定编码格式读取流内容
BufferedReaderreader=newBufferedReader(newInputStreamReader(inStream,encode));
Stringmessage=null;
while(null!
=(message=reader.readLine()))
{
content.append(message);
content.append("\r\n");
}
//关闭读取器,释放资源
reader.close();
return(content.toString());
}
/**
*获取偏移后的经纬度(Google中国地图偏移接口)
*中国地图和卫星图都存在偏移量,这个是由中国规划局确定的,
*google的地图服务,以ditu.gogle开头的都没有偏差,以maps.google开头的服务就有偏差
*
*@paramzoom
*偏移级别(从11级到18级,18级最精确)
*@paramsourcePoint
*经纬度对象
*@return
*/
publicstaticPointgetOffsetLatLng(intzoom,PointsourcePoint)
{
if(null==sourcePoint)
{
returnnull;
}
StringBuilderurlBuilder=newStringBuilder();
urlBuilder.append("
urlBuilder.append("?
spn=0.0,0.0");
urlBuilder.append("&z=").append(zoom);
urlBuilder.append("&vp=");
urlBuilder.append(sourcePoint.getLatitude());//纬度
urlBuilder.append(",");
urlBuilder.append(sourcePoint.getLongitude());//经度
HttpURLConnectionhttpConnection=null;
try
{
//1、构造HttpURLConnection连接
URLurl=newURL(urlBuilder.toString());
URLConnectionurlConnection=url.openConnection();
httpConnection=(HttpURLConnection)urlConnection;
httpConnection.setDoInput(true);
httpConnection.setDoOutput(true);
httpConnection.setConnectTimeout(CONNECT_TIMEOUT);
httpConnection.connect();
//2、接收响应结果
InputStreaminStream=httpConnection.getInputStream();
StringhtmlContent=getConte