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 |
|