`
superich2008
  • 浏览: 315282 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

地区经纬度信息获取(利用Google地图API获取)

阅读更多

package com.leg3s.rld.util;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;

/**
* 地址经纬度信息获取工具类
*
* @author liuw
* @create date 2010/01/18
*/
public class AddressLatLngUtil
{
private static final String REQUEST_ENCODE = "UTF-8";
private static final String ADDRESS_KEY = "\"address\"";
private static final String ADDRESS_COUNTRY_KEY = "\"CountryName\"";
private static final String ADDRESS_REGION_KEY = "\"AdministrativeAreaName\"";
private static final String ADDRESS_CITY_KEY = "\"LocalityName\"";
private static final String ADDRESS_POINT_KEY = "\"coordinates\"";
private static final String ADDRESS_SPLIT_STR = ":";

private static final String LOCATION_COUNTRY_KEY = "\"country\"";
private static final String LOCATION_REGION_KEY = "\"region\"";
private static final String LOCATION_CITY_KEY = "\"city\"";
//private static final String LOCATION_POINT_KEY = "\"location\"";
private static final String LOCATION_POINT_LATITUDE_KEY = "\"latitude\"";
private static final String LOCATION_POINT_LONGITUDE_KEY = "\"longitude\"";
private static final String LOCATION_POINT_PRECISIONY_KEY = "\"accuracy\"";
private static final String LOCATION_SPLIT_STR = ",";


public static final int MIN_ZOOM = 11;
public static final int MAX_ZOOM = 18;

private static final int DOWNNUM_FOR_PROXY = 8000;
private static final int CONNECT_TIMEOUT = 30000; // 30秒
private static final int THREAD_SLEEP_MILLIS = 200;
private static boolean flag = false;
private static int downNum = 0;

private static String proxyHost = "165.228.128.10";
private static String proxyPort = "3128";
private static String proxySet = "true";

private static final Logger logger = Logger.getLogger(AddressLatLngUtil.class);

/**
* 获取地址详细信息及经纬度信息
*
* @param address
* @return Map<地址, 经纬度>
*/
public static Map<String, Point> getAddressLatLng(String address)
{
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append("http://ditu.google.cn/maps/geo");
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());

HttpURLConnection httpConnection = null;
try
{
// 1、构造HttpURLConnection连接
URL url = new URL(urlBuilder.toString());
URLConnection urlConnection = url.openConnection();
httpConnection = (HttpURLConnection) urlConnection;
httpConnection.setDoInput(true);
httpConnection.setDoOutput(true);
httpConnection.setConnectTimeout(CONNECT_TIMEOUT);
httpConnection.connect();

// 2、接收响应结果
InputStream inStream = httpConnection.getInputStream();
String htmlContent = getContentByStream(inStream, REQUEST_ENCODE);
// 关闭流资源
inStream.close();

// 3、解析结果
Map<String, Point> map = parseAddressLatLng(htmlContent);
updateProxy();

return map;
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("===========获取经纬度信息异常!请求地址:" + address, e);
return java.util.Collections.emptyMap();
} finally
{
// 关闭连接
if (null != httpConnection)
{
httpConnection.disconnect();
}
}
}

/**
* 根据地址信息获取经纬度
*
* @param addressList 地址集合
* @return List<Map<地址, 经纬度对象>>
*/
public static List<Map<String, Point>> getAddressLatLng(List<String> addressList)
{
List<Map<String, Point>> list = new ArrayList<Map<String, Point>>();
if (null == addressList || addressList.isEmpty())
{
return list;
}

for (String address : addressList)
{
try
{
// 休息一下
Thread.sleep(THREAD_SLEEP_MILLIS);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

Map<String, Point> addrMap = getAddressLatLng(address);
if(false == addrMap.isEmpty())
{
list.add(addrMap);
}
else
{
//System.out.println(address + " point is null!!!");
logger.warn("===========获取经纬度信息为空!请求地址:" + address);
}
}
return list;
}

/**
* 解析网页内容地址信息及经纬度信息
*
* @param htmlContent
* @return Map<地址, 经纬度>
*/
private static Map<String, Point> parseAddressLatLng(String htmlContent)
{
Map<String, Point> addr = new HashMap<String, Point>(1);
if (isNullOrEmpty(htmlContent))
{
return addr;
}

String[] contents = htmlContent.split("\r\n");
String[] ss = null;
String address = null;
String country = null;
String region = null;
String city = null;
Point point = null;
for (String line : 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)
{
String pointStr = getMiddleStr(ss[1], "[", "]");
String[] pss = pointStr.split(",");
if (null != pss && pss.length > 1)
{
double defaultValue = 0D;
point = new Point(isNullOrEmpty(pss[0])?defaultValue:Double.parseDouble(pss[0].trim()),
isNullOrEmpty(pss[1])?defaultValue:Double.parseDouble(pss[1].trim()));
}
}
}
else if (line.contains(ADDRESS_KEY))
{
address = getValue(line, ADDRESS_KEY);
}
else if (line.contains(ADDRESS_COUNTRY_KEY))
{
country = getValue(line, ADDRESS_COUNTRY_KEY);
}
else if (line.contains(ADDRESS_REGION_KEY))
{
region = getValue(line, ADDRESS_REGION_KEY);
}
else if (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);
}
return addr;
}

/**
* 获取中间字符串内容
*
* @param content
* @param beginStr
* @param endStr
* @return
*/
private static String getMiddleStr(String content, String beginStr, String endStr)
{
String str = "";
if (isNullOrEmpty(content))
{
return str;
}

content = content.trim();
int bIndex = content.indexOf(beginStr);
int eIndex = -1;
if (null != beginStr && beginStr.equals(endStr))
{
int index = content.substring(bIndex+beginStr.length()).indexOf(endStr);
eIndex = content.substring(0, bIndex+beginStr.length()).length() + index;
}
else if (null != endStr && false == endStr.equals(beginStr))
{
eIndex = content.indexOf(endStr);
}

if (-1 != bIndex && -1 != eIndex)
{
str = content.substring(bIndex+beginStr.length(), eIndex);
}
return str;
}

private static final String PROXY_HOST_KEY = "http.proxyHost";
private static final String PROXY_PORT_KEY = "http.proxyPort";
private static final String PROXY_SET_KEY = "http.proxySet";

/**
* 切换代理
*/
private static synchronized void updateProxy()
{
downNum++;
if (downNum % DOWNNUM_FOR_PROXY == 0)
{
if (flag)
{
clearProxy();
flag = false;
}
else
{
setProxy();
flag = true;
}
}
}

private static void setProxy()
{
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);
}

private static void clearProxy()
{
System.clearProperty(PROXY_HOST_KEY);
System.clearProperty(PROXY_PORT_KEY);
System.clearProperty(PROXY_SET_KEY);

logger.info("clearProxy=====");
//System.out.println("clearProxy=====");
}

private static String encodeURLForUTF8(String str)
{
try
{
str = java.net.URLEncoder.encode(str, "UTF-8");
} catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("字符串转码异常,字符串:"+ str, e);
}
return str;
}

/**
* 按照指定编码从流中读取信息
*
* @param inStream
* @param encode
* @return
* @throws IOException
*/
private static String getContentByStream(InputStream inStream, String encode) throws IOException
{
if (null == inStream)
{
return null;
}

StringBuilder content = new StringBuilder();
// 采用指定编码格式读取流内容
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, encode));
String message = null;
while (null != (message = reader.readLine()))
{
content.append(message);
content.append("\r\n");
}
// 关闭读取器,释放资源
reader.close();
return (content.toString());
}

/**
* 获取偏移后的经纬度(Google中国地图偏移接口)
* 中国地图和卫星图都存在偏移量,这个是由中国规划局确定的,
* google的地图服务,以ditu.gogle开头的都没有偏差,以maps.google开头的服务就有偏差
*
* @param zoom
* 偏移级别(从11级到18级,18级最精确)
* @param sourcePoint
* 经纬度对象
* @return
*/
public static Point getOffsetLatLng(int zoom, Point sourcePoint)
{
if (null == sourcePoint)
{
return null;
}

StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append("http://ditu.google.cn/maps/vp");
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());// 经度

HttpURLConnection httpConnection = null;
try
{
// 1、构造HttpURLConnection连接
URL url = new URL(urlBuilder.toString());
URLConnection urlConnection = url.openConnection();
httpConnection = (HttpURLConnection) urlConnection;
httpConnection.setDoInput(true);
httpConnection.setDoOutput(true);
httpConnection.setConnectTimeout(CONNECT_TIMEOUT);
httpConnection.connect();

// 2、接收响应结果
InputStream inStream = httpConnection.getInputStream();
String htmlContent = getContentByStream(inStream, REQUEST_ENCODE);
// 关闭流资源
inStream.close();

// 3、解析结果
String offset = parseOffsetFromZoom(zoom, htmlContent);
// 如果没有偏移值,则返回原经纬度对象
if (isNullOrEmpty(offset))
{
return sourcePoint;
}
Point targetPoint = getOffsetPoint(offset, zoom, sourcePoint);
updateProxy();

logger.info("sourcePoint: "+ sourcePoint);
logger.info("targetPoint: "+ targetPoint);

return targetPoint;
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("===========获取偏移经纬度信息异常!zoom = " + zoom + ", sourcePoint = " + sourcePoint, e);
} finally
{
// 关闭连接
if (null != httpConnection)
{
httpConnection.disconnect();
}
}
return null;
}

/**
* 获取对应级别像素偏移量
*
* @param zoom
* @param htmlContent
* @return
*/
private static String parseOffsetFromZoom(int zoom, String htmlContent)
{
String offset = null;
if (isNullOrEmpty(htmlContent) || zoom > MAX_ZOOM || zoom < MIN_ZOOM)
{
return offset;
}

/*
* 下面分别表示经纬度、级别、偏移像素数量【级别从11级到18级,共8组数字】
* 前一组数字精确的等于后一组数字除二,我们为了得到最精确的偏移,故选择第18级的偏移量1193,-270,
* 1193为x方向上精度的偏移像素,-270为y方向上维度偏移像素
*
* window.GTileShiftUpdateOffset && window.GTileShiftUpdateOffset(
* 39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33,
* 298, -67, 596, -135, 1193, -270]);
*/
int beginIndex = htmlContent.lastIndexOf("[");
int endIndex = htmlContent.lastIndexOf("]");
if (beginIndex > 0 && endIndex > 0)
{
// 获取各级别像素偏移量内容
String content = htmlContent.substring(beginIndex + 1, endIndex);
offset = getOffsetByZoom(zoom, content);
}
return offset;
}

/**
* 获取zoom级别的像素偏移量
*
* @param zoom
* @param content
* @return
*/
private static String getOffsetByZoom(int zoom, String content)
{
String[] ss = content.split(",");
int index = ((zoom - 10) << 1) - 2;
if (null == ss || ss.length < (index + 1))
{
return null;
}
return (ss[index].trim() + "," + ss[index + 1].trim());
}

/**
* 获取校正后的经纬度
*
* @param offset
* @param zoom
* @param point
* @return
*/
private static Point getOffsetPoint(String offset, int zoom, Point point)
{
String[] ss = offset.split(",");
int offsetX = Integer.parseInt(ss[0]);
int offsetY = Integer.parseInt(ss[1]);

double lngPixel = (Math.round(lngToPixel(point.getLongitude(), zoom)) - offsetX);
double latPixel = (Math.round(latToPixel(point.getLatitude(), zoom)) - offsetY);
return new Point(pixelToLng(lngPixel, zoom), pixelToLat(latPixel, zoom));
}

/*
* sinLatitude = sin(latitude * pi/180)
*
* pixelX = ((longitude + 180) / 360) * 256 * 2level
*
* pixelY = (0.5 – log((1 + sinLatitude) / (1 – sinLatitude)) / (4 * pi)) * 256 * 2level
*/

/**
* 经度到像素X值
*
* @param lng
* @param zoom
* @return
*/
private static double lngToPixel(double lng, int zoom)
{
return (lng + 180) * (256L << zoom) / 360;
}

/**
* 纬度到像素Y
*
* @param lat
* @param zoom
* @return
*/
private static double latToPixel(double lat, int zoom)
{
double siny = Math.sin(lat * Math.PI / 180);
double y = Math.log((1 + siny) / (1 - siny));
return (256L << zoom) * (0.5 - y / (4 * Math.PI));
}

/**
* 像素X到经度
*
* @param pixelX
* @param zoom
* @return
*/
private static double pixelToLng(double pixelX, int zoom)
{
return pixelX * 360 / (256L << zoom) - 180;
}

/**
* 像素Y到纬度
*
* @param pixelY
* @param zoom
* @return
*/
private static double pixelToLat(double pixelY, int zoom)
{
double y = 4 * Math.PI * (0.5 - pixelY / (256L << zoom));
double z = Math.pow(Math.E, y);
double siny = (z - 1) / (z + 1);
return Math.asin(siny) * 180 / Math.PI;
}

/**
* 根据地区编码(LAC)和基站编号(CID)获取经纬度信息
*
* @param lac 地区编码
* @param cellId 基站编号
* @deprecated 改为调用 getLocationByLacAndCid方法
* @return
*/
public static Point getLatLngByLacAndCid(int lac, int cellId)
{
String urlString = "http://www.google.com/glm/mmap";

HttpURLConnection httpConn = null;
try
{
// ---open a connection to Google Maps API---
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
httpConn = (HttpURLConnection) conn;
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
httpConn.setDefaultUseCaches(false);
httpConn.setRequestMethod("POST");
httpConn.setConnectTimeout(CONNECT_TIMEOUT);
httpConn.connect();

// ---write some custom data to Google Maps API---
OutputStream outputStream = httpConn.getOutputStream();
writeData(outputStream, cellId, lac);
outputStream.close();

// ---get the response---
DataInputStream dataInputStream = new DataInputStream(httpConn.getInputStream());

// ---interpret the response obtained---
dataInputStream.readShort();
dataInputStream.readByte();
int code = dataInputStream.readInt();
Point point = null;
if (code == 0)
{
double lat = (double) dataInputStream.readInt() / 1000000D;
double lng = (double) dataInputStream.readInt() / 1000000D;
int i = dataInputStream.readInt();
int j = dataInputStream.readInt();
String s = dataInputStream.readUTF();
// 关闭流
dataInputStream.close();

// 包装结果
point = new Point(lng, lat);
point.setPrecision(i); // 精确度

// ---display Google Maps---
//logger.info("lac = "+lac+", cellId = "+cellId+", Latitude = "+lat+", Longitude = "+lng
//+ ", precision = "+i+", j = "+j+", s = "+s);
//System.out.println("Latitude = " + lat + ", Longitude = " + lng
//+ ", precision = " + i + ", j = " + j + ", s = " + s);
}
else
{
logger.warn("===========根据地区编码和基站编号获取经纬度信息失败!lac = "+ lac + ", cellId = " + cellId);
}

return point;
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("===========根据地区编码和基站编号获取经纬度信息异常!lac = "+ lac + ", cellId = " + cellId, e);
} finally
{
// 关闭连接
if (null != httpConn)
{
httpConn.disconnect();
}
}
return null;
}

private static void writeData(OutputStream out, int cellId, int lac)
throws IOException
{
DataOutputStream dataOutputStream = new DataOutputStream(out);
dataOutputStream.writeShort(21);
dataOutputStream.writeLong(0);
dataOutputStream.writeUTF("en");
dataOutputStream.writeUTF("Android");
dataOutputStream.writeUTF("1.0");
dataOutputStream.writeUTF("Web");
dataOutputStream.writeByte(27);
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(0);
if (cellId >= 65536)
{
// 联通3G
dataOutputStream.writeInt(5);
}
else
{
// 移动3G
dataOutputStream.writeInt(3);
}
dataOutputStream.writeUTF("");

dataOutputStream.writeInt(cellId);
dataOutputStream.writeInt(lac);

dataOutputStream.writeInt(0); //mnc
dataOutputStream.writeInt(0); //mcc
dataOutputStream.writeInt(0);
dataOutputStream.writeInt(0);
dataOutputStream.flush();
dataOutputStream.close();
}

/**
* 根据地区编码(LAC)和基站编号(CID)获取地区信息
*
* @param lac 地区编码
* @param cellId 基站编号
* @return
*/
public static Point getLocationByLacAndCid(int lac, int cellId)
{
String urlString = "http://www.google.cn/loc/json";

HttpURLConnection httpConn = null;
try
{
// ---open a connection to Google Maps API---
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
httpConn = (HttpURLConnection) conn;
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
httpConn.setDefaultUseCaches(false);
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Content-Type", "application/json");
httpConn.setConnectTimeout(CONNECT_TIMEOUT);
httpConn.connect();

// ---write some custom data to Google Maps API---
OutputStreamWriter outputStream = new OutputStreamWriter(httpConn.getOutputStream());
outputStream.write(getLocationRequest(lac, cellId));
outputStream.flush();
outputStream.close();

// ---get the response---
String responseContent = getContentByStream(httpConn.getInputStream(), REQUEST_ENCODE);

// ---interpret the response obtained---
Point point = parseLocationContent(responseContent);

//logger.info(responseContent);
return point;
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("===========根据地区编码和基站编号获取地区信息异常!lac = "+ lac + ", cellId = " + cellId, e);
} finally
{
// 关闭连接
if (null != httpConn)
{
httpConn.disconnect();
}
}
return null;
}

private static String getLocationRequest(int lac, int cellId)
{
StringBuilder requestContent = new StringBuilder();
requestContent.append("{ ");
requestContent.append(" \"version\" : \"1.1.0\", ");
requestContent.append(" \"host\" : \"ditu.google.cn\", ");
requestContent.append(" \"access_token\" : \"2:k7j3G6LaL6u_lafw:4iXOeOpTh1glSXe\", ");
requestContent.append(" \"request_address\" : true,");
requestContent.append(" \"cell_towers\" : ");
requestContent.append(" [ ");
requestContent.append(" { ");
requestContent.append(" \"cell_id\" : ").append(cellId).append(", ");
requestContent.append(" \"location_area_code\" : ").append(lac).append(", ");
requestContent.append(" \"mobile_country_code\" : 460, ");
requestContent.append(" \"mobile_network_code\" : 00, ");
requestContent.append(" \"age\" : 0, ");
requestContent.append(" \"signal_strength\" : -60, ");
requestContent.append(" \"timing_advance\" : 5555 ");
requestContent.append(" } ");
requestContent.append(" ] ");
requestContent.append("} ");
return (requestContent.toString());
}

/**
* 解析地区信息,并构造Point对象
*
* @param respContent
* @return
*/
private static Point parseLocationContent(String respContent)
{
if (isNullOrEmpty(respContent))
{
return null;
}
/*
* {"location":{"latitude":31.148662,"longitude":114.957975,
* "address":{"country":"中国","country_code":"CN","region":"湖北省","city":"黄冈市"},
* "accuracy":1625.0},
* "access_token":"2:i1-PwttBtQsSyYvX:VVq7Nsl89ut7l9aV"}
*
*/
// 获取纬度、经度、精确度、国家、省份、城市信息
String latitude = getValue(respContent, LOCATION_POINT_LATITUDE_KEY);
String longitude = getValue(respContent, LOCATION_POINT_LONGITUDE_KEY);
String precisiony = getValue(respContent, LOCATION_POINT_PRECISIONY_KEY);
String country = getValue(respContent, LOCATION_COUNTRY_KEY);
String region = getValue(respContent, LOCATION_REGION_KEY);
String city = getValue(respContent, LOCATION_CITY_KEY);
Point point = null;
if (false == isNullOrEmpty(latitude)
&& false == isNullOrEmpty(longitude))
{
point = new Point(Double.parseDouble(longitude), Double.parseDouble(latitude));
if (false == isNullOrEmpty(precisiony))
{
point.setPrecision(Double.parseDouble(precisiony));
}
point.setCountry(country);
point.setRegion(region);
point.setCity(city);
}
return point;
}

private static String getValue(String content, String key)
{
if (false == isNullOrEmpty(content) && false == isNullOrEmpty(key))
{
String[] ss = content.split("\r\n");
for (String line : ss)
{
if (isNullOrEmpty(line))
{
continue;
}

line = line.replace("{", "").replace("}", "").replace("[", "").replace("]", "").trim();
String[] sss = line.split(LOCATION_SPLIT_STR);
for (String str : sss)
{
if (isNullOrEmpty(str) || false == str.contains(key))
{
continue;
}

String[] sub = str.split(ADDRESS_SPLIT_STR);
for (int i = 0; i < sub.length; i++)
{
if (isNullOrEmpty(sub[i]))
{
continue;
}
sub[i] = sub[i].trim();
}
List<String> subList = java.util.Arrays.asList(sub);
int subIndex = subList.indexOf(key);
if (-1 != subIndex
&& subList.size() > (subIndex + 1))
{
String value = subList.get(subIndex + 1);
return (value.replace("\"", "").trim());
}
}// end-for-sss

}// end-for-ss
}
return null;
}

/**
* 判断字符串是否为空
*
* @param str
* @return
*/
public static boolean isNullOrEmpty(String str)
{
if (null == str || "".equals(str))
{
return true;
}
return false;
}

/**
* 经纬度坐标信息
*/
public static class Point
{
/**
* 经度
*/
private double longitude;

/**
* 纬度
*/
private double latitude;

/**
* 精确度
*/
private double precision;

/**
* 国家
*/
private String country;

/**
* 省份
*/
private String region;

/**
* 城市
*/
private String city;

/**
* 构造函数
* @param longitude 经度
* @param latitude 纬度
*/
public Point (double longitude, double latitude)
{
this.longitude = longitude;
this.latitude = latitude;
}

public double getLongitude()
{
return longitude;
}

public void setLongitude(double longitude)
{
this.longitude = longitude;
}

public double getLatitude()
{
return latitude;
}

public void setLatitude(double latitude)
{
this.latitude = latitude;
}

public double getPrecision()
{
return precision;
}

public void setPrecision(double precision)
{
this.precision = precision;
}

public String toString()
{
StringBuilder content = new StringBuilder();
content.append(getClass().getName());
content.append("[ latitude=");
content.append(this.latitude);
content.append(", longitude=");
content.append(this.longitude);
if (this.precision != 0.0)
{
content.append(", precision=");
content.append(this.precision);
}

if (false == isNullOrEmpty(this.country))
{
content.append(", country=");
content.append(this.country);
}

if (false == isNullOrEmpty(this.region))
{
content.append(", region=");
content.append(this.region);
}

if (false == isNullOrEmpty(this.city))
{
content.append(", city=");
content.append(this.city);
}
content.append(" ]");
return (content.toString());
}

public String getCountry()
{
return country;
}

public void setCountry(String country)
{
this.country = country;
}

public String getRegion()
{
return region;
}

public void setRegion(String region)
{
this.region = region;
}

public String getCity()
{
return city;
}

public void setCity(String city)
{
this.city = city;
}
}

public static String getProxyHost()
{
return proxyHost;
}

public static void setProxyHost(String proxyHost)
{
AddressLatLngUtil.proxyHost = proxyHost;
}

public static String getProxyPort()
{
return proxyPort;
}

public static void setProxyPort(String proxyPort)
{
AddressLatLngUtil.proxyPort = proxyPort;
}

/**
* 测试
* @param args
*/
public static void main(String[] args)
{
//System.getProperties().list(System.out);

//深圳: (经度)lng:114.0578,(纬度)lat:22.5434
List<String> addrList = new ArrayList<String>();
addrList.add("留学生创业大厦");
//addrList.add("深圳市");
//addrList.add("世界之窗");
//addrList.add("地王大厦");
//addrList.add("黄鹤楼");

List<Map<String, Point>> list = getAddressLatLng(addrList);
for (Map<String, Point> map : list)
{
for (Entry<String, Point> entry : map.entrySet())
{
logger.info(entry.getKey() + entry.getValue());

// 获取偏移坐标
Point offsetPoint = getOffsetLatLng(MAX_ZOOM, entry.getValue());
logger.info("偏移经纬度:" + offsetPoint);
System.out.println();
}
}

int lac = 0x717f;
int cellId = 0x3341;
Point point = getLocationByLacAndCid(lac, cellId);
logger.info(point);

point = getOffsetLatLng(MAX_ZOOM, point);
logger.info(point);

System.out.println("finished!");

}
}

分享到:
评论

相关推荐

    地区经纬度信息获取(利用Google地图API获取)

    (地区经纬度信息获取(利用Google地图API获取).

    根据GoogleMapApi给出地名获取经纬度,给出经纬度获取地名(Java版本)

    根据GoogleMapApi给出地名获取经纬度,给出经纬度获取地名(Java版本) RT

    socket通信通过经纬度获取地图信息

    利用socekt API访问google map,主要获取方式采用经纬度方式传参到http服务器实现

    Google地图API综合应用

    Google地图API应用,利用Javascript完成地名搜索,经纬度获取以某经纬度天气预报信息等...

    Google map API提供的服务体验演示代码-一个大学API实例

    本文介绍了Google Maps API的相关基础知识,并且通过两个地图应用的实际开发,总结了Google Maps API 中,设置地图属性,添加地标和信息窗口,获取鼠标点击位置的经纬度以及在地图上添加简单图形等几个常用的功能,...

    google map 获得我的位置

    利用Google map api中的navigator.geolocation来获取当前IP地址所在位置的经纬度

    ASP.NET页面中使用Google Map

    例如,我想从SQL Server中读取经纬度信息,然后在Google Map中插入一个点。如果熟悉AJAX的话,很快就能得出答案。我们必须用JavaScript调用ASP.NET服务器端函数,利用得到的数据来绘制Google Map。简单吧?其实,...

    在ASP.NET中使用Google Map

    简介 &lt;br&gt;很多人都知道Google Earth(Google Map),其实,Google为我们自己开发应用程序提供了丰富的API,我们只要具备一些JavaScript的知识,就完全可以利用它们。但是,对于我来说,在ASP.NET页面中使用...

    Google Android SDK开发范例大全(第3版) 4/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    World Map Globe Edition 2 V14.5

    World Map Globe Edition 2 添加到您的场景一个...该资产包含一个完整的API,用于探索和利用提供的国家、省和城市目录—获取地理位置、城市都市人口、所属国家和省等信息,导航到这些信息,获取省和国家的邻居,等等!

    Google Android SDK开发范例大全(第3版) 3/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    Google Android SDK开发范例大全(第3版) 5/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    Google Android SDK开发范例大全(第3版) 1/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    Google Android SDK开发范例大全(第3版)part2

     9.5 GPS Google地图  9.6 移动版Google Map  9.7 规划导航路径  9.8 移动设备上的Picasa相册  9.9 随身翻译机  9.10 通过YouTube ID调用YouTube播放影片  9.11 Google Analytics分析手机用户行为  ...

    《Google Android SDK开发范例大全(第3版)》.pdf

    9.5 gps google地图 648 9.6 移动版google map 653 9.7 规划导航路径 658 9.8 移动设备上的picasa相册 664 9.9 随身翻译机 677 9.10 通过youtube id调用youtube播放影片 681 9.11 google ...

    出现问题a is defined高手帮忙

    src="http://ditu.google.com/maps?file=api&amp;v=2&amp; key=ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ- i1QfUnH94QxWIa6N4U6MouMmBA&h1=zh-CN" type="text/javascript"&gt; //实现框选...

Global site tag (gtag.js) - Google Analytics