Statistics
| Revision:

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

History | View | Annotate | Download (5 KB)

1 1638 fjp
Para la capa PostGIS, necesitaremos tener en cuenta:
2
3
- Para la conexi?n, necesitamos los par?metros de conexi?n a la base de datos:
4
	? Host.
5
	? Port.
6
	? Nombre de la base de datos.
7
	? Usuario.
8
	? Contrase?a.
9
	? Sentencia SQL que vamos a usar para obtener la informaci?n.
10
11
- Siguiendo el ejemplo de MapServer (ellos tambi?n necesitan tener un
12
identificador ?nico por fila <=> Acceso random)
13
LAYER
14
 CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
15
 DATA "the_geom FROM (SELECT roads.oid AS oid, roads.the_geom AS the_geom, road_names.name as name
16
   FROM roads LEFT JOIN road_names ON roads.road_name_id = road_names.road_name_id) AS named_roads
17
   USING UNIQUE oid USING SRID=-1"
18
 MAXSCALE 20000
19
20
- Necesitaremos un Asistente (Wizard) para la conexi?n y la creaci?n de la consulta
21 1707 fjp
  SQL. Notar lo de "USING UNIQUE oid". Lo del SRID es el c?digo EPSG de
22
  la proyecci?n en la que quieres recuperar los datos. (Es decir, los
23
  puedes obtener reproyectados ya. Eso afecta a la hora de crear la SQL,
24
  en ese Wizard hay que tener en cuenta la proyecci?n de la vista sobre
25
  la que quieres a?adir ese tema).
26 1638 fjp
27
- Por cuestiones de velocidad: ?Cabe la posibilidad de usar sus propias entidades
28
  gr?ficas o ser?a mejor hacer nuestro propio driver que entregue entidades
29
  FShape?. => Hacer una prueba con sus entidades primero.
30 1707 fjp
  Ya he hecho la prueba. Es mejor con nuestras entidades. Pero quedan
31
  unas pruebas muy importantes: comprobar si se puede con el driver 8.0
32
  obtener las entidades binarias, y traducir a partir de ah? a IGeometry.
33
34 1638 fjp
  Ejemplo de uso:
35
import java.sql.*;
36
import java.util.*;
37
import java.lang.*;
38
import org.postgis.*;
39
40
public class JavaGIS {
41
  public static void main(String[] args)
42
  {
43
    java.sql.Connection conn;
44
    try
45
    {
46
      /*
47
      * Load the JDBC driver and establish a connection.
48
      */
49
      Class.forName("org.postgresql.Driver");
50
      String url = "jdbc:postgresql://localhost:5432/database";
51
      conn = DriverManager.getConnection(url, "postgres", "");
52
53
      /*
54
      * Add the geometry types to the connection. Note that you
55
      * must cast the connection to the pgsql-specific connection * implementation before calling the addDataType() method.
56
      */
57
      ((org.postgresql.Connection)conn).addDataType("geometry","org.postgis.PGgeometry");
58
      ((org.postgresql.Connection)conn).addDataType("box3d","org.postgis.PGbox3d");
59
60
      /*
61
      * Create a statement and execute a select query.
62
      */
63
      Statement s = conn.createStatement();
64
      ResultSet r = s.executeQuery("select AsText(geom) as geom,id from geomtable");
65
      while( r.next() )
66
      {
67
        /*
68
        * Retrieve the geometry as an object then cast it to the geometry type.
69
        * Print things out.
70
        */
71
        PGgeometry geom = (PGgeometry)r.getObject(1);
72
        int id = r.getInt(2);
73
        System.out.println("Row " + id + ":");
74
        System.out.println(geom.toString());
75
      }
76
      s.close();
77
      conn.close();
78
    }
79
    catch( Exception e )
80
    {
81
      e.printStackTrace();
82
    }
83
  }
84
}
85
86
87
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.
88
89
PGgeometry geom = (PGgeometry)r.getObject(1);
90
if( geom.getType() = Geometry.POLYGON )
91
{
92
  Polygon pl = (Polygon)geom.getGeometry();
93
  for( int r = 0; r < pl.numRings(); r++ )
94
  {
95
    LinearRing rng = pl.getRing(r);
96
    System.out.println("Ring: " + r);
97
    for( int p = 0; p < rng.numPoints(); p++ )
98
    {
99
      Point pt = rng.getPoint(p);
100
      System.out.println("Point: " + p);
101
      System.out.println(pt.toString());
102
    }
103
  }
104
}
105
106
107
108
- Cuando se est? bajando los datos... ?ponemos alg?n indicador de que no han
109
  bajado todav?a todos (un relojito en el toc, o algo as?).
110
111
- Mi idea es que sea una capa un tanto especial, porque si modificamos la
112
  sentencia SQL podemos conseguir que el servidor haga el an?lisis y nos
113
  entregue la capa ya filtrada, o con una serie de operaciones espaciales.
114 1707 fjp
  Mejor a?n: 2 sql, una que origina la capa, y otra que te permite hacer
115
  otro tipo de consultas, incluso de las que no devuelven recordsets.
116
  Para permitir esto, le ponemos al adapter funciones que permitan recuperar
117
  la sentencia original. (Ver diagrama de objetos del piloto).
118 1638 fjp
119 1707 fjp
- Si se acepta el acceso en modo "conectado" (tarde o temprano ser? necesario,
120
  creo yo), se necesita la DBStrategy, que recupera las entidades que
121
  se van a pintar con ese extent. Y para ello, si no usamos algo como
122
  lo del "oid" (identificador ?nico), necesitamos recorrer lo que devuelve
123
  de manera secuencial, con el GeometryIterator. Y para que esto sea compatible
124
  con los s?mbolos, necesitaremos lo que ya est? planificado de simbolog?a
125
  tipo GT2, orientado a SLD y con filtros por Feature (le pasas la feature,
126
  se eval?a dentro del simbolizer (en base al tipo de Geometry y/o sus
127
  atributos) y te devuelve el/los s?mbolos a aplicar.
128