Exemplo n.º 1
0
def nearby():
    estimate = hulop.localize_image(
        request.files['image'],
        request.form['user'],
        request.form['map']
    )
    if estimate:
        loc = estimate['t']
        results = []
        radius = request.form['radius']
        for h in database.query('select * from hotspots'):
            h_loc = (h['x'],h['y'],h['z'])
            if util.dist(loc[:2], h_loc[:2]) < radius:
                direction = util.clockwise(estimate['t'], estimate['R'], h_loc)
                results.append({'description': h['category'], 'direction': direction})
        return json.dumps({'location':estimate, 'nearby':results})
    else:
        return json.dumps({'error': 'could not localize'}), 400
Exemplo n.º 2
0
def nearby():
    estimate = hulop.localize_image(request.files['image'],
                                    request.form['user'], request.form['map'])
    if estimate:
        loc = estimate['t']
        results = []
        radius = request.form['radius']
        for h in database.query('select * from hotspots'):
            h_loc = (h['x'], h['y'], h['z'])
            if util.dist(loc[:2], h_loc[:2]) < radius:
                direction = util.clockwise(estimate['t'], estimate['R'], h_loc)
                results.append({
                    'description': h['category'],
                    'direction': direction
                })
        return json.dumps({'location': estimate, 'nearby': results})
    else:
        return json.dumps({'error': 'could not localize'}), 400
Exemplo n.º 3
0
    def _process_rings(self,edges=None,faces=None,edge_si=None,face_si=None):

        self._rings = list()    # initialisation des périmètres du graphe

        # facilité d'écriture pour la suite + travail fait une seule fois
        if edges is None: edges = map(lambda e: e._geom,self._edges)
        if faces is None: faces = map(lambda f: f._geom,self._faces)

        # index spatiaux basés sur les arcs et les faces s'ils n'ont pas été fournis
        if edge_si is None: edge_si = geometry_spatial_index(edges)
        if face_si is None: face_si = geometry_spatial_index(faces)

        # listes des périmètres extérieurs et de leur géométrie préparée
        # les périmètres n'ont pas leur propre géométrie mais pointent vers les faces
        rings = map(lambda f: f.exterior,faces)
        preps = map(lambda r: prep(r), rings)

        # boucle sur les faces/périmètres extérieurs (ils se correspondent !)
        for f,(ring,pring) in enumerate(zip(rings,preps)):

            # indices des arcs qui composent le périmètre courant
            indexes  = list(edge_si.intersection(ring.bounds))
            indexes  = filter(lambda i: pring.contains(edges[i]),indexes)

            # séquence d'arcs orientés décrivant le périmètre courant
            # orientation de l'arc (sens aiguilles d'une montre ou inverse)
            content = build_ring(ring,map(lambda i: edges[i],indexes),indexes)
            edge_clockwise = clockwise(ring)

            # mise à jour des arcs composant le périmètre (_left_face ou _right_face) 
            for noedge, direct in content:
                right_attrname = '_right_face' if edge_clockwise == direct else '_left_face'
                setattr(self._edges[noedge],right_attrname,f)
                # print getattr(self._edges[noedge],right_attrname)

            # mise à jour de la face correspondante
            self._faces[f]._extring = len(self._rings)

            # ajout du périmètre (instance Ring) dans le graphe
            self._rings.append(Ring(edge_clockwise,content))

        for face_container, all_holes in enumerate(holes(faces,face_si)):

            # quand un trou est bouché par PLUSIEURS faces, le ring n'existe
            # pas déjà (il n'est pas LE ring extérieur d'UNE FACE).
            
            for hole in all_holes:

                if len(hole) == 1:
                    self._faces[face_container]._intrings.append(self._faces[hole[0]]._extring)
                    continue

                # il va falloir créer un nouveau ring ...
                # il faut prendre le périmètre extérieur de l'union des faces du trou
                # et enlever, dans les arcs constituant les périmètre extérieurs
                
                newring   = unary_union(map(lambda h: self._faces[h]._geom,hole)).exterior
                all_edges = set()
                for h in hole:
                    for noedge, _ in self._rings[self._faces[h]._extring]._edges:
                        all_edges.add(noedge)

                true_edges = filter(lambda e: newring.contains(self._edges[e]._geom),all_edges)
                
                newring = Ring(clockwise(newring),build_ring(newring,map(lambda e: self._edges[e]._geom,true_edges),true_edges))
                
                
                idring = len(self._rings)
                self._rings.append(newring)
                self._faces[face_container]._intrings.append(idring)
            

            for included_faces in all_holes:
                for noface in included_faces:
                    for noedge,_ in self._rings[self._faces[noface]._extring]._edges:
                        if self._edges[noedge]._left_face is None:
                            self._edges[noedge]._left_face = face_container
                        if self._edges[noedge]._right_face is None:
                            self._edges[noedge]._right_face = face_container

        # il peut rester des arcs "flottants" au beau milieu d'une face
        for edge in self._edges:
            if (edge._left_face,edge._right_face) != (None,None):
                continue
            candidates = list(face_si.intersection(edge._geom.bounds))
            if not candidates: continue
            candidates = filter(lambda c: self._faces[c]._geom.contains(edge._geom),candidates)
            assert len(candidates) in (0,1)
            if len(candidates) == 1:
                edge._left_face = edge._right_face = candidates[0]