谷歌的“编码折线算法”的C#实现 [英] C# implementation of Google's 'Encoded Polyline Algorithm'
本文介绍了谷歌的“编码折线算法”的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屋!
查看全文