谷歌的“编码折线算法”的C#实现 [英] C# implementation of Google's 'Encoded Polyline Algorithm'

查看:147
本文介绍了谷歌的“编码折线算法”的C#实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有人有一个简洁和强大的执行谷歌的编码折线算法在C# ?



我基本上希望此签名的实现:

 公开字符串编码(IEnumerable的<点和GT;分); 


解决方案

下面是我对入驻的实现:



 公共静态字符串编码(IEnumerable的< GeoLocation中>分)
{
无功海峡=新的StringBuilder();

VAR encodeDiff =(动作< INT>)(差异=> {
INT转移= DIFF<< 1;
如果(DIFF&小于0)
=转向转向〜;
INT REM =转移;
,而(REM> = 0x20的)
{
str.Append((炭)((0x20的|(REM &安培; 0x1F的))+ 63));
雷姆>> = 5;
}
str.Append((炭)(REM + 63));
} );

INT lastLat = 0;
INT lastLng = 0;
的foreach(在分VAR点)
{
INT纬度=(int)的Math.Round(point.Latitude * 1E5);
INT LNG =(int)的Math.Round(point.Longitude * 1E5);
encodeDiff(LAT - lastLat);
encodeDiff(LNG - lastLng);
lastLat =纬度;
lastLng = LNG;
}
返回str.ToString();
}



希望帮助别人了。


Does anyone have a concise and robust implementation of Google's Encoded Polyline Algorithm in C#?

I essentially want the implementation of this signature:

public string Encode(IEnumerable<Point> points);

解决方案

Here's the implementation I settled on:

public static string Encode(IEnumerable<GeoLocation> points)
{
    var str = new StringBuilder();

    var encodeDiff = (Action<int>)(diff => {
        int shifted = diff << 1;
        if (diff < 0)
            shifted = ~shifted;
        int rem = shifted;
        while (rem >= 0x20)
        {
            str.Append((char)((0x20 | (rem & 0x1f)) + 63));
            rem >>= 5;
        }
        str.Append((char)(rem + 63));
    });

    int lastLat = 0;
    int lastLng = 0;
    foreach (var point in points)
    {
        int lat = (int)Math.Round(point.Latitude * 1E5);
        int lng = (int)Math.Round(point.Longitude * 1E5);
        encodeDiff(lat - lastLat);
        encodeDiff(lng - lastLng);
        lastLat = lat;
        lastLng = lng;
    }
    return str.ToString();
}

Hope that helps someone else out.

这篇关于谷歌的“编码折线算法”的C#实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆