<strong id="mrbgq"></strong>
  • <wbr id="mrbgq"></wbr><i id="mrbgq"></i>

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

        2019-05-28 11:04:22 root 705

         

        精度工具下載 :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客服
        2016免费成人色情网址,亚洲人成网站观看在线播放,成l人在线观看线路1,中文字幕欧美亚洲网
        <strong id="mrbgq"></strong>
      1. <wbr id="mrbgq"></wbr><i id="mrbgq"></i>