def parse_json(self, page, exactly_one=True): """Parse display name, latitude, and longitude from an JSON response.""" if not isinstance(page, basestring): page = decode_page(page) resources = json.loads(page) if exactly_one and len(resources) != 1: from warnings import warn warn("Didn't find exactly one resource!" + \ "(Found %d.), use exactly_one=False\n" % len(resources) ) def parse_resource(resource): location = resource['display_name'] latitude = resource['lat'] or None longitude = resource['lon'] or None if latitude and longitude: latitude = float(latitude) longitude = float(longitude) return (location, (latitude, longitude)) if exactly_one: return parse_resource(resources[0]) else: return [parse_resource(resource) for resource in resources]
def parse_json(self, page, exactly_one=True): if not isinstance(page, basestring): page = util.decode_page(page) doc = json.loads(page) results = doc.get('ResultSet', []).get('Results', []) if not results: raise ValueError("No results found") elif exactly_one and len(results) != 1: raise ValueError("Didn't find exactly one placemark! " \ "(Found %d.)" % len(results)) def parse_result(place): line1, line2, line3, line4 = place.get('line1'), place.get('line2'), place.get('line3'), place.get('line4') address = util.join_filter(", ", [line1, line2, line3, line4]) city = place.get('city') state = place.get('state') country = place.get('country') location = util.join_filter(", ", [address, city, country]) lat, lng = place.get('latitude'), place.get('longitude') #if lat and lng: # point = Point(floatlat, lng) #else: # point = None return (location, (float(lat), float(lng))) if exactly_one: return parse_result(results[0]) else: return [parse_result(result) for result in results]
def parse_json(self, page, exactly_one=True): if not isinstance(page, basestring): page = util.decode_page(page) doc = json.loads(page) places = doc.get('results', []) if len(places) == 0: # Got empty result. Parse out the status code and raise an error if necessary. status = doc.get("status", []) self.check_status_code(status) return None elif exactly_one and len(places) != 1: raise ValueError("Didn't find exactly one placemark! " \ "(Found %d.)" % len(places)) def parse_place(place): location = place.get('formatted_address') longitude = place['geometry']['location']['lng'] latitude = place['geometry']['location']['lat'] return (location, (latitude, longitude)) if exactly_one: return parse_place(places[0]) else: return [parse_place(place) for place in places]
def parse_xml(self, page, exactly_one=True): """Parse a location name, latitude, and longitude from an XML response. """ if not isinstance(page, basestring): page = util.decode_page(page) try: doc = xml.dom.minidom.parseString(page) except ExpatError: places = [] doc = None else: places = doc.getElementsByTagName('Placemark') if len(places) == 0 and doc is not None: # Got empty result. Parse out the status code and raise an error if necessary. status = doc.getElementsByTagName("Status") status_code = int(util.get_first_text(status[0], 'code')) self.check_status_code(status_code) if exactly_one and len(places) != 1: raise ValueError("Didn't find exactly one placemark! " \ "(Found %d.)" % len(places)) def parse_place(place): location = util.get_first_text(place, ['address', 'name']) or None points = place.getElementsByTagName('Point') point = points and points[0] or None coords = util.get_first_text(point, 'coordinates') or None if coords: longitude, latitude = [float(f) for f in coords.split(',')[:2]] else: latitude = longitude = None _, (latitude, longitude) = self.geocode(location) return (location, (latitude, longitude)) if exactly_one: return parse_place(places[0]) else: return [parse_place(place) for place in places]
def parse_json(self, page, exactly_one): if not isinstance(page, basestring): page = util.decode_page(page) doc = json.loads(page) places = doc.get('geonames', []) if not places: return None if exactly_one and len(places) != 1: raise ValueError("Didn't find exactly one code! " \ "(Found %d.)" % len(places)) def parse_code(place): latitude = place.get('lat', None) longitude = place.get('lng', None) if latitude and longitude: latitude = float(latitude) longitude = float(longitude) else: return None placename = place.get('name') state = place.get('adminCode1', None) country = place.get('countryCode', None) location = ', '.join(filter(lambda x: bool(x), [placename, state, country] )) return (location, (latitude, longitude)) if exactly_one: return parse_code(places[0]) else: return [parse_code(place) for place in places]
def parse_json(self, page, exactly_one=True): """Parse a location name, latitude, and longitude from an JSON response.""" if not isinstance(page, basestring): page = decode_page(page) doc = json.loads(page) resources = doc['resourceSets'][0]['resources'] if exactly_one and len(resources) != 1: raise ValueError("Didn't find exactly one resource! " \ "(Found %d.)" % len(resources)) def parse_resource(resource): stripchars = ", \n" a = resource['address'] address = a.get('addressLine', '').strip(stripchars) city = a.get('locality', '').strip(stripchars) state = a.get('adminDistrict', '').strip(stripchars) zipcode = a.get('postalCode', '').strip(stripchars) country = a.get('countryRegion', '').strip(stripchars) city_state = join_filter(", ", [city, state]) place = join_filter(" ", [city_state, zipcode]) location = join_filter(", ", [address, place, country]) latitude = resource['point']['coordinates'][0] or None longitude = resource['point']['coordinates'][1] or None if latitude and longitude: latitude = float(latitude) longitude = float(longitude) return (location, (latitude, longitude)) if exactly_one: return parse_resource(resources[0]) else: return [parse_resource(resource) for resource in resources]