[FOSSGIS-Talk] Datenkacheln in Postgis erzeugen

Harald Schwenk harald.schwenk at agentur-geoinfo.de
Sa Mär 10 20:03:11 CET 2012


Hallo Sven,

so wie ich es lese brauchst du eine Zählschleife, die deinen aktuellen Wert 
mit der Abfrage verbindet. SQL ist für diese Dinge eigentlich zu schlicht. 
Du könntest dir aber mal die Funktion "generate_series()" ansehen. Die 
Funktion funktioniert so, dass vom ersten Wert bis zum letzten Wert durch 
gezählt wird.

Kannst du dir auch ansehen, wenn du folgendes select absetzt:

select generate_series(1, 10);

Erweitert um die Schrittweite sieht das so aus:

select generate_series(1, 10, 2);

Die Abweichung von 0,01, musst du mit einer Additionskonstante in deinen 
Code basteln.

Ich bin mir nicht ganz sicher ob ich deine Frage abschließend verstanden 
habe, das folgende select könnte aber zumindest in die Richtung gehen:

SELECT '('|| -21.1 + s.a ||' '|| 30 ||', '|| -10.9 + s.a ||' '|| 25 || ')' 
AS box FROM generate_series(1,10) AS s(a);

Gruß
Harald


Message: 2
Date: Fri, 9 Mar 2012 19:54:35 +0000 (UTC)
From: Sven Geggus <lists at fuchsschwanzdomain.de>
Subject: [FOSSGIS-Talk] Datenkacheln in Postgis erzeugen
To: fossgis-talk-liste at fossgis.de
Message-ID: <jjdn5r$dd2$1 at ultimate100.geggus.net>
Content-Type: text/plain; charset=UTF-8

Hallo zusammen,

ich hätte da mal eine Postgis Frage:

Ausgangspunkt ist eine aus OSM-Daten erzeugte Shapedatei, die alle
Kontinente und Inseln der Welt als Polygon enthält.

Zum Rendering mit Mapnik oder Mapserver möchte ich daraus nun
gekachelte Polygonstücke machen. Wahlweise mit ausgefülltem Wasser
oder ausgefülltem Land.

Für eine Testkachel (um die Kanarischen Inseln rum) kann ich das
schon mit folgenden SQL Befehlen erreichen (coastlines ist eine
Tabelle mit den Polygonen):

Wasser:
SELECT ST_Difference(SetSRID('BOX(-20 30, -10 
25)'::box2d,4326),ST_Collect(the_geom))
FROM coastlines
WHERE st_intersects(SetSRID('BOX(-20 30, -10 25)'::box2d,4326),the_geom)

Land:
SELECT ST_Intersection(SetSRID('BOX(-20 30, -10 
25)'::box2d,4326),ST_Collect(the_geom))
FROM coastlines
WHERE st_intersects(SetSRID('BOX(-20 30, -10 25)'::box2d,4326),the_geom)

Nun stellt sich aber die Frage, wie ich das mache, wenn ich über die
ganze Welt in n° Schritten (mit n zwischen 1 und 10) iterieren will.
Am Besten natürlich noch mit 0.01° Überlappung, sodass beim rendern
keine Artefakte durch Rundung entstehen können.

Habt ihr da einen Vorschlag für mich?

Gruss

Sven

-- 
"If you continue running Windows, your system may become unstable."
(Windows 95 BSOD)

/me is giggls at ircnet, http://sven.gegg.us/ on the Web


------------------------------

_______________________________________________
FOSSGIS-Talk-Liste mailing list
FOSSGIS-Talk-Liste at fossgis.de
https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste


Ende FOSSGIS-Talk-Liste Nachrichtensammlung, Band 38, Eintrag 5
***************************************************************