wondering if anyone could help me. I'm trying to return the results of lat and lng of an address. New to coding and have got stuck. The following code worked fine until the Geocoding went from v2 to v3. Can you tell me where I'm going wrong? and do I need a new v3 key or key at all? Thanks in advance.
<%
Function GetXML(url)
Dim xmlobj
Set xmlobj = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
xmlobj.setTimeouts 30000, 30000, 30000, 30000
xmlobj.Open "GET", url, False
xmlobj.send()
If xmlobj.status = 200 Then
GetXML = xmlobj.responseXML.xml
Else
Response.Write "The geocoding server could not be reached."
Response.End
End If
End Function
address = "30 Dixon, EN76HA"
url="http://maps.google.com/maps/geo?output=xml&key=XXXXXXX &q="&Server.URLEncode(address)
Response.Write "You entered: "&address&"<br />"
xml = GetXML(url) 'Function to return raw XML as text
if InStr(xml,"<coordinates>")>0 then
coords = split(xml,"<coordinates>") 'Get everything after the opening coordinates tag
coords2 = split(coords(1),"</coordinates>") 'Get everything before the ending coordinates tag
coordinatesSplit = split(coords2(0),",") 'split it at the commas
lng = coordinatesSplit(0) 'The first value is the longitude
lat = coordinatesSplit(1) 'The second value is the latitude
Response.Write "The geo-coded coordinates are: "&lat&" "&lng
else
'No coordinates were returned
Response.Write "The address could not be geocoded."
Response.End
end if
%>
Your code is not working because the URL is different for the Google Geocoding API v3, if I go to your URL in browser;
http://maps.google.com/maps/geo?output=xml&q=30%20Dixon,%20EN76HA
I get the following response;
<?xml version="1.0" encoding="UTF-8" ?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Response>
<Status>
<code>610</code>
<request>geocode</request>
<error_message>The Geocoding API v2 has been turned down on September 9th, 2013. The Geocoding API v3 should be used now. Learn more at https://developers.google.com/maps/documentation/geocoding/</error_message>
</Status>
</Response>
</kml>
Your code will never find the <coordinates>
element and so will fail every time.
The solution
Based on code I've used for this exact purpose I've made a few minor changes to your source. You don't actually need to pass a key if you stay within the limits on usage set up by the google maps api but if you have a api key already then just add it into the url
variable.
<%
Function GetXML(addr)
Dim objXMLDoc, url, docXML, lat, lng, mapref
'URL for Google Maps API - Doesn't need to stay here could be stored in a
'config include file or passed in as a function parameter.
url = "http://maps.googleapis.com/maps/api/geocode/xml?address={addr}&sensor=false"
'Inject address into the URL
url = Replace(url, "{addr}", Server.URLEncode(addr))
Set objXMLDoc = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
objXMLDoc.setTimeouts 30000, 30000, 30000, 30000
objXMLDoc.Open "GET", url, False
objXMLDoc.send()
If objXMLDoc.status = 200 Then
Set docXML = objXMLDoc.responseXML
'Check the response for a valid status
If UCase(docXML.documentElement.selectSingleNode("/GeocodeResponse/status").Text) = "OK" Then
lat = docXML.documentElement.selectSingleNode("/GeocodeResponse/result/geometry/location/lat").Text
lng = docXML.documentElement.selectSingleNode("/GeocodeResponse/result/geometry/location/lng").Text
'Create array containing lat and long
mapref = Array(lat, lng)
Else
mapref = Empty
End If
Else
mapref = Empty
End If
'Return array
GetXML = mapref
End Function
Dim coords, address
address = "30 Dixon, EN76HA"
coords = GetXML(address)
'Do we have a valid array?
If IsArray(coords) Then
Response.Write "The geo-coded coordinates are: " & Join(coords, ",")
Else
'No coordinates were returned
Response.Write "The address could not be geocoded."
End If
%>