<tbody id="ovqgh"><noscript id="ovqgh"></noscript></tbody>


    1. <th id="ovqgh"></th>

      GPS糾偏0.01精度工具/算法案例

      2019-05-28 11:04:22 root

       

      精度工具下載 :http://map.yanue.net/gps.html
       
      該校正適用于 Google map China, Microsoft map china ,MapABC 等,因為這些地圖構成方法是一樣的需要offset.dat文件,該文件為0.01精度校正數據, 有需要者請聯系本網站人員, 非免費版本。
       
      算法演示:
       
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      <?php
      /*
         代碼功能:利用0.01精度校正庫文件修正中國地圖經緯度偏移。
      */
      header("Content-Type:text/html; charset=utf-8");
      define('__dat_db__' 'offset.dat' );// DAT數據文件
      define('datmax' , 9813675 );// 數據條數-結束記錄
       
      // # offset.php?lat=39.914914&lon=116.460633
      $lon=$_GET['lon'];
      $lat=$_GET['lat'];
      $tmplon=intval($lon * 100);
      $tmplat=intval($lat * 100);
      //經度到像素X值
      function lngToPixel($lng,$zoom) {
      return ($lng+180)*(256<<$zoom)/360;
      }
      //像素X到經度
      function pixelToLng($pixelX,$zoom){
      return $pixelX*360/(256<<$zoom)-180;
      }
      //緯度到像素Y
      function latToPixel($lat$zoom) {
      $siny = sin($lat * pi() / 180);
      $y=log((1+$siny)/(1-$siny));
      return (128<<$zoom)*(1-$y/(2*pi()));
      }
      //像素Y到緯度
      function pixelToLat($pixelY$zoom) {
      $y = 2*pi()*(1-$pixelY /(128 << $zoom));
      $z = pow(M_E, $y);
      $siny = ($z -1)/($z +1);
      return asin($siny) * 180/pi();
      }
       
      function xy_fk( $number ){
              $fp fopen(__dat_db__,"rb"); //■1■.將 r 改為 rb
              $myxy=$number;//#"112262582";
              $left = 0;//開始記錄
              $right = datmax;//結束記錄
       
              //采用用二分法來查找查數據
              while($left <= $right){
                  $recordCount =(floor(($left+$right)/2))*8; //取半
                  //echo "運算:left=".$left." right=".$right." midde=".$recordCount."
      ";
                  @fseek $fp$recordCount , SEEK_SET ); //設置游標
                  $c fread($fp,8); //讀8字節
                  $lon = unpack('s',substr($c,0,2));
                  $lat = unpack('s',substr($c,2,2));
                  $x = unpack('s',substr($c,4,2));
                  $y = unpack('s',substr($c,6,2));
                  $jwd=$lon[1].$lat[1];
                  //echo "找到的經緯度:".$jwd;
                  if ($jwd==$myxy){
                     fclose($fp);
                     return $x[1]."|".$y[1];
                     break;
                  }else if($jwd<$myxy){
                     //echo " > ".$myxy."
      ";
                     $left=($recordCount/8) +1;
                  }else if($jwd>$myxy){
                     //echo " < ".$myxy."
      ";
                     $right=($recordCount/8) -1;
                  }
       
              }
              fclose($fp);
      }
       
      $offset =xy_fk($tmplon.$tmplat);
      $off=explode('|',$offset);
      $lngPixel=lngToPixel($lon,18)+$off[0];
      $latPixel=latToPixel($lat,18)+$off[1];
       
      echo pixelToLat($latPixel,18).",".pixelToLng($lngPixel,18);
       
      ?>
      c#算法
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;   
       
      namespace MapDigit.GIS
      {
          public class GeoLatLng
          {   
       
              public GeoLatLng(double latitude, double longitude)
              {
                  this.latitude = latitude;
                  this.longitude = longitude;
              }
              public double latitude;
              public double longitude;
          }   
       
          public class GeoPoint
          {
              public GeoPoint(int x, int y)
              {
                  this.x = x;
                  this.y = y;
              }
              public int x;
              public int y;
          }   
       
          public class OffsetInChina
          {
              //用于從GPS坐標轉換為偏移后坐標
              public static GeoLatLng fromEarthToMars(GeoLatLng earth)
              {
                  GeoPoint ptOffset = getOffset(earth.latitude, earth.longitude);
                  if (ptOffset.x != 0 || ptOffset.y != 0)
                  {
                      int pixelX, pixelY;
                      TileSystem.LatLongToPixelXY(earth.latitude, earth.longitude, 18, out pixelX, out pixelY);
                      GeoPoint pt = new GeoPoint(pixelX, pixelY);
                      pt.x += ptOffset.x;
                      pt.y += ptOffset.y;
                      double latitude, longitude;
                      TileSystem.PixelXYToLatLong(pt.x, pt.y, 18, out latitude, out longitude);
                      return new GeoLatLng(latitude, longitude);   
       
                  }
                  else
                  {
                      return new GeoLatLng(earth.latitude, earth.longitude);
                  }   
       
              }   
       
              //用于將偏移后坐標轉成真實的坐標
              public static GeoLatLng fromMarToEarth(GeoLatLng mars)
              {
                  GeoPoint ptOffset = getOffset(mars.latitude, mars.longitude);
                  if (ptOffset.x != 0 || ptOffset.y != 0)
                  {
                      int pixelX, pixelY;
                      TileSystem.LatLongToPixelXY(mars.latitude, mars.longitude, 18, out pixelX, out pixelY);
                      GeoPoint pt = new GeoPoint(pixelX, pixelY);
                      pt.x -= ptOffset.x;
                      pt.y -= ptOffset.y;
                      double latitude, longitude;
                      TileSystem.PixelXYToLatLong(pt.x, pt.y, 18, out latitude, out longitude);
                      return new GeoLatLng(latitude, longitude);   
       
                  }
                  else
                  {
                      return new GeoLatLng(mars.latitude, mars.longitude);
                  }
              }   
       
              //這個函數用于將需要查詢的經緯度轉成最近的0.01分度值,無插值
              //也可以自行實現插值
              private static GeoPoint getQueryLocation(double latitude, double longitude)
              {
                  int lat = (int)(latitude * 100);
                  int lng = (int)(longitude * 100);
                  double lat1 = ((int)(latitude * 1000 + 0.499999)) / 10.0;
                  double lng1 = ((int)(longitude * 1000 + 0.499999)) / 10.0;
                  for (double x = longitude; x < longitude + 1; x += 0.5)
                  {
                      for (double y = latitude; x < latitude + 1; y += 0.5)
                      {
                          if (x <= lng1 && lng1 < (x + 0.5) && lat1 >= y && lat1 < (y + 0.5))
                          {
                              return new GeoPoint((int)(x + 0.5), (int)(y + 0.5));
                          }
                      }
                  }
                  return new GeoPoint(lng, lat);
              }   
       
              private static GeoPoint getOffset(double longitude, double latitude)
              {
                  //這個函數用于返回查詢結果,就是從校正數據中返回18級時x,y方偏移
                  //可以自行實現
                  return null;
              }   
       
          }
      }
       

       


      電話咨詢
      公司地址
      解決方案
      QQ客服
      亚洲日韩高清四虎_国产精品一区二区在线观看99_日韩2021亚洲天堂在线_制服丝袜视频高清中文字幕