2011-02-27 19 views
5

Google'ın polyline algoritmasını kullanarak kodlanmış harita yollarını kodlayan ve onu VB.NET'e dönüştürmeye çalışan bazı C# kodlarım var. İşte enlemler boylamları için değil çalışır Kodunuzu VB.NET varC# to VB.NET Dönüştürme (Google Polyline Algoritma Kod Çözücüsü)

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; 
    } 

:

İşte tam çalışır C# kodu, bu.

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 

Neler eksik?

DÜZENLEME: Sorunu çözdüm (2 gün daha cevap veremediğim, aşağıda yanıtımdaki düzeltilmiş kod).

+0

(silindi cevabım ve benim VB salt okunur indirgenmiş olan, bu yüzden bunu düzeltemez: Burada

düzeltilmiş VB.NET kodu yalnız bakışta) –

+0

Hangi şekilde çalışmıyor? Derler mi? C# sürümünden farklı yanlış sonuçlar gösteriyor? – tiago2014

+0

Enlemler için yanlış çıktı verir. – amb9800

cevap

2

Ah bu yüzden mesele yukarıda benim VB.NET dönüşüm endeksi artırma ve daha sonra arttırılmış değerini kullanıyordum oysa C# ++ operatör değişkenini artıran ancak orijinal değerini verir olmasıydı. Bir şekilde hala boylamlar için çalıştı ama enlem çözmeyi bozdu. Ben yardım ediyordu sanmıyorum,

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 
    Dim index As Integer = 0 

    While index < polylinechars.Length 
     ' calculate next latitude 
     sum = 0 
     shifter = 0 
     Do 
      index += 1 
      next5bits = AscW(polylinechars(index - 1)) - 63 
      sum = sum Or (next5bits And 31) << shifter 
      shifter += 5 
     Loop While next5bits >= 32 AndAlso index < polylinechars.Length 

     If index >= polylinechars.Length Then 
      Exit While 
     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 - 1)) - 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 While 
     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) 
    End While 

    Return points 
End Function 
2

Hedef dili bilmiyorsanız, kaynak kodunuzu hata ayıklama modunda derleyin ve Reflector kullanarak derleyin. Bu şekilde var isimlerini saklarsınız ve oluşturulan kodun geçerli olduğundan emin olun.

VB.Net kodunuzu mantığını kırabilir "narin" mantıksal operatörler vardır unutmayın: YA OrElse vs ...

+2

Mantıksal operatörler "hassas" değildir. 'OrElse' kısa devre ekler. Veya bir bitsel operatördür ve kısa devre yapmadan * mantıklı karşılaştırmalar yapar. Programcının nasıl çalıştığını anlaması gerektiğinden, "hassas" bir şey aramak adil değil. –

+0

Eh, onlar. Eğer hedef dili bilmiyorsanız ve işlevsel bir şey istiyorsanız, işi yapmak için büyük bir kitap okumak zorunda değilsiniz. – Lotfi

+1

Hangi programlama dilinin operatörlerinin nasıl çalıştığını bilmeden işlevsel kod yazabileceğini merak ediyorum. Benim için bir isim verebilir misin? * Garantili * VB ile ilgili kapsamlı bir kitabın C++'da olduğu gibi 'muazzam' olmadığı. –

0

Telerik tarafından bir online çevirici var: Convert VB to C# or C# to VB.

+0

Evet, başladığım şeyi almak için VB.NET çıktısını aldım. – amb9800

+0

@ amb9800 VB.NET kodunuz ve Telerik tarafından oluşturulan kodunuz aynı görünmez. "While" yi "for döngüsü" olarak değiştirdiniz. Neden? – tiago2014