熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Google MAP編碼折線算法的Java實現

2013-11-23 18:46:49  來源: Java核心技術 

  首先在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&xF;//將二進制數分為位一組的塊倒序處理

  _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 = thisencode(lat);

  String _lng = thisencode(lng);

  return _lat+_lng;

  }

  private String encodeLatLng(String lat String lng) {

  double _lat = DoubleparseDouble(lat);

  double _lng = DoubleparseDouble(lng);

  return thisencodeLatLng(_lat _lng);

  }

  private String encodeLine(String line) {

  String [] _points = null;

  String _result = ;

  BigDecimal _lat_temp = new BigDecimal();

  BigDecimal _lng_temp = new BigDecimal();

  _points = linesplit(;);

  for (String _point : _points) {

  String [] _latlng = _pointsplit();

  BigDecimal _lat = BigDecimalvalueOf(DoubleparseDouble(_latlng[]));

  BigDecimal _lng = BigDecimalvalueOf(DoubleparseDouble(_latlng[]));

  double _lat_disp = _latsubtract(_lat_temp)doubleValue();

  double _lng_disp = _lngsubtract(_lng_temp)doubleValue();

  _result += thisencodeLatLng(_lat_disp_lng_disp);

  _lat_temp = _lat;

  _lng_temp = _lng;

  }

  return _result;

  }

  其中encode(double)這個函數是實現的折線編碼算法剩余三個函數是一些輔助函數其中最後一個encodeLine(String)函數只需傳入一個類似的字符串即可返回最後的經過編碼的字符串


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25720.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.