svn-gvsig-desktop / trunk / libraries / libFMap / docs / AnĂ¡lisis PostGIS Layer.txt @ 4578
History | View | Annotate | Download (5.45 KB)
1 | 2183 | fernando | - 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 | 1638 | fjp | 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 | 1707 | fjp | 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 | 1638 | fjp | |
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 | 1707 | fjp | 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 | 1638 | fjp | 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 | 1707 | fjp | 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 | 1638 | fjp | |
128 | 1707 | fjp | - 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 |