1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package migratool.ora2pgsql;
27
28 import java.util.Enumeration;
29
30 import oracle.sdoapi.geom.CoordPointImpl;
31 import oracle.sdoapi.geom.Geometry;
32 import oracle.sdoapi.geom.LineString;
33 import oracle.sdoapi.geom.MultiLineString;
34 import oracle.sdoapi.geom.MultiPolygon;
35 import oracle.sdoapi.geom.Point;
36 import oracle.sdoapi.geom.Polygon;
37 import oracle.sdoapi.geom.impl.LinearSegmentImpl;
38
39 import org.apache.log4j.Logger;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public class OracleGeometryParser {
67
68 static final int BIDIMENSIONAL = 2000;
69 static final int GTYPE_POINT = 01;
70 static final int GTYPE_LINE = 02;
71 static final int GTYPE_POLYGON = 03;
72 static final int GTYPE_MULTIPOLYGON = 07;
73
74 static Logger logger = Logger.getLogger(OracleGeometryParser.class.getName());
75
76 public StringBuffer parse(Geometry oracleGeometry) {
77 StringBuffer postgisGeometry = new StringBuffer();
78
79 if (oracleGeometry.getGeometryType() == Point.class) {
80 logger.info("Convertendo um ponto");
81 createPoint(oracleGeometry, postgisGeometry);
82 } else if (oracleGeometry.getGeometryType() == Polygon.class) {
83 logger.info("Convertendo um Pol�gono");
84 createPolygon(oracleGeometry, postgisGeometry);
85 } else if (oracleGeometry.getGeometryType() == MultiPolygon.class) {
86 logger.info("Convertendo um MultiPol�gono");
87 createMultiPolygon(oracleGeometry, postgisGeometry);
88 } else if (oracleGeometry.getGeometryType() == LineString.class) {
89 logger.info("Convertendo um LineString");
90 createLineString(oracleGeometry, postgisGeometry);
91 } else if (oracleGeometry.getGeometryType() == MultiLineString.class) {
92 logger.info("Convertendo um MultiLineString");
93 createMultiLineString(oracleGeometry, postgisGeometry);
94 }
95
96 return postgisGeometry;
97 }
98
99
100
101
102
103 private void createMultiLineString(
104 Geometry oracleGeometry,
105 StringBuffer postgisGeometry) {
106 int srid = oracleGeometry.getSpatialReference().getID();
107 srid =
108 SRIDConverter.getSRID(
109 SRIDConverter.ORACLE,
110 SRIDConverter.POSTGIS,
111 srid);
112 MultiLineString multiLineString = (MultiLineString) oracleGeometry;
113
114 postgisGeometry.append(
115 "GeometryFromText('MULTILINESTRING("
116 + getOrdinateArray(multiLineString)
117 + ")',"
118 + srid
119 + ")");
120 }
121
122
123
124
125
126 private void createLineString(
127 Geometry oracleGeometry,
128 StringBuffer postgisGeometry) {
129 int srid = oracleGeometry.getSpatialReference().getID();
130 srid =
131 SRIDConverter.getSRID(
132 SRIDConverter.ORACLE,
133 SRIDConverter.POSTGIS,
134 srid);
135 LineString lineString = (LineString) oracleGeometry;
136 postgisGeometry.append(
137 "GeometryFromText('LINESTRING"
138 + getOrdinateArray(lineString)
139 + "',"
140 + srid
141 + ")");
142 }
143
144
145
146
147
148 private String getOrdinateArray(Geometry geom) {
149 StringBuffer ordinate = new StringBuffer();
150 Enumeration e = geom.getAllSegments();
151 CoordPointImpl firstCoord = null;
152 while (e.hasMoreElements()) {
153 boolean firstPoint = true;
154 LinearSegmentImpl linearS = (LinearSegmentImpl) e.nextElement();
155
156 int quantidadeDePontos = 0;
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 Enumeration points = linearS.getPoints();
178 ordinate.append("(");
179 while (points.hasMoreElements()) {
180 quantidadeDePontos++;
181 CoordPointImpl point = (CoordPointImpl) points.nextElement();
182 if (firstPoint) {
183 firstCoord = point;
184 firstPoint = false;
185 }
186 ordinate.append(point.getX() + " " + point.getY() + ", ");
187
188 if ((geom.getGeometryType() == Polygon.class)
189 || (geom.getGeometryType() == MultiPolygon.class)) {
190 if (!points.hasMoreElements()) {
191 if ((point.getX() != firstCoord.getX())
192 || (point.getY() != firstCoord.getY())) {
193 ordinate.append(
194 firstCoord.getX()
195 + " "
196 + firstCoord.getY()
197 + ", ");
198 }
199 }
200 }
201 }
202 if (quantidadeDePontos <= 3) {
203
204 }
205 if (ordinate.toString().endsWith(", ")) {
206 int index = ordinate.toString().lastIndexOf(",");
207 ordinate.delete(index, index + 2);
208 }
209 ordinate.append(")");
210 if (e.hasMoreElements()) {
211 ordinate.append(", ");
212 }
213 }
214
215 return ordinate.toString();
216 }
217
218
219
220
221
222 private void createMultiPolygon(
223 Geometry oracleGeometry,
224 StringBuffer postgisGeometry) {
225 int srid = oracleGeometry.getSpatialReference().getID();
226 srid =
227 SRIDConverter.getSRID(
228 SRIDConverter.ORACLE,
229 SRIDConverter.POSTGIS,
230 srid);
231 MultiPolygon multiPolygon = (MultiPolygon) oracleGeometry;
232 postgisGeometry.append(
233 "GeometryFromText('MULTIPOLYGON(("
234 + getOrdinateArray(multiPolygon)
235 + "))',"
236 + srid
237 + ")");
238 }
239
240
241
242
243
244 private void createPolygon(
245 Geometry oracleGeometry,
246 StringBuffer postgisGeometry) {
247 int srid = oracleGeometry.getSpatialReference().getID();
248 srid =
249 SRIDConverter.getSRID(
250 SRIDConverter.ORACLE,
251 SRIDConverter.POSTGIS,
252 srid);
253 Polygon polygon = (Polygon) oracleGeometry;
254 postgisGeometry.append(
255 "GeometryFromText('POLYGON("
256 + getOrdinateArray(polygon)
257 + ")',"
258 + srid
259 + ")");
260 }
261
262
263
264
265
266 private void createPoint(
267 Geometry oracleGeometry,
268 StringBuffer postgisGeometry) {
269 int srid = oracleGeometry.getSpatialReference().getID();
270 srid =
271 SRIDConverter.getSRID(
272 SRIDConverter.ORACLE,
273 SRIDConverter.POSTGIS,
274 srid);
275 Point point = (Point) oracleGeometry;
276 double x = point.getX();
277 double y = point.getY();
278 postgisGeometry.append(
279 "GeometryFromText('POINT(" + x + " " + y + ")'," + srid + ")");
280 }
281 }