2011-02-27 10 views
5

मेरे पास कुछ सी # कोड है जो Google के पॉलीलाइन एल्गोरिदम का उपयोग करके एन्कोड किए गए मानचित्र पथ को डीकोड करता है और इसे VB.NET में परिवर्तित करने की कोशिश कर रहा हूं।सी # से वीबीएनईटी रूपांतरण (Google पॉलीलाइन एल्गोरिदम डीकोडर)

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 code- अक्षांश देशांतर के लिए नहीं बल्कि काम करता है:

यहाँ सी # कोड है, जो पूरी तरह से काम करता है।

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 दिनों के लिए उत्तर के रूप में नहीं चुन सकता)।

+0

(मेरा उत्तर नष्ट कर दिया के रूप में मुझे नहीं लगता कि यह मदद कर रहा था है और मेरी वीबी केवल पढ़ने के लिए विकृत हो गया है, तो मैं करके इसे ठीक नहीं कर सकते हैं:

यहाँ सुधारा VB.NET कोड है अकेले नज़र) –

+0

किस तरह से यह काम नहीं करता है? क्या यह संकलित करता है? गलत परिणाम दिखाता है, सी # संस्करण से अलग? – tiago2014

+0

अक्षांश के लिए गलत आउटपुट देता है। – amb9800

उत्तर

2

आह तो मुद्दा यह है कि सी # ++ ऑपरेटर चर वृद्धि कर देता है लेकिन मूल मान देता है, जबकि ऊपर मेरी VB.NET रूपांतरण सूचकांक incrementing गया था और तब वृद्धि मूल्य का उपयोग किया गया था। किसी भी तरह से अभी भी लंबे समय तक काम किया लेकिन अक्षांश डिकोडिंग गड़बड़ कर दिया। ,

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

यदि आप लक्ष्य भाषा नहीं जानते हैं, तो डीबग मोड में अपना स्रोत कोड संकलित करें, और उसके बाद प्रतिबिंबक का उपयोग करके इसे संकलित करें। इस तरह आप var नाम रखते हैं, और आपका यकीन है कि जेनरेट कोड मान्य है।

पता है कि VB.Net "नाजुक" तार्किक ऑपरेटरों कि आपके कोड तर्क को तोड़ सकते थे है रहें: या बनाम OrElse ...

+2

तार्किक ऑपरेटरों "नाजुक" नहीं हैं। 'OrElse' शॉर्ट सर्किटिंग जोड़ता है। 'या' थोड़ा सा ऑपरेटर है, और तार्किक तुलना * बिना * शॉर्ट सर्किटिंग करता है। कुछ "नाज़ुक" कहने के लिए उचित नहीं है क्योंकि प्रोग्रामर को यह समझने की आवश्यकता होती है कि यह कैसे काम करता है। –

+0

ठीक है, वे हैं। यदि आप लक्ष्य भाषा नहीं जानते हैं और आप कुछ कार्यात्मक चाहते हैं, तो आपको नौकरी करने के लिए एक बड़ी किताब नहीं पढ़नी पड़ेगी। – Lotfi

+1

मैं वास्तव में उत्सुक हूं कि प्रोग्रामिंग भाषा आप बिना ऑपरेटर कैसे काम कर सकती है यह जानने के बिना कार्यात्मक कोड लिख सकते हैं। क्या आप मेरे लिए एक नाम दे सकते हैं? * गारंटीकृत * कि वीबी पर एक अच्छी व्यापक पुस्तक सी ++ पर एक के रूप में 'विशाल' नहीं है। –

0

वहाँ Telerik द्वारा एक ऑनलाइन कनवर्टर है: Convert VB to C# or C# to VB

+0

हाँ, जहां मैंने शुरू किया था- मैंने ऊपर पोस्ट किए गए कार्यों को प्राप्त करने के लिए वीबीएनईटी आउटपुट को साफ़ किया। – amb9800

+0

@ amb9800 आपका वीबीएनईटी कोड और टेलीरिक द्वारा उत्पन्न एक ऐसा नहीं देखा जाता है। आपने 'लूप' को 'लूप' के लिए बदल दिया है, आदि क्यों? – tiago2014

संबंधित मुद्दे