Geocoding باستخدام Google Earth
-
19-09-2019 - |
سؤال
أود الحصول على زوج من الإحداثيات (خط الطول، خط العرض) من عنوان بريد.
أنا ترميز 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. أدخل عنوانا
الصورة 2. انقر فوق Geocode، Code ينتظر التكبير للتوقف
الصورة 3. يسجل الرمز التسجيل النقر فوق Lat / Long المستخدم النهائي إذا كانت راضية.
لقد حاولت حلق الكود إلى Geocode العديد من المواقع برمجيا. إنه يعمل بشكل أفضل إذا قمت بتكوين سرعة تكبير Google Earth لتكون سريعة جدا (ولكن ليس فوريا)