سؤال

أود الحصول على زوج من الإحداثيات (خط الطول، خط العرض) من عنوان بريد.

أنا ترميز VBA في مصنف Excel. أستطيع أن أفترض أن Google Earth مثبت وتسجيل كخادم COM. وبالتالي، كنت أبحث عن طريقة لاستخدام API Google Earth COM لتحقيق ذلك، لكنني لم تتمكن من العثور على أي شيء.

معظم الزيارات التي عثرت عليها على الويب هي لمبرمجي الويب وهي تدور حول استخدام "API Google Geocoding API" وهو JavaScript، الذي أعتقد أنه غير ممكن لحالتي.

(التحديث: كان سيتم القيام بذلك كعمل دفعة عشرات العشرات / مئات العناوين. كما أشار RJMunro، إنه خاص وبالتالي ضد شروط استخدام Google، لذلك اضطررت إلى البحث عن خدمة مختلفة.)

هل كانت مفيدة؟

المحلول

لماذا تريد استخدام جوجل الأرض؟ لا يمكن أن Geocode إذا لم يكن الكمبيوتر على الإنترنت، وإذا كان عبر الإنترنت، فقد تستخدم أيضا APIs ويب مباشرة. هناك الكثير من الأمثلة من استخدام VBA للوصول إلى Apis Geocoding على الويب، سواء مع Google، ومع مزودي آخرين (Bing و Yahoo وما إلى ذلك).

لاحظ أنه إذا كان هذا هو تطبيق خاص، بدلا من أحد أي شخص يمكنه التنزيل، فقد يتعارض مع شروط الخدمة Google، وقد تحتاج إلى استخدام مزود مختلف. يرى هذا السؤال في أسئلة وأجوبة في Google.

نصائح أخرى

طورت هذا Excel Addin. للقيام بما طلبك، قد تجد أنه مفيد.

هو، بالطبع، متروك لك لاحترام من جوجل.

(يفرض Addin حدود أسعار Google، كما هو محدد في وثائقها).

لقد فعلت ذلك بالفعل في VBA، سأقدم لك حلاي:

يمكنني استخدام API Google Earth (مرجع: مكتبة نوع الأرض 1.0) أبدأ بأخذ معلومات العنوان (من أدوات الخلية .range (RnggeCoderAddress)). أقوم بإنشاء بيانات KML للنقطة وأرسلها إلى Google Earth (ربما لا تكون ضرورية)، ثم قم بتنفيذ بحث في معلومات العنوان. سيؤدي ذلك إلى تشغيل Google للبدء في تكبير الموقع المناسب.

في حلقة، أقوم بمراقبة Google Earth بشكل دوري لمعرفة ما إذا كان لا يزال في عملية التكبير إلى موقع جديد. بمجرد توقف الأمر عن الحركة، أعلم أنه قد تم تكبيره إلى نتيجة البحث، ويمكنني التقاط اللقط باستخدام GetPointOnterrainfromscroencoords (0،0)

النتيجة النهائية هي أنني استخدمت Google Earth إلى Geocode العنوان.

Public Sub LookUpAddress_Click()
    Dim GEI As ApplicationGE
    Dim PointOnTerrain As PointOnTerrainGE
    Dim Search As SearchControllerGE
    Dim KMLData As String
    Dim row As Long

    'Get the row of the location selected to look up'
    With ddGeocoderID()
        If .listCount <= 1 Then Exit Sub
        row = .ListIndex + 1
    End With

    Set GEI = GEInit()
    If GEI Is Nothing Then Exit Sub

    KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
            "<kml xmlns=""http://www.opengis.net/kml/2.2"">" & _
            "<Placemark>" & _
                "<name>" & ddGeocoderID().List(ddGeocoderID().ListIndex) & "</name>" & _
                "<visibility>1</visibility>" & _
                "<open>1</open>" & _
                "<description>" & "<![CDATA[" & Tools.Range(rngGeocoderDescription) & "]]></description>" & _
                "<address>" & Tools.Range(rngGeocoderAddress) & "</address>" & _
            "</Placemark>" & _
            "</kml>"
    GEI.LoadKmlData KMLData

    Set Search = GEI.SearchController()
    Call Search.Search(Tools.Range(rngGeocoderAddress))
    Dim resul As Variant
    Set resul = Search.GetResults()
    Dim lat As Double, lon As Double, prevlat As Double, prevlon As Double, checkChange As Double
    Dim steady As Boolean
    steady = False: checkChange = -1
    lat = 0: lon = 0: prevlat = -1: prevlon = -1
    While Not steady
        Set PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
        lat = PointOnTerrain.Latitude
        lon = PointOnTerrain.Longitude
        lblGeoedLat().Caption = sigFigs(lat, 8)
        lblGeoedLong().Caption = sigFigs(lon, 8)
        DoEvents
        If (checkChange = 100) Then
            If (lat = prevlat And lon = prevlon) Then steady = True
            prevlat = lat: prevlon = lon
            checkChange = -1
        End If
        checkChange = checkChange + 1
        Sleep 10
    Wend
End Sub

إليك بعض لقطات الشاشة التي توضح كيف جعلتها تعمل مع واجهة مستخدم:

الصورة 1. أدخل عنواناenter image description here

الصورة 2. انقر فوق Geocode، Code ينتظر التكبير للتوقفenter image description here

الصورة 3. يسجل الرمز التسجيل النقر فوق Lat / Long المستخدم النهائي إذا كانت راضية.enter image description here

لقد حاولت حلق الكود إلى Geocode العديد من المواقع برمجيا. إنه يعمل بشكل أفضل إذا قمت بتكوين سرعة تكبير Google Earth لتكون سريعة جدا (ولكن ليس فوريا)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top