Преобразование C # в VB.NET (Google Polyline Algorithm Decoder)

У меня есть код 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 дня).

5
задан amb9800 27 February 2011 в 10:14
поделиться