知识大全 Google MAP编码折线算法的Java实现

Posted

篇首语:黄沙百战穿金甲,不破楼兰终不还。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Google MAP编码折线算法的Java实现相关的知识,希望对你有一定的参考价值。

Google MAP编码折线算法的Java实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  首先 在Google API上所描述的算法如下

  下面说明了对此类有符号值进行编码的步骤

  取初始有符号值

  

  将其取十进制值乘以 e 并取整

  

  将十进制值转换为二进制值 请注意负值必须求反 并以值填充字节边界

  

  

  

  变换二进制值

  

  如果原来的十进制值是负数 则对以下编码求反

  

  将该二进制值分为 位一组的块(从右侧开始):

  

  将这些 位一组的块倒序放置

  

  如果后面还有一个位块 则将每个值与 x 进行 或 操作 (OR)

  

  将每个值转换为十进制

  

  将每个值加上

  

  将每个值转换为其对应的 ASCII 字符

  `~oia@

  下表显示了编码点的一些示例 将编码显示为距离原来点的一系列偏移值

  示例

  点 ( ) ( ) ( )

  纬度 经度 E 表示的纬度 E 表示的经度 纬度变化 经度变化 编码后的纬度 编码后的经度 编码点

   + _p~iF ~ps|U _p~iF~ps|U

   + _ulL nnqC _ulLnnqC

   + _mqN vxq`@ _mqNvxq`@

  编码折线 _p~iF~ps|U_ulLnnqC_mqNvxq`@

  自己写的Java代码如下(参考了一个网上流传的C语言版本 但是那个版本里面对第 条描述的理解有误 即encode(double)这个函数里的while的退出条件)

  private String encode(double point)

  //取十进制乘以 e

  int _point_int = (int) (point* e );

  //对二进制低位补

  _point_int = _point_int<< ;

  //如果原来的数是负数则求反

  if( point < )

  _point_int = ~_point_int;

  

  String resultString = ;

  while ( _point_int>>> > ) //如果位块后面还有一个位块

  int _block = _point_int& x F;//将二进制数分为 位一组的块 倒序处理

  _block = (_block| x )+ ;

  char _result = (char) _block;

  resultString +=_result;

  _point_int = _point_int>>> ;

  

  resultString += (char)(_point_int+ );

  return resultString;

  

  private String encodeLatLng(double lat double lng)

  String _lat = this encode(lat);

  String _lng = this encode(lng);

  return _lat+_lng;

  

  private String encodeLatLng(String lat String lng)

  double _lat = Double parseDouble(lat);

  double _lng = Double parseDouble(lng);

  return this encodeLatLng(_lat _lng);

  

  private String encodeLine(String line)

  String [] _points = null;

  String _result = ;

  BigDecimal _lat_temp = new BigDecimal( );

  BigDecimal _lng_temp = new BigDecimal( );

  _points = line split( ; );

  for (String _point : _points)

  String [] _latlng = _point split( );

  BigDecimal _lat = BigDecimal valueOf(Double parseDouble(_latlng[ ]));

  BigDecimal _lng = BigDecimal valueOf(Double parseDouble(_latlng[ ]));

  double _lat_disp = _lat subtract(_lat_temp) doubleValue();

  double _lng_disp = _lng subtract(_lng_temp) doubleValue();

  _result += this encodeLatLng(_lat_disp _lng_disp);

  _lat_temp = _lat;

  _lng_temp = _lng;

  

  return _result;

  

cha138/Article/program/Java/hx/201311/25720

相关参考

知识大全 Java Map遍历方法

JavaMap遍历方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java代码  Mapma

知识大全 javascript实现的java里的Map对象

javascript实现的java里的Map对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java中怎样遍历Map的所有的元素

Java中怎样遍历Map的所有的元素  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JDK中  

知识大全 Java中的Set,List,Map的区别

Java中的Set,List,Map的区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对JA

知识大全 Java中怎么遍历map中value值

Java中怎么遍历map中value值  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //两种方

知识大全 对Java提供的两个Map进行的性能测试

对Java提供的两个Map进行的性能测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对jav

知识大全 对Java 提供的两个Map 进行了性能测试

对Java提供的两个Map进行了性能测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对jav

知识大全 Java.until.Map,Set,List的资料整理

Java.until.Map,Set,List的资料整理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 JAVA中的容器 list vector set map

JAVA中的容器listvectorsetmap  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java那些事儿 - JavaOne 2011、CDI和Google Dart语言

Java那些事儿-JavaOne2011、CDI和GoogleDart语言  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我