Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.api / src / main / java / org / gvsig / fmap / geom / Geometry.java @ 40559

History | View | Annotate | Download (21.5 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
/*
25
 * AUTHORS (In addition to CIT):
26
 * 2009 {Iver T.I.}   {Task}
27
 */
28

    
29
package org.gvsig.fmap.geom;
30

    
31
import java.awt.Shape;
32
import java.awt.geom.AffineTransform;
33
import java.awt.geom.PathIterator;
34
import java.awt.geom.Rectangle2D;
35
import java.io.Serializable;
36

    
37
import org.cresques.cts.ICoordTrans;
38

    
39
import org.gvsig.fmap.geom.handler.Handler;
40
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
41
import org.gvsig.fmap.geom.operation.GeometryOperationException;
42
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
43
import org.gvsig.fmap.geom.primitive.Envelope;
44
import org.gvsig.fmap.geom.primitive.GeneralPathX;
45
import org.gvsig.fmap.geom.primitive.Point;
46
import org.gvsig.fmap.geom.type.GeometryType;
47

    
48
/**
49
 * <p>
50
 * This interface is equivalent to the GM_Object specified in <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=26012"
51
 * >ISO 19107</a>. It is the root class of the geometric object taxonomy and
52
 * supports interfaces common to all geographically referenced geometric
53
 * objects.
54
 * </p>
55
 * <p>
56
 * Geometry instances are sets of direct positions in a particular coordinate
57
 * reference system. A Geometry can be regarded as an infinite set of points
58
 * that satisfies the set operation interfaces for a set of direct positions.
59
 * </p>
60
 * <p>
61
 * A geometric object shall be a combination of a coordinate geometry and a
62
 * coordinate reference system. In all of the operations, all geometric
63
 * calculations shall be done in the coordinate reference system of the first
64
 * geometric object accessed, which is normally the object whose operation is
65
 * being invoked. Returned objects shall be in the coordinate reference system
66
 * in which the calculations are done unless explicitly stated otherwise.
67
 * </p>
68
 * <p>
69
 * This class extends of the {@link Shape} class by historical reasons but this
70
 * inheritance will disappear in future versions.
71
 * </p>
72
 * @see <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=26012"
73
 *      >ISO 19107< /a>
74
 */
75
public interface Geometry extends Shape, Serializable, Comparable {
76

    
77
        /**
78
         * Predefined geometry types in the model.
79
         */
80
        public interface TYPES {
81

    
82
                /**
83
                 * Any geometry.
84
                 */
85

    
86
                public final static int GEOMETRY = 0;
87

    
88
                /**
89
                 * A geometric element that has zero dimensions and a location
90
                 * determinable by an ordered set of coordinates.
91
                 */
92
                public final static int POINT = 1;
93

    
94
                /**
95
                 * A straight or curved geometric element that is generated by a moving
96
                 * point and that has extension only along the path of the point.
97
                 */
98
                public final static int CURVE = 2;
99

    
100
                /**
101
                 * A closed plane figure bounded by straight lines.
102
                 */
103
                public final static int SURFACE = 3;
104

    
105
                /**
106
                 * Solids in 3D.
107
                 */
108
                public final static int SOLID = 4;
109

    
110
              /**
111
                 * A set that can contain points, lines and polygons. This is usual in
112
                 * <i>CAD</i> layers <i>(dxf, dgn, dwg)</i>.
113
                 */
114
                public final static int AGGREGATE = 6;
115
                /**
116
                 * A set of points.
117
                 */
118
                public final static int MULTIPOINT = 7;
119

    
120
                /**
121
                 * A set of lines.
122
                 */
123
                public final static int MULTICURVE = 8;
124

    
125
                /**
126
                 * A set of polygons.
127
                 */
128
                public final static int MULTISURFACE = 9;
129

    
130
                /**
131
                 * A set of solids.
132
                 */
133
                public final static int MULTISOLID = 10;
134

    
135
                /**
136
                 * A closed plane curve every point of which is equidistant from a fixed
137
                 * point within the curve.
138
                 */
139
                public final static int CIRCLE = 11;
140

    
141
                /**
142
                 * A continuous portion (as of a circle or ellipse) of a curved line.
143
                 */
144
                public final static int ARC = 12;
145

    
146
                /**
147
                 * A closed plane curve generated by a point moving in such a way that
148
                 * the sums of its distances from two fixed points is a constant : a
149
                 * plane section of a right circular cone that is a closed curve.
150
                 */
151
                public final static int ELLIPSE = 13;
152

    
153
                public final static int SPLINE = 14;
154

    
155
                public final static int ELLIPTICARC = 15;
156

    
157
                /**
158
                 * NO DATA geometry.
159
                 */
160
                public final static int NULL = 16;
161
        }
162

    
163
        public interface DIMENSIONS {
164
                public final static int X = 0;
165
                public final static int Y = 1;
166
                public final static int Z = 2;
167
        }
168

    
169
        /**
170
         * The subtype of a geometry is related with the dimension of the geometry,
171
         * that is a combination between the spatial dimension (2D, 2ZD, 3D) and the
172
         * M coordinate or "measure".
173
         * 
174
         * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera</a>
175
         */
176
        public interface SUBTYPES {
177

    
178
                /**
179
                 * Geometries with two dimensions.
180
                 */
181
                public final static int GEOM2D = 0;
182

    
183
                /**
184
                 * Geometries with three dimensions.
185
                 */
186
                public final static int GEOM3D = 1;
187

    
188
                /**
189
                 * Geometries with two dimensions and with the M coordinate.
190
                 */
191
                public final static int GEOM2DM = 2;
192

    
193
                /**
194
                 * Geometries with three dimensions and with the M coordinate.
195
                 */
196
                public final static int GEOM3DM = 3;
197

    
198
                /**
199
                 * The subtype us unknown.
200
                 */
201
                public final static int UNKNOWN = 4;
202
        }
203

    
204
        /**
205
         * Initial value for new geometry types (it must not overlap with the basic
206
         * ones defined in TYPES).
207
         */
208
        public static final int EXTENDED_GEOMTYPE_OFFSET = 17;
209

    
210
        /**
211
         * Initial value for new geometry subtypes (it must not overlap with the
212
         * basic ones defined in SUBTYPES).
213
         */
214
        public static final int EXTENDED_GEOMSUBTYPE_OFFSET = 6;
215

    
216
        public interface OPERATIONS {
217
                public final static String CONVERTTOWKT = "toWKT";
218
                public final static String CONVERTTOWKB = "toWKB";
219
                public final static String BUFFER = "buffer";
220
                public final static String DISTANCE = "Distance";
221
                public final static String CONTAINS = "Contains";
222
                public final static String OVERLAPS = "OVERLAPS";
223
                public final static String CONVEXHULL = "ConvexHull";
224
                public final static String COVERS = "Covers";
225
                public final static String CROSSES = "Crosses";
226
                public final static String DIFFERENCE = "Difference";
227
                public final static String DISJOIN = "Disjoin";
228
                public final static String INTERSECTION = "Intersaction";
229
                public final static String INTERSECTS = "Intersects";
230
                public final static String TOUCHES = "Touches";
231
                public final static String UNION = "Union";
232
                public final static String WITHIN = "Within";
233
                public final static String COVEREDBY = "CoveredBy";
234
        }
235

    
236
        public static int BEST = 0;
237
        /**
238
         * North.
239
         */
240
        public static int N = 1;
241

    
242
        /**
243
         * North - East.
244
         */
245
        public static int NE = 2;
246

    
247
        /**
248
         * East.
249
         */
250
        public static int E = 3;
251

    
252
        /**
253
         * South - East.
254
         */
255
        public static int SE = 4;
256

    
257
        /**
258
         * South.
259
         */
260
        public static int S = 5;
261

    
262
        /**
263
         * South - West.
264
         */
265
        public static int SW = 6;
266

    
267
        /**
268
         * West.
269
         */
270
        public static int W = 7;
271

    
272
        /**
273
         * North - West.
274
         */
275
        public static int NW = 8;
276

    
277
        public static int SELECTHANDLER = 0;
278
        public static int STRETCHINGHANDLER = 1;
279

    
280
        /**
281
         * If this geometry is a predefined interface then this method returns one
282
         * of {@link Geometry.TYPES} contants.<br>
283
         * If this geometry is an extended type then this method returns a runtime
284
         * constant that identifies its type. By convention this value is stored in
285
         * a constant called .CODE within the geometry class, for instance:
286
         * Point2D.CODE.
287
         * 
288
         * @return If this geometry is a predefined interface then one of
289
         *         {@link Geometry.TYPES} or a runtime constant if it is an extended
290
         *         type.
291
         */
292
        public int getType();
293

    
294
        /**
295
         * Creates a clone of this geometry.
296
         * 
297
         * @return A clone of this geometry.
298
         */
299
        public Geometry cloneGeometry();
300

    
301
        /**
302
         * Returns true if this geometry intersects the rectangle passed as
303
         * parameter.
304
         * 
305
         * @param r
306
         *            Rectangle.
307
         * 
308
         * @return True, if <code>this</code> intersects <code>r</code>.
309
         */
310
        public boolean intersects(Rectangle2D r);
311

    
312
        /**
313
         * Used by the drawing strategies to quickly test whether this geometry
314
         * intersects with the visible rectangle.
315
         * 
316
         * @param x
317
         *            The minimum X coordinate.
318
         * @param y
319
         *            The minimum Y coordinate.
320
         * @param w
321
         *            The width of the envelope.
322
         * @param h
323
         *            The height of the envelope.
324
         * @return true if <code>this</code> intersects the rectangle defined by the
325
         *         parameters.
326
         */
327
        public boolean fastIntersects(double x, double y, double w, double h);
328

    
329
        /**
330
         * <p>
331
         * Returns the minimum bounding box for this Geometry. This shall be the
332
         * coordinate region spanning the minimum and maximum value for each
333
         * ordinate taken on by DirectPositions in this Geometry. The simplest
334
         * representation for an envelope consists of two DirectPositions, the first
335
         * one containing all the minimums for each ordinate, and second one
336
         * containing all the maximums.
337
         * </p>
338
         * 
339
         * @return The minimum bounding box for this Geometry.
340
         */
341
        public Envelope getEnvelope();
342

    
343
        /**
344
         * Reprojects this geometry by the coordinate transformer passed as
345
         * parameter.
346
         * 
347
         * @param ct
348
         *            Coordinate Transformer.
349
         */
350
        public void reProject(ICoordTrans ct);
351

    
352
        /**
353
         * It applies an affine transformation to the geometry.
354
         * If parameter value is null, it will be considered an
355
         * empty transformation, therefore equivalent to the identity
356
         * transformation.
357
         * 
358
         * @param at
359
         *            The transformation to apply.
360
         */
361
        public void transform(AffineTransform at);
362
        /**
363
         * Returns the largest number n such that each direct position in a
364
         * geometric set can be associated with a subset that has the direct
365
         * position in its interior and is similar (isomorphic) to Rn, Euclidean
366
         * n-space.
367
         * 
368
         * @return The dimension.
369
         */
370
        public int getDimension();
371

    
372
        /**
373
         * Returns <code>true</code> if this Geometry has no interior point of
374
         * self-intersection or self-tangency. In mathematical formalisms, this
375
         * means that every point in the interior of the object must have a metric
376
         * neighborhood whose intersection with the object is isomorphic to an
377
         * n-sphere, where n is the dimension of this Geometry.
378
         * 
379
         * @return If the geometry is simple.
380
         */
381
        public boolean isSimple();
382

    
383
        /**
384
         * Invokes a geometry operation given its index and context.
385
         * 
386
         * @param index
387
         *            Unique index of the operation. Operation code.
388
         * @param ctx
389
         *            The context of the geometry operation.
390
         * @return Object returned by the operation.
391
         * @throws GeometryOperationNotSupportedException
392
         *             It is thrown when the operation has been not registered for
393
         *             this geometry.
394
         * @throws GeometryOperationException
395
         *             It is thrown when there is an error executing the operation.
396
         */
397
        public Object invokeOperation(int index, GeometryOperationContext ctx)
398
                        throws GeometryOperationNotSupportedException,
399
                        GeometryOperationException;
400

    
401
        /**
402
         * Invokes a geometry operation given its name and context.
403
         * 
404
         * @param opName
405
         *            Operation name.
406
         * @param ctx
407
         *            The context of the geometry operation.
408
         * @return Object returned by the operation.
409
         * @throws GeometryOperationNotSupportedException
410
         *             It is thrown when the operation has been not registered for
411
         *             this geometry.
412
         * @throws GeometryOperationException
413
         *             It is thrown when there is an error executing the operation.
414
         */
415
        public Object invokeOperation(String opName, GeometryOperationContext ctx)
416
                        throws GeometryOperationNotSupportedException,
417
                        GeometryOperationException;
418

    
419
        /**
420
         * Instance of the GeometryType associated to this geometry.
421
         * 
422
         * @return The geometry type.
423
         */
424
        public GeometryType getGeometryType();
425

    
426
        /**
427
         * Return a byte array with the equivalent in WKB format of the Geometry.
428
         * 
429
         * Utility method to wrap the invocation to the operation
430
         * {@link OPERATIONS#CONVERTTOWKB}.
431
         * 
432
         * @return the WKB version of the geometry
433
         */
434
        public byte[] convertToWKB() throws GeometryOperationNotSupportedException,
435
                GeometryOperationException;
436

    
437
        public byte[] convertToWKB(int srs) 
438
                throws GeometryOperationNotSupportedException, GeometryOperationException;
439
        
440
        public byte[] convertToWKBForcingType(int srs, int type) 
441
                throws GeometryOperationNotSupportedException, GeometryOperationException;
442

    
443
        /**
444
         * Return a string with the equivalent in WKT format of the Geometry.
445
         * 
446
         * This is a utility method to wrap the invocation to the operation
447
         * {@link OPERATIONS#CONVERTTOWKT}.
448
         * 
449
         * @return the WKT version of the geometry.
450
         * 
451
         * @throws GeometryOperationNotSupportedException
452
         * @throws GeometryOperationException
453
         */
454
        public String convertToWKT() throws GeometryOperationNotSupportedException,
455
                        GeometryOperationException;
456

    
457
        /**
458
         * Computes a buffer area around this geometry having the given width
459
         * 
460
         * This is a utility method to wrap the invocation to the operation
461
         * {@link OPERATIONS#BUFFER}.
462
         * 
463
         * @param distance
464
         *            the width of the buffer
465
         * 
466
         * @return a new Geometry with the computed buffer.
467
         * 
468
         * @throws GeometryOperationNotSupportedException
469
         * @throws GeometryOperationException
470
         */
471
        public Geometry buffer(double distance)
472
                        throws GeometryOperationNotSupportedException,
473
                        GeometryOperationException;
474

    
475
        /**
476
         * Tests whether this geometry contains the specified geometry.
477
         * 
478
         * This is a utility method to wrap the invocation to the operation
479
         * {@link OPERATIONS#CONTAINS}.
480
         * 
481
         * @param geometry
482
         *            the Geometry with which to compare this Geometry
483
         * 
484
         * @return if this Geometry contains the specified geometry
485
         * 
486
         * @throws GeometryOperationNotSupportedException
487
         * @throws GeometryOperationException
488
         */
489
        public boolean contains(Geometry geometry)
490
                        throws GeometryOperationNotSupportedException,
491
                        GeometryOperationException;
492

    
493
        /**
494
         * Returns the minimum distance between this Geometry and the specified
495
         * geometry.
496
         * 
497
         * This is a utility method to wrap the invocation to the operation
498
         * {@link OPERATIONS#DISTANCE}.
499
         * 
500
         * @param geometry
501
         *            the Geometry from which to compute the distance
502
         * 
503
         * @return the distance between the geometries
504
         * 
505
         * @throws GeometryOperationNotSupportedException
506
         * @throws GeometryOperationException
507
         */
508
        public double distance(Geometry other)
509
                        throws GeometryOperationNotSupportedException,
510
                        GeometryOperationException;
511

    
512
        public Geometry[] closestPoints(Geometry other)
513
                        throws GeometryOperationNotSupportedException,
514
                        GeometryOperationException;
515
        
516
        boolean isWithinDistance(Geometry other, double distance) 
517
                        throws GeometryOperationNotSupportedException,
518
                        GeometryOperationException;
519

    
520
        /**
521
         * Tests whether this geometry overlaps the specified geometry.
522
         * 
523
         * This is a utility method to wrap the invocation to the operation
524
         * {@link OPERATIONS#OVERLAPS}.
525
         * 
526
         * @param geometry
527
         *            the Geometry with which to compare this Geometry
528
         * 
529
         * @return true if the two geometries overlap.
530
         * 
531
         * @throws GeometryOperationNotSupportedException
532
         * @throws GeometryOperationException
533
         */
534
        public boolean overlaps(Geometry geometry)
535
                        throws GeometryOperationNotSupportedException,
536
                        GeometryOperationException;
537

    
538
        public Geometry convexHull() throws GeometryOperationNotSupportedException,
539
                        GeometryOperationException;
540

    
541
        public boolean coveredBy(Geometry geometry)
542
                        throws GeometryOperationNotSupportedException,
543
                        GeometryOperationException;
544

    
545
        public boolean crosses(Geometry geometry)
546
                        throws GeometryOperationNotSupportedException,
547
                        GeometryOperationException;
548

    
549
        public Geometry difference(Geometry other)
550
                        throws GeometryOperationNotSupportedException,
551
                        GeometryOperationException;
552

    
553
        public boolean disjoint(Geometry geometry)
554
                        throws GeometryOperationNotSupportedException,
555
                        GeometryOperationException;
556

    
557
        public Geometry intersection(Geometry other)
558
                        throws GeometryOperationNotSupportedException,
559
                        GeometryOperationException;
560

    
561
        public boolean intersects(Geometry geometry)
562
                        throws GeometryOperationNotSupportedException,
563
                        GeometryOperationException;
564

    
565
        public Geometry snapTo(Geometry other, double snapTolerance)
566
                        throws GeometryOperationNotSupportedException,
567
                        GeometryOperationException;
568
        
569
        public boolean touches(Geometry geometry)
570
                        throws GeometryOperationNotSupportedException,
571
                        GeometryOperationException;
572

    
573
        public Geometry union(Geometry other)
574
                        throws GeometryOperationNotSupportedException,
575
                        GeometryOperationException;
576

    
577
        public boolean within(Geometry geometry)
578
                        throws GeometryOperationNotSupportedException,
579
                        GeometryOperationException;
580

    
581
        public Point centroid() throws GeometryOperationNotSupportedException, GeometryOperationException;
582
        
583
        /**
584
         * This method returns a point which is inside the geometry.
585
         * This is useful for mathematical purposes but it is very unlikely
586
         * to be a suitable place for a label, for example.
587
         * 
588
         * 
589
         * @return an interior point
590
         * @throws GeometryOperationNotSupportedException
591
         * @throws GeometryOperationException
592
         */
593
        public Point getInteriorPoint() throws GeometryOperationNotSupportedException, GeometryOperationException;
594

    
595
        public double area() throws GeometryOperationNotSupportedException, GeometryOperationException;
596
        
597
        public double perimeter() throws GeometryOperationNotSupportedException, GeometryOperationException;
598

    
599
        
600
        
601
        
602
        /**
603
         * Rotates the geometry by radAngle radians using the given
604
         * coordinates as center of rotation. Rotating with a positive
605
         * angle rotates points on the positive x axis toward the
606
         * positive y axis. In most cases, we assume x increases
607
         * rightwards and y increases upwards, so in most cases,
608
         * a positive angle will mean counter-clockwise rotation.
609
         * 
610
         * @param radAngle the amount of rotation, in radians
611
         * @param basex x coordinate of center of rotation
612
         * @param basey y coordinate of center of rotation
613
         */
614
        public void rotate(double radAngle, double basex, double basey);
615
        
616
        /**
617
         * Shifts geometry by given amount in x and y axes
618
         * 
619
         * @param dx 
620
         * @param dy
621
         */
622
        public void move(double dx, double dy);
623
        
624
        
625
        /**
626
         * Scales geometry in x and y axes by given scale factors
627
         * using the given point as center of projection.
628
         *  
629
         * @param basePoint
630
         * @param sx scale factor in x axis
631
         * @param sy scale factor in y axis
632
         */
633
        public void scale(Point basePoint, double sx, double sy);
634
        
635
        
636
        
637
        
638
        //
639
        // ===============================================
640
        //
641
        
642
        
643
        /**
644
     * @return  the awt shape used to display the geometry. It 
645
     * applies a tranformation before to return the coordinates
646
     * of the shape
647
     * @deprecated this class inherits of {@link Shape} by historical
648
     * reasons. This method has been added just to control the usage of
649
     * the {@link Shape} class but it will removed in a future.
650
     */
651
        public Shape getShape(AffineTransform affineTransform);
652
        
653
        /**
654
     * @return  the awt shape used to display the geometry. 
655
     * @deprecated this class inherits of {@link Shape} by historical
656
     * reasons. This method has been added just to control the usage of
657
     * the {@link Shape} class but it will removed in a future.
658
     */
659
        public Shape getShape();
660

    
661
        /**
662
         * Returns this geometry's boundary rectangle.
663
         * 
664
         * @deprecated use getEnvelope.
665
         * @return Boundary rectangle.
666
         */
667
        public Rectangle2D getBounds2D();
668

    
669
        /**
670
         * If applies an affine transformation and returns the GeneralPathXIterator
671
         * with this geometry's information.
672
         * 
673
         * @param at
674
         *            The transformation to apply.
675
         * @return The GeneralPathXIterator with this geometry's information.
676
         * @deprecated don't use PathIterator over geometries, use instead specific API for each operation. If not has API for that operation let the project team.
677
         * 
678
         */
679
        public PathIterator getPathIterator(AffineTransform at);
680

    
681
        /**
682
         * It returns the handlers of the geometry, these they can be of two types
683
         * is straightening and of selection.
684
         * 
685
         * @param type
686
         *            Type of handlers.
687
         * 
688
         * @deprecated don't use Handlers over geometries, use instead specific API for each operation. If not has API for that operation let the project team.
689
         * @return The handlers.
690
         */
691
        public Handler[] getHandlers(int type);
692

    
693

    
694
        /**
695
         * If applies an affine transformation and returns the GeneralPathXIterator
696
         * with this geometry's information.
697
         * 
698
         * @param at
699
         *            The affine transformation.
700
         * @param flatness
701
         * 
702
         * @return The GeneralPathXIterator with this geometry's information.
703
         * @deprecated don't use PathIterator over geometries, use instead specific API for each operation. If not has API for that operation let the project team.
704
         */
705
        PathIterator getPathIterator(AffineTransform at, double flatness);
706

    
707
        /**
708
         * Useful to have the real shape behind the scenes. May be uses to edit it
709
         * knowing it it is a Circle, Ellipse, etc.
710
         * 
711
         * @return The awt shape
712
         * @deprecated
713
         */
714
        public Shape getInternalShape();
715

    
716

    
717
        /**
718
         * Get GeneralPathIterator, to do registered operations to it.
719
         * 
720
         * @return The GeneralPathX.
721
         * @deprecated don't use GeneralPathX over geometries, use instead specific API for each operation. If not has API for that operation let the project team.
722
         */
723
        public GeneralPathX getGeneralPath();
724

    
725
}