Example #1
0
    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))
Example #2
0
    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))
Example #3
0
    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))
Example #4
0
    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))
Example #6
0
File: wiki_gis.py Project: dpla/zen
    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))
Example #7
0
    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))
Example #9
0
 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]