diff --git a/ocitysmap2/index/indexer.py b/ocitysmap2/index/indexer.py index c08240b..a249c8f 100644 --- a/ocitysmap2/index/indexer.py +++ b/ocitysmap2/index/indexer.py @@ -23,6 +23,14 @@ # along with this program. If not, see . +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