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;
//}
}
存档。