I let the API keys empty, 'cause I don't want to expose my keys. You need to register to infodb.com and google to get API keys !!
#!/usr/bin/python
import os
import sys
import socket
import httplib
import xml.dom.minidom as minidom
from googlemaps import GoogleMaps
""" Get googlemap API module from: http://pypi.python.org/pypi/googlemaps/1.0.2
To get Googlemap API Key:
https://code.google.com/apis/console/?pli=1#project:255524978890:access
"""
lat=38.4193
lon=-122.6978
myip = "99.9.21x.xx" (hidden for the purpose of this blog)
debug=0
#time
lat2timeURL="www.earthtools.org"
#lat2timeFile="/timezone/" + str(lat) + '/' + str(lon)
lat2heightURL="www.earthtools.org"
#lat2heightFile="/height/" + str(lat) + "/" + str(lon)
infodb_apikey = "get your own key"
gmap_apikey = "get your own key"
ip2lat2URL = "api.ipinfodb.com"
ip2lat2File = "/v3/ip-city/?key=" + infodb_apikey + "&format=xml&ip="
def getText(nodeList):
rc = []
for node in nodeList:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
def getXmlElementFromObj(obj, name):
objList = obj.getElementsByTagName(name)[0]
if objList:
return getText(objList.childNodes)
else:
return ""
def DisplayUsage():
sys.stderr.write("\nUsage: %s <address in double-quotes>\n\n" % sys.argv[0])
def EarthData(address):
try:
gmaps = GoogleMaps(gmap_apikey)
lat, lon = gmaps.address_to_latlng(address)
except:
sys.stderr.write("\nUnable to query GoogleMaps\n")
sys.exit(1)
lat2timeFile="/timezone/" + str(lat) + '/' + str(lon)
lat2heightFile="/height/" + str(lat) + "/" + str(lon)
conn = httplib.HTTPConnection(lat2timeURL)
conn.request("GET", lat2timeFile)
resp = conn.getresponse()
if resp.status == 200:
data = resp.read()
if debug:
print data
xml = minidom.parseString(data)
timezoneObj = xml.getElementsByTagName("timezone")
for tmObj in timezoneObj:
nodes = tmObj.childNodes
version = getXmlElementFromObj(tmObj, "version")
lat = getXmlElementFromObj(tmObj, "latitude")
lon = getXmlElementFromObj(tmObj, "longitude")
localtime = getXmlElementFromObj(tmObj, "localtime")
isotime = getXmlElementFromObj(tmObj, "isotime")
utctime = getXmlElementFromObj(tmObj, "utctime")
#print "version=%s" % version
if debug:
print "latitude : %s" % lat
print "longitude : %s" % lon
print "localtime : %s" % localtime
conn.close()
conn = httplib.HTTPConnection(lat2heightURL)
conn.request("GET", lat2heightFile)
resp = conn.getresponse()
if resp.status == 200:
data = resp.read()
if debug:
print data
xml = minidom.parseString(data)
hObj = xml.getElementsByTagName("height")
for h in hObj:
meter = getText(h.getElementsByTagName("meters")[0].childNodes)
feet = getText(h.getElementsByTagName("feet")[0].childNodes)
if debug:
print "Sea-level : %s meters = %s feet" % (meter, feet)
conn.close()
return (lat, lon, localtime, meter, feet)
def GetPublicIp(name):
myip = str(socket.gethostbyname(name))
iplatURL="api.hostip.info"
ip2latFile="/?ip=" + myip + "&position=true"
if debug:
print "IP Address: %s" % myip
ip2lat2File += myip
conn = httplib.HTTPConnection(ip2lat2URL)
conn.request("GET", ip2lat2File)
resp = conn.getresponse()
if resp.status == 200:
data = resp.read()
xml = minidom.parseString(data)
#print data
locObj = xml.getElementsByTagName("Response")
for loc in locObj:
nodes = loc.childNodes
status = getXmlElementFromObj(loc,"statusCode")
if status == "OK":
lat = getXmlElementFromObj(loc, "latitude")
lon = getXmlElementFromObj(loc, "longitude")
countryCode = getXmlElementFromObj(loc, "countryCode")
countryName = getXmlElementFromObj(loc, "countryName")
regionName = getXmlElementFromObj(loc, "regionName")
cityName = getXmlElementFromObj(loc, "cityName")
zipCode = getXmlElementFromObj(loc, "zipCode")
timezone = getXmlElementFromObj(loc, "timeZone")
print "Address : %s %s, %s %s" % (cityName, str(zipCode), regionName, countryName )
conn.close()
"============================== MAIN =================================="
if __name__ == "__main__":
if len(sys.argv) < 2:
DisplayUsage()
sys.exit(1)
else:
addr = sys.argv[1]
print "Querying %s" % addr
(lat, lon, ltime, meter, feet) = EarthData(addr)
print "========================="
print "Address : %s" % addr
print "Latitude : %s" % lat
print "Longitude : %s" % lon
print "Local-time: %s" % ltime
print "Sea-level : %s meters (%s feet)" % (meter, feet)
# print "ip2Lat2=%s%s" % (ip2lat2URL, ip2lat2File)
Example (assume the script above is saved as "earthdata.py"):
bash-4.2$ ./earthdata.py "1450 N McDowell Blvd, Petaluma, CA 94954"
Querying 1450 N McDowell Blvd, Petaluma, CA 94954
=========================
Address : 1450 N McDowell Blvd, Petaluma, CA 94954
Latitude : 38.279534
Longitude : -122.6709223
Local-time: 21 Oct 2012 16:47:33
Sea-level : 12 meters (39.4 feet)
bash-4.2$
I didn't really get what this code is for?
ReplyDeletebuffalotech.com
As the title says, it is to get latitude & longitude, among other things, from an address.
ReplyDeleteThere are many possibilities to use the collected data, for example to calculate solar to lunar calendar, to create custom map, location to area code/zip code etc.
While running this program, I am getting message that "Unable to query GoogleMaps".
ReplyDeleteI dont know what is the problem is.
Please help me
Do you have key to Google API?
DeleteAlso, you need the modify the lines with your own keys:
infodb_apikey = "paste your infodb key here"
gmap_apikey = "paste your googlemap key here"
OR, as explained in https://developers.google.com/maps/documentation/business/articles/usage_limits, you've exceeded the limit or even worse, access to Googlemap has been blocked.
Delete