From 1caac28a67cfddaa269e5899f4530ecf18692dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kom=D1=8Fpa?= Date: Fri, 27 May 2011 03:54:49 +0300 Subject: [PATCH] coastlines - initial --- src/json_getter.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/json_getter.py b/src/json_getter.py index dc735b1..582b657 100644 --- a/src/json_getter.py +++ b/src/json_getter.py @@ -20,11 +20,12 @@ except ImportError: def get_vectors(bbox, zoom, style, vec = "polygon"): bbox_p = projections.from4326(bbox, "EPSG:3857") geomcolumn = "way" + database = "dbname=gis" pxtolerance = 1.5 intscalefactor = 10000 ignore_columns = set(["way_area", "osm_id", geomcolumn, "tags", "z_order"]) - table = {"polygon":"planet_osm_polygon", "line":"planet_osm_line","point":"planet_osm_point"} + table = {"polygon":"planet_osm_polygon", "line":"planet_osm_line","point":"planet_osm_point", "coastline": "coastlines"} a = psycopg2.connect(database) b = a.cursor() b.execute("SELECT * FROM %s LIMIT 1;" % table[vec]) @@ -129,6 +130,30 @@ def get_vectors(bbox, zoom, style, vec = "polygon"): bbox_p[0],bbox_p[1],bbox_p[2],bbox_p[3], ) + elif vec == "coastline": + query = """select ST_AsGeoJSON(ST_TransScale(ST_ForceRHR(ST_Intersection(way,SetSRID('BOX3D(%s %s,%s %s)'::box3d,900913))),%s,%s,%s,%s),0) as %s, 'coastline' as "natural" from + (select (ST_Dump(ST_Multi(ST_SimplifyPreserveTopology(ST_Buffer(way,-%s),%s)))).geom as %s from + (select ST_Union(way) as %s from + (select ST_Buffer(way, %s) as %s from + %s + where + and way && SetSRID('BOX3D(%s %s,%s %s)'::box3d,900913) + ) p + ) p + where ST_Area(way) > %s + ) p + """%(bbox_p[0],bbox_p[1],bbox_p[2],bbox_p[3], + -bbox_p[0],-bbox_p[1],intscalefactor/(bbox_p[2]-bbox_p[0]),intscalefactor/(bbox_p[3]-bbox_p[1]), + geomcolumn, + pixel_size_at_zoom(zoom, pxtolerance),pixel_size_at_zoom(zoom, pxtolerance), + geomcolumn, + geomcolumn, + pixel_size_at_zoom(zoom, pxtolerance), + geomcolumn, + table[vec], + bbox_p[0],bbox_p[1],bbox_p[2],bbox_p[3], + pixel_size_at_zoom(zoom, pxtolerance)**2 + ) #print query a = psycopg2.connect(database) b = a.cursor() @@ -195,7 +220,8 @@ bbox = projections.bbox_by_tile(z+1,x,y,"EPSG:3857") style = MapCSS(0,30) style.parse(open("styles/osmosnimki-maps.mapcss","r").read()) zoom = z+2 -aaaa = get_vectors(bbox,zoom,style,"polygon") +aaaa = get_vectors(bbox,zoom,style,"coastline") +aaaa["features"].extend(get_vectors(bbox,zoom,style,"polygon")["features"]) aaaa["features"].extend(get_vectors(bbox,zoom,style,"line")["features"]) aaaa["features"].extend(get_vectors(bbox,zoom,style,"point")["features"])