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 |