编码折线算法C#

来源:互联网 发布:手机淘宝店铺二维码 编辑:程序博客网 时间:2024/05/01 21:46
class GPolyline2    {        /**          * 处理有符号整数          *           * @param point          * @return          */        private static string encodeSignedNumber(int point)        {            // 对二进制低位补0               int _point_int = point << 1;            // 如果原来的数是负数则求反,取其补码               if (point < 0)            {                _point_int = ~_point_int;            }            return (encodeNumber(_point_int));        }        /**          * 处理无符号整数          *           * @param num          * @return          */        private static string encodeNumber(int num)        {            string resultstring = "";            while (num >= 0x20)            {                int _block = num & 0x1F;                _block = (_block | 0x20) + 63;                char _result = (char)_block;                resultstring += _result;                num >>= 5;            }            resultstring += (char)(num + 63);            return resultstring;        }        ///**         // * 计算编码级别         // *          // * @param line         // * @return         // */        //public static string encodeLevel(string line)        //{        //    int level = 3;// 设置编码级别           //    string encodeLel = encodeNumber(level);// 计算出编码级别,因为预先固定,考虑效率问题,只计算一次           //    string result = "";        //    string[] pointsStr = line.Split(';');        //    foreach (string pointStr in pointsStr)        //    {        //        result += pointStr;        //    }        //    // System.out.println("2level: " + result.tostring());           //    return result;        //}        /**          * 计算编码折线          *           * @param line          * @return          */        public static string createEncodings(string line)        {            string _result = "";            int plat = 0;            int plng = 0;            string[] _points = line.Split(';');// 每个经纬度坐标值以";"分隔               foreach (string pointStr in _points)            {                string[] _latlng = pointStr.Split(',');// 经纬度值之间以","分隔                   double lat = Double.Parse(_latlng[0]);                double lng = Double.Parse(_latlng[1]);                int late5 = (int)Math.Floor(lat * 1e5);                int lnge5 = (int)Math.Floor(lng * 1e5);                int dlat = late5 - plat;                int dlng = lnge5 - plng;                plat = late5;                plng = lnge5;                _result += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);            }            // System.out.println("2bianma--->" + _result);               return _result;        }        // Decode an encoded polyline into a list of lat/lng tuples.        public static string decodeLine (string encoded) {            int len = encoded.Length;            int index = 0;            string array = "";            double lat = 0;            double lng = 0;            while (index < len) {                int b;                int shift = 0;                int result = 0;                do {                  b = encoded[index++] - 63;                  result |= (b & 0x1f) << shift;                  shift += 5;                }                while (b >= 0x20);                int dlat = ((result & 1) !=0  ? ~(result >> 1) : (result >> 1));                lat += dlat;                shift = 0;                result = 0;                do {                  b = encoded[index++] - 63;                  result |= (b & 0x1f) << shift;                  shift += 5;                }                while (b >= 0x20);                var dlng = ((result & 1)!=0 ? ~(result >> 1) : (result >> 1));                lng += dlng;                array += lat * 1e-5 + "," + lng * 1e-5 + ";";            }            array.Remove(array.Length - 1);            return array;        }    //// Decode an encoded levels string into a list of levels.    //public static string decodeLevels(string encoded)    //{    //string  levels= "";    //for (var pointIndex = 0; pointIndex < encoded.Length; ++pointIndex) {    //    var pointLevel = encoded[pointIndex] - 63;    //    levels += pointLevel;    //}    //return levels;    //}    }

存档。
原创粉丝点击