On the fly Darstellung von Grenzlängen und Richtungswinkeln: Unterschied zwischen den Versionen

Aus kvwmap
Wechseln zu: Navigation, Suche
Zeile 45: Zeile 45:
 
                   FROM alkobj_e_fla where folie = '001') foofoo) foo
 
                   FROM alkobj_e_fla where folie = '001') foofoo) foo
 
   WHERE (foo.count1 + 1) <= npoints(foo.linestring)  
 
   WHERE (foo.count1 + 1) <= npoints(foo.linestring)  
 +
 +
Gist-Index erzeugen, damit die räumliche Abfrage auch schnell durchgeführt wird:
  
 
  CREATE INDEX grenzabschnitte_gist
 
  CREATE INDEX grenzabschnitte_gist
Zeile 53: Zeile 55:
 
(Dauer ca. 15 Minuten für einen Kompletten Landkreis)
 
(Dauer ca. 15 Minuten für einen Kompletten Landkreis)
  
Damit das Abfragen on the fly funtioniert ist es günstig eine Sicht zu erzeugen
+
Jetzt kann man sich noch eine Sicht erzeugen, in der die Länge und der Richtingswinkel berechnet wird.
  
 
  CREATE OR REPLACE VIEW grenzabschnitte AS  
 
  CREATE OR REPLACE VIEW grenzabschnitte AS  

Version vom 26. August 2010, 12:30 Uhr

--Rainer Gareis 12:19, 26. Aug 2010 (CEST) Darstellung der Grenzlängen und Winkel in der Liegenschaftskarte Um in einem Tooltip-fenster die Grenzlänge(Gl) und den Richtungswinkel(Rw) zu sehen, muß man eine neue Tabelle mit oid und Geometrie erzeugen. In dieser Tabelle steht dann die Flurstücksgeometrie aufgeschlüsselt als Line und nicht mehr als Multipoygon.

Tabelle erzeugen:

 CREATE TABLE grenzabschnitte2( 
 the_geom geometry,
 CONSTRAINT enforce_dims_the_geom CHECK (ndims(the_geom) = 2),
 CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'LINESTRING'::text OR the_geom IS NULL),
 CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 2398)
 )
 WITH (OIDS=TRUE);

um die Tabelle füllen zu können benötigt man eine neue Funktion "linefrompoly"

CREATE OR REPLACE FUNCTION linefrompoly(geometry)
 RETURNS geometry AS
$BODY$SELECT 
     geomfromtext(
		 replace(
			 replace(
				 replace(
					 replace(
						 replace(
 							 replace(
								 replace(
									 asText($1),'MULTIPOLYGON','MULTILINESTRING'
								 ),'POLYGON','LINESTRING'
							 ), '((', '('
						 ), '))', ')'
					 ), '(((', '(('
				 ), ')))', '))'
			 ), '))),(((', ')),(('
		 ), srid($1)
	 )$BODY$
    LANGUAGE 'sql' IMMUTABLE STRICT;


mit folgendem Befehl wird dann die Tabelle gefüllt.

 insert into grenzabschnitte2 SELECT makeline(pointn(foo.linestring, foo.count1), pointn(foo.linestring, foo.count1 + 1)) AS the_geom
  FROM ( SELECT generate_series(1, npoints(foofoo.linestring)) AS count1, foofoo.linestring
          FROM ( SELECT linefrompoly(alkobj_e_fla.the_geom) AS linestring
                  FROM alkobj_e_fla where folie = '001') foofoo) foo
 WHERE (foo.count1 + 1) <= npoints(foo.linestring) 

Gist-Index erzeugen, damit die räumliche Abfrage auch schnell durchgeführt wird:

CREATE INDEX grenzabschnitte_gist
 ON grenzabschnitte2
 USING gist
 (the_geom);

(Dauer ca. 15 Minuten für einen Kompletten Landkreis)

Jetzt kann man sich noch eine Sicht erzeugen, in der die Länge und der Richtingswinkel berechnet wird.

CREATE OR REPLACE VIEW grenzabschnitte AS 
SELECT grenzabschnitte2.oid, grenzabschnitte2.the_geom, round(length(grenzabschnitte2.the_geom)::numeric, 2) AS laenge, 
       CASE
           WHEN round((degrees(atan((x(endpoint(grenzabschnitte2.the_geom)) - x(startpoint(grenzabschnitte2.the_geom))) / (y(endpoint(grenzabschnitte2.the_geom)) - y(startpoint(grenzabschnitte2.the_geom))))) * 1.1111111::double precision)::numeric, 4)::double precision < 0::double precision THEN (round((degrees(atan((x(endpoint(grenzabschnitte2.the_geom)) - x(startpoint(grenzabschnitte2.the_geom))) / (y(endpoint(grenzabschnitte2.the_geom)) - y(startpoint(grenzabschnitte2.the_geom))))) * 1.1111111::double precision)::numeric, 4)::double precision + 400::double precision) || ' gon'::text
           ELSE round((degrees(atan((x(endpoint(grenzabschnitte2.the_geom)) - x(startpoint(grenzabschnitte2.the_geom))) / (y(endpoint(grenzabschnitte2.the_geom)) - y(startpoint(grenzabschnitte2.the_geom))))) * 1.1111111::double precision)::numeric, 4)::double precision::text || ' gon'::text
       END AS winkel
  FROM grenzabschnitte2;

Nun benötigt man nur noch einen abfragbaren Layer ohne klassen.

Mit freundlicher Unterstützung durch STEFAN RAHN ist dieses Kunststück gelungen.