• Mapbar POI 转 经纬度坐标的各个版本


    参考 这个的php和java版本:https://code.google.com/p/freebsd-help/source/browse/Mapbar%E7%BB%8F%E7%BA%AC%E5%9D%90%E6%A0%87%E5%81%8F%E7%A7%BB%E7%9A%84%E5%8A%A0%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95

    出来C# 版,后面需要服务端的JAVA版本再贴上来,先上C#版

    PHP版本

    View Code
     1 function pos_decode($pos) {
     2     $index = -1;
     3     $count = 0;
     4     $code = "";
     5     $len = strlen($pos);
     6     $apiKey = ord($pos[$len - 1]);
     7     $pos = substr($pos, 0, $len - 1);
     8     $len--;
     9     for ($i = 0; $i < $len; $i++) {
    10         $hash = intval($pos[$i], 36) - 10;
    11         if ($hash >= 10) {
    12             $hash = $hash - 7;
    13         }
    14         $code .= base_convert($hash, 10, 36);
    15         if ($hash > $count) {
    16             $index = $i;
    17             $count = $hash;
    18         }
    19     }
    20     $subLL = intval(substr($code, 0, $index), 16);
    21     $addLL = intval(substr($code, $index + 1), 16);
    22     $lng = ($subLL + $addLL - intval($apiKey)) / 2;
    23     $lat = ($addLL - $lng) / 100000.0;
    24     $lng /= 100000.0;
    25 
    26     return array($lat, $lng);
    27 }

    JavaScript版本

    View Code
     1 function (poi) {
     2         if (DP.isObject(poi)) {
     3             return poi;
     4         };
     5         var _options = this.options,
     6             index = -1,
     7             count = 0,
     8             code = "",
     9             len = poi.length,
    10             apiKey = poi.charCodeAt(len - 1),
    11             hash,
    12             subLL, addLL,
    13             lng, lat;
    14         poi = poi.substring(0, len - 1);
    15         len--;
    16         for (var i = 0; i < len; i++) {
    17             hash = parseInt(poi.charAt(i), _options.settings.cha) - _options.settings.add;
    18             if (hash >= _options.settings.add) {
    19                 hash = hash - _options.settings.plus;
    20             };
    21             code += (hash).toString(_options.settings.cha);
    22             if (hash > count) {
    23                 index = i;
    24                 count = hash;
    25             };
    26         }
    27         subLL = parseInt(code.substring(0, index), _options.settings.digi);
    28         addLL = parseInt(code.substring(index + 1), _options.settings.digi);
    29         lng = (subLL + addLL - parseInt(apiKey)) / 2;
    30         lat = (addLL - lng) / 100000.0;
    31         lng /= 100000.0;
    32         return { "lat": lat, "lng": lng };
    33     }

    增加一个C#版本

            static int ConvertToInt32(char c)
            {
                if (c >= 48 && c <= 57) { return c - 48; }
                if (c >= 97 && c <= 122) { return c - 87; }
                if (c >= 65 && c <= 90) { return c - 55; }
                return 0;
            }
    
            static string ConvertToString(int v, int fromBase)
            {
                if (fromBase < 2 || fromBase > 36) throw new ArgumentException();
                List<char> cs = new List<char>(36);
                while (v > 0)
                {
                    int x = v % fromBase;
                    int c = 48;
                    if (x >= 10) { c = 87; }
                    cs.Add((char)(x + c));
                    v /= fromBase;
                }
                cs.Reverse();
                string s = new string(cs.ToArray());
                return s;
            }
            private Location Decode(string poi)
            {
                int index = -1;
                int count = 0;
                string code = "";
                int len = poi.Length;
                char apiKey = poi[len - 1];
                int hash = 0;
                int subLL = 0;
                int addLL = 0;
                double lng = 0;
                double lat = 0;
                poi = poi.Substring(0, len - 1);
                len--;
                for (int i = 0; i < len; i++)
                {
                    hash = ConvertToInt32(poi[i]) - 10;
                    if (hash >= 10)
                    {
                        hash = hash - 7;
                    }
                    code += ConvertToString(hash, 36);
                    if (hash > count)
                    {
                        index = i;
                        count = hash;
                    }
                }
                subLL = Convert.ToInt32(code.Substring(0, index), 16);
                addLL = Convert.ToInt32(code.Substring(index + 1), 16);
                lng = (subLL + addLL - Convert.ToInt32(apiKey + "", 16)) / 2.0d;
                lat = (addLL - lng) / 100000.0d;
                lng /= 100000.0;
                return new Location()
                {
                    lat = lat,
                    lng = lng
                };
            }

    Java版本请听下回分解

  • 相关阅读:
    非递归的中序遍历(inorder)树 leetcode 94
    基于二叉树的抢劫问题 leetcode337
    查询二叉树的公共父结点 leetcode 236
    链表的无锁操作 (JAVA)
    kexec 内核快速启动流程分析
    最近几天严重营养不良。。。
    Better Me
    《大四上寒假总结》--3.10
    《计算机网络》学习总结
    记录
  • 原文地址:https://www.cnblogs.com/yinpengxiang/p/2843445.html
Copyright © 2020-2023  润新知