Statistics
| Revision:

svn-gvsig-desktop / tags / Root_Fmap_GisPlanet / libraries / libFMap / docs / AnĂ¡lisis PostGIS Layer.txt @ 1826

History | View | Annotate | Download (5.45 KB)

1
- OJO: Las capas basadas en bases de datos espaciales trabajan de forma
2
  poco uniforme. Las llamadas a las funciones no son iguales, unas
3
  tienen m?s funcionalidades que otras, e incluso las llamadas para
4
  crear entidades WKT son disitintas. Por ejemplo, para PostGis se
5
  usa GeometryFromText, y para mySQL se usa GeomFromText. Y las
6
  consultas de intersecci?nes tambi?n son distintas, y muchas cosas
7
  m?s. Habr? que mirar c?mo lo han homogeneizado en GT2.
8

    
9

    
10
Para la capa PostGIS, necesitaremos tener en cuenta:
11

    
12
- Para la conexi?n, necesitamos los par?metros de conexi?n a la base de datos:
13
	? Host.
14
	? Port.
15
	? Nombre de la base de datos.
16
	? Usuario.
17
	? Contrase?a.
18
	? Sentencia SQL que vamos a usar para obtener la informaci?n.
19
	
20
- Siguiendo el ejemplo de MapServer (ellos tambi?n necesitan tener un 
21
identificador ?nico por fila <=> Acceso random)
22
LAYER
23
 CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
24
 DATA "the_geom FROM (SELECT roads.oid AS oid, roads.the_geom AS the_geom, road_names.name as name
25
   FROM roads LEFT JOIN road_names ON roads.road_name_id = road_names.road_name_id) AS named_roads
26
   USING UNIQUE oid USING SRID=-1"
27
 MAXSCALE 20000
28

    
29
- Necesitaremos un Asistente (Wizard) para la conexi?n y la creaci?n de la consulta
30
  SQL. Notar lo de "USING UNIQUE oid". Lo del SRID es el c?digo EPSG de 
31
  la proyecci?n en la que quieres recuperar los datos. (Es decir, los
32
  puedes obtener reproyectados ya. Eso afecta a la hora de crear la SQL,
33
  en ese Wizard hay que tener en cuenta la proyecci?n de la vista sobre
34
  la que quieres a?adir ese tema).
35
  
36
- Por cuestiones de velocidad: ?Cabe la posibilidad de usar sus propias entidades
37
  gr?ficas o ser?a mejor hacer nuestro propio driver que entregue entidades
38
  FShape?. => Hacer una prueba con sus entidades primero.
39
  Ya he hecho la prueba. Es mejor con nuestras entidades. Pero quedan
40
  unas pruebas muy importantes: comprobar si se puede con el driver 8.0
41
  obtener las entidades binarias, y traducir a partir de ah? a IGeometry.
42
  
43
  Ejemplo de uso:
44
import java.sql.*; 
45
import java.util.*; 
46
import java.lang.*; 
47
import org.postgis.*; 
48

    
49
public class JavaGIS { 
50
  public static void main(String[] args) 
51
  { 
52
    java.sql.Connection conn; 
53
    try 
54
    { 
55
      /* 
56
      * Load the JDBC driver and establish a connection. 
57
      */  
58
      Class.forName("org.postgresql.Driver"); 
59
      String url = "jdbc:postgresql://localhost:5432/database"; 
60
      conn = DriverManager.getConnection(url, "postgres", ""); 
61
    
62
      /* 
63
      * Add the geometry types to the connection. Note that you 
64
      * must cast the connection to the pgsql-specific connection * implementation before calling the addDataType() method. 
65
      */
66
      ((org.postgresql.Connection)conn).addDataType("geometry","org.postgis.PGgeometry");
67
      ((org.postgresql.Connection)conn).addDataType("box3d","org.postgis.PGbox3d");
68

    
69
      /* 
70
      * Create a statement and execute a select query. 
71
      */ 
72
      Statement s = conn.createStatement(); 
73
      ResultSet r = s.executeQuery("select AsText(geom) as geom,id from geomtable"); 
74
      while( r.next() ) 
75
      { 
76
        /* 
77
        * Retrieve the geometry as an object then cast it to the geometry type. 
78
        * Print things out. 
79
        */ 
80
        PGgeometry geom = (PGgeometry)r.getObject(1); 
81
        int id = r.getInt(2);
82
        System.out.println("Row " + id + ":"); 
83
        System.out.println(geom.toString()); 
84
      }
85
      s.close(); 
86
      conn.close(); 
87
    } 
88
    catch( Exception e ) 
89
    { 
90
      e.printStackTrace(); 
91
    }  
92
  }
93
}
94
 
95

    
96
The "PGgeometry" object is a wrapper object which contains a specific topological geometry object (subclasses of the abstract class "Geometry") depending on the type: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon.
97

    
98
PGgeometry geom = (PGgeometry)r.getObject(1); 
99
if( geom.getType() = Geometry.POLYGON ) 
100
{ 
101
  Polygon pl = (Polygon)geom.getGeometry();
102
  for( int r = 0; r < pl.numRings(); r++ ) 
103
  { 
104
    LinearRing rng = pl.getRing(r);
105
    System.out.println("Ring: " + r); 
106
    for( int p = 0; p < rng.numPoints(); p++ ) 
107
    { 
108
      Point pt = rng.getPoint(p); 
109
      System.out.println("Point: " + p);
110
      System.out.println(pt.toString()); 
111
    } 
112
  } 
113
}
114
 
115
  
116
  
117
- Cuando se est? bajando los datos... ?ponemos alg?n indicador de que no han
118
  bajado todav?a todos (un relojito en el toc, o algo as?).
119
  
120
- Mi idea es que sea una capa un tanto especial, porque si modificamos la
121
  sentencia SQL podemos conseguir que el servidor haga el an?lisis y nos
122
  entregue la capa ya filtrada, o con una serie de operaciones espaciales.
123
  Mejor a?n: 2 sql, una que origina la capa, y otra que te permite hacer
124
  otro tipo de consultas, incluso de las que no devuelven recordsets.
125
  Para permitir esto, le ponemos al adapter funciones que permitan recuperar
126
  la sentencia original. (Ver diagrama de objetos del piloto). 
127
  
128
- Si se acepta el acceso en modo "conectado" (tarde o temprano ser? necesario, 
129
  creo yo), se necesita la DBStrategy, que recupera las entidades que 
130
  se van a pintar con ese extent. Y para ello, si no usamos algo como
131
  lo del "oid" (identificador ?nico), necesitamos recorrer lo que devuelve
132
  de manera secuencial, con el GeometryIterator. Y para que esto sea compatible
133
  con los s?mbolos, necesitaremos lo que ya est? planificado de simbolog?a
134
  tipo GT2, orientado a SLD y con filtros por Feature (le pasas la feature, 
135
  se eval?a dentro del simbolizer (en base al tipo de Geometry y/o sus
136
  atributos) y te devuelve el/los s?mbolos a aplicar.
137
  
138