def geocode_url(self, url, attempted=None): if attempted is None: attempted = set() util.logger.debug("Fetching %s...", url) page = self._call_geocoder(url) soup = BeautifulSoup(page) rdf_url = self.parse_rdf_link(soup) util.logger.debug("Fetching %s..." % rdf_url) page = self.urlopen(rdf_url) things, thing = self.parse_rdf(page) # TODO name = self.get_label(thing) attributes = self.get_attributes(thing) for _, value in attributes: latitude, longitude = util.parse_geo(value) if None not in (latitude, longitude): break if None in (latitude, longitude): tried = set() # TODO undefined tried -- is this right? relations = self.get_relations(thing) for _, resource in relations: url = things.get(resource, resource) # pylint: disable=E1103 if url in tried: # Avoid cyclic relationships. continue tried.add(url) name, (latitude, longitude) = self.geocode_url(url, tried) if None not in (name, latitude, longitude): break return (name, (latitude, longitude))
def geocode_url(self, url, attempted=None): if attempted is None: attempted = set() page = urlopen(url) soup = BeautifulSoup(page) rdf_url = self.parse_rdf_link(soup) page = urlopen(rdf_url) things, thing = self.parse_rdf(page) name = self.get_label(thing) attributes = self.get_attributes(thing) for attribute, value in attributes: latitude, longitude = util.parse_geo(value) if None not in (latitude, longitude): break if None in (latitude, longitude): relations = self.get_relations(thing) for relation, resource in relations: url = things.get(resource, resource) if url in tried: # Avoid cyclic relationships. continue tried.add(url) name, (latitude, longitude) = self.geocode_url(url, tried) if None not in (name, latitude, longitude): break return (name, (latitude, longitude))
def parse_xhtml(self, page): soup = isinstance(page, BeautifulSoup) and page or BeautifulSoup(page) meta = soup.head.find('meta', {'name': 'geo.placename'}) name = meta and meta['content'] or None meta = soup.head.find('meta', {'name': 'geo.position'}) if meta: position = meta['content'] latitude, longitude = util.parse_geo(position) if latitude == 0 or longitude == 0: latitude = longitude = None else: latitude = longitude = None return (name, (latitude, longitude))
def parse_xhtml(self, page): soup = isinstance(page, BeautifulSoup) and page or BeautifulSoup(page) meta = soup.head.find("meta", {"name": "geo.placename"}) name = meta and meta["content"] or None meta = soup.head.find("meta", {"name": "geo.position"}) if meta: position = meta["content"] latitude, longitude = util.parse_geo(position) if latitude == 0 or longitude == 0: latitude = longitude = None else: latitude = longitude = None return (name, (latitude, longitude))
def geocode_url(self, url, attempted=None, timeout=None): if attempted is None: attempted = set() util.logger.debug("Fetching %s..." % url) kwargs = dict(url=url) if timeout and sys.version_info > (2,6,0): kwargs['timeout'] = timeout page = urlopen(**kwargs) soup = BeautifulSoup(page) kwargs['url'] = self.parse_rdf_link(soup) util.logger.debug("Fetching %s..." % kwargs['url']) page = urlopen(**kwargs) things, thing = self.parse_rdf(page) name = self.get_label(thing) attributes = self.get_attributes(thing) for attribute, value in attributes: latitude, longitude = util.parse_geo(value) if None not in (latitude, longitude): break if None in (latitude, longitude): relations = self.get_relations(thing) for relation, resource in relations: url = things.get(resource, resource) if url in tried: # Avoid cyclic relationships. continue tried.add(url) name, (latitude, longitude) = self.geocode_url(url, tried) if None not in (name, latitude, longitude): break return (name, (latitude, longitude))
def distanceToHome(self, home): """Returns distance from self to current home location in kilometers.""" return distance.distance(home, util.parse_geo("%s %s" % (self.lat, self.lon))).kilometers
def page_profile(db, utils, data, output_format, input_format): # Extract the route: route = [] if input_format == "protobuf": # Doesn't work in app egine yet, only with Apache import altitudeprofile_pb2 route_pb = altitudeprofile_pb2.Route() route_pb.ParseFromString(data) for point in route_pb.point: route.append({'lat' : point.lat, 'lon' : point.lon}) elif input_format == "xml": dom = minidom.parseString(data) points = dom.getElementsByTagName('gml:pos') for p in points: point = util.parse_geo(p.firstChild.data) route.append({'lat' : point[1], 'lon' : point[0]}) elif input_format == "get": # Transpose would be more elegant here for i in range(len(data[0])): route.append({'lat' : float(data[0][i]), 'lon' : float(data[1][i])}) else: # Some sort of error; we're under attack! :-) route = [] # Find out what the desired output is if output_format == "gchart": url = altitude_profile_gchart(db, route) fig = utils.fetchUrl(url) return ['image/png', fig] elif output_format == "gchart_url": url = altitude_profile_gchart(db, route) return ['text/html', url] elif output_format == "xml": profile = altitude_profile(db, route) # Now return a 'nice' XML document with the result xml = '<?xml version="1.0" encoding="UTF-8"?>' xml += '<xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" version="1.1" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/RouteService.xsd">' xml += ' <xls:RouteGeometry>' xml += ' <gml:LineString srsName="EPSG:4326">' for point in route: xml += ' <gml:pos>' + str(point['lon']) + " " + str(point['lat']) + " " + str(point['alt']) + '</gml:pos>' xml += ' </gml:LineString>' xml += ' </xls:RouteGeometry>' xml += '</xls:XLS>' return ['text/xml', xml] elif output_format == "protobuf": profile = altitude_profile(db, route) profile_pb = altitudeprofile_pb2.Route() for p in profile: point = profile_pb.point.add() point.lat = p['lat'] point.lon = p['lon'] point.alt = p['alt'] profile_pb_string = profile_pb.SerializeToString() return ['text/html', profile_pb_string]