我有一些 C# 代码可以解码使用 Google 的折线算法编码的地图路径,并试图将其转换为 VB.NET。
这是 C# 代码,它完全可以工作:
Collection<Double> decodePolyline(string polyline)
{
if (polyline == null || polyline == "") return null;
char[] polylinechars = polyline.ToCharArray();
int index = 0;
Collection<Double> points = new Collection<Double>();
int currentLat = 0;
int currentLng = 0;
int next5bits;
int sum;
int shifter;
while (index < polylinechars.Length)
{
// calculate next latitude
sum = 0;
shifter = 0;
do
{
next5bits = (int)polylinechars[index++] - 63;
sum |= (next5bits & 31) << shifter;
shifter += 5;
} while (next5bits >= 32 && index < polylinechars.Length);
if (index >= polylinechars.Length)
break;
currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
//calculate next longitude
sum = 0;
shifter = 0;
do
{
next5bits = (int)polylinechars[index++] - 63;
sum |= (next5bits & 31) << shifter;
shifter += 5;
} while (next5bits >= 32 && index < polylinechars.Length);
if (index >= polylinechars.Length && next5bits >= 32)
break;
currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
points.Add(Convert.ToDouble(currentLat) / 100000.0);
points.Add(Convert.ToDouble(currentLng) / 100000.0);
}
return points;
}
这是 VB.NET 代码 - 适用于经度但不适用于纬度。
Public Function decodePolyline(ByVal polyline As String) As Collection(Of Double)
If polyline Is Nothing OrElse polyline = "" Then Return Nothing
Dim polylinechars As Char() = polyline.ToCharArray()
Dim points As New Collection(Of Double)
Dim currentLat As Integer = 0
Dim currentLng As Integer = 0
Dim next5bits As Integer
Dim sum As Integer
Dim shifter As Integer
For index As Integer = 0 To polylinechars.Length - 1
'calculate next latitude
sum = 0
shifter = 0
Do
index += 1
next5bits = AscW(polylinechars(index)) - 63
sum = sum Or (next5bits And 31) << shifter
shifter += 5
Loop While next5bits >= 32 AndAlso index < polylinechars.Length
If index >= polylinechars.Length Then
Exit For
End If
currentLat += If((sum And 1) = 1, Not (sum >> 1), (sum >> 1))
'calculate next longitude
sum = 0
shifter = 0
Do
index += 1
next5bits = AscW(polylinechars(index)) - 63
sum = sum Or (next5bits And 31) << shifter
shifter += 5
Loop While next5bits >= 32 AndAlso index < polylinechars.Length
If index >= polylinechars.Length AndAlso next5bits >= 32 Then
Exit For
End If
currentLng += If((sum And 1) = 1, Not (sum >> 1), (sum >> 1))
points.Add(Convert.ToDouble(currentLat) / 100000.0)
points.Add(Convert.ToDouble(currentLng) / 100000.0)
Next
Return points
End Function
少了什么东西?
编辑:解决了这个问题(在下面我的答案中更正了代码,我不能再选择 2 天作为答案)。