kopia lustrzana https://github.com/hholzgra/ocitysmap
				
				
				
			WIP-1: basig get_streets query
Signed-off-by: David Decotigny <d2@maposmatic.org>stable
							rodzic
							
								
									89caded1f0
								
							
						
					
					
						commit
						d3146f1223
					
				| 
						 | 
				
			
			@ -23,6 +23,14 @@
 | 
			
		|||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import logging
 | 
			
		||||
import locale
 | 
			
		||||
 | 
			
		||||
from ocitysmap2.index import commons
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
l = logging.getLogger('ocitysmap')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StreetIndex:
 | 
			
		||||
    def __init__(self, db, osmid, bounding_box, i18n, grid, polygon):
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +43,7 @@ class StreetIndex:
 | 
			
		|||
 | 
			
		||||
    def _humanize_street_label(self, street):
 | 
			
		||||
        return (self._i18n.user_readable_street(street[0]),
 | 
			
		||||
                self._user_readable_label(street[1]))
 | 
			
		||||
                self._i18n.user_readable_label(street[1]))
 | 
			
		||||
 | 
			
		||||
    def _humanize_street_list(self, sl):
 | 
			
		||||
        """Given a list of street and their corresponding squares, do some
 | 
			
		||||
| 
						 | 
				
			
			@ -70,12 +78,54 @@ class StreetIndex:
 | 
			
		|||
        current_category = None
 | 
			
		||||
        for street in sl:
 | 
			
		||||
            if not self._i18n.first_letter_equal(street[0][0], first_letter):
 | 
			
		||||
                current_category = IndexCategory(street[0])
 | 
			
		||||
                current_category = commons.IndexCategory(street[0])
 | 
			
		||||
                result.append(current_category)
 | 
			
		||||
            current_category.items.append(IndexItem(street[0], street[1]))
 | 
			
		||||
            current_category.items.append(commons.IndexItem(street[0],
 | 
			
		||||
                                                            street[1]))
 | 
			
		||||
 | 
			
		||||
        return result
 | 
			
		||||
 | 
			
		||||
    def get_streets_nogrid(self):
 | 
			
		||||
        """Get the list of streets in the administrative area if city
 | 
			
		||||
        is defined or in the bounding box otherwise. Don't try to map
 | 
			
		||||
        these streets onto the grid of squares.
 | 
			
		||||
 | 
			
		||||
        Returns a list of commons.IndexCategory objects, with their IndexItems
 | 
			
		||||
        having no specific grid location
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        cursor = self._db.cursor()
 | 
			
		||||
        l.info("Getting streets...")
 | 
			
		||||
 | 
			
		||||
        intersect = 'true'
 | 
			
		||||
        if self._polygon:
 | 
			
		||||
            # Limit to the polygon
 | 
			
		||||
            intersect = """st_intersects(way, st_transform(
 | 
			
		||||
                                GeomFromText('%s', 4002), 900913))""" \
 | 
			
		||||
                % self._polygon
 | 
			
		||||
        elif self._bounding_box:
 | 
			
		||||
            # Limit to the bounding box
 | 
			
		||||
            intersect = """st_intersects(way, st_transform(
 | 
			
		||||
                                GeomFromText('%s', 4002), 900913))""" \
 | 
			
		||||
                % self._bounding_box.as_wkt()
 | 
			
		||||
        else:
 | 
			
		||||
            raise ValueError("No suitable bounding box provided")
 | 
			
		||||
 | 
			
		||||
        query = """select distinct name
 | 
			
		||||
                          from planet_osm_line
 | 
			
		||||
                          where trim(name) != ''
 | 
			
		||||
                                and highway is not null
 | 
			
		||||
                                and %s
 | 
			
		||||
                          group by name
 | 
			
		||||
                          order by name;""" % intersect
 | 
			
		||||
        cursor.execute(query)
 | 
			
		||||
        sl = cursor.fetchall()
 | 
			
		||||
 | 
			
		||||
        l.debug("Got streets (%d)." % len(sl))
 | 
			
		||||
 | 
			
		||||
        return sl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def get_streets(self):
 | 
			
		||||
        """Get the list of streets in the administrative area if city is
 | 
			
		||||
        defined or in the bounding box otherwise, and for each
 | 
			
		||||
| 
						 | 
				
			
			@ -108,4 +158,25 @@ class StreetIndex:
 | 
			
		|||
 | 
			
		||||
        sl = cursor.fetchall()
 | 
			
		||||
        l.debug("Got streets (%d)." % len(sl))
 | 
			
		||||
        return self.humanize_street_list(sl)
 | 
			
		||||
        return self._humanize_street_list(sl)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    import os
 | 
			
		||||
    import psycopg2
 | 
			
		||||
    from ocitysmap2 import i18n, coords
 | 
			
		||||
 | 
			
		||||
    db = psycopg2.connect(user='maposmatic',
 | 
			
		||||
                          password='waeleephoo3Aew3u',
 | 
			
		||||
                          host='localhost',
 | 
			
		||||
                          database='maposmatic')
 | 
			
		||||
 | 
			
		||||
    i18n = i18n.install_translation("fr_FR",
 | 
			
		||||
                                    os.path.join(os.path.dirname(__file__),
 | 
			
		||||
                                                 "..", "..", "locale"))
 | 
			
		||||
 | 
			
		||||
    idx_polygon = coords.BoundingBox(48.7097, 2.0333, 48.7048, 2.0462)
 | 
			
		||||
    street_index = StreetIndex(db, None, None, i18n, None,
 | 
			
		||||
                               idx_polygon.as_wkt())
 | 
			
		||||
    sl = street_index.get_streets_nogrid()
 | 
			
		||||
    ### print sl
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue