Revision 2109 org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.impl/src/main/java/org/gvsig/vectorediting/lib/impl/DefaultEditingProviderServices.java
DefaultEditingProviderServices.java | ||
---|---|---|
23 | 23 |
*/ |
24 | 24 |
package org.gvsig.vectorediting.lib.impl; |
25 | 25 |
|
26 |
import java.awt.geom.Point2D; |
|
27 | 26 |
import java.util.Iterator; |
28 | 27 |
import java.util.List; |
29 | 28 |
import java.util.Map; |
30 |
import java.util.Objects; |
|
31 | 29 |
import org.gvsig.euclidean.EuclideanLine2D; |
32 |
import org.gvsig.euclidean.EuclideanManager; |
|
30 |
import org.gvsig.expressionevaluator.GeometryExpressionBuilder; |
|
31 |
import org.gvsig.fmap.dal.DALLocator; |
|
32 |
import org.gvsig.fmap.dal.DataManager; |
|
33 | 33 |
|
34 | 34 |
import org.gvsig.fmap.dal.EditingNotification; |
35 | 35 |
import org.gvsig.fmap.dal.EditingNotificationManager; |
36 | 36 |
import org.gvsig.fmap.dal.exception.DataException; |
37 |
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder; |
|
37 | 38 |
import org.gvsig.fmap.dal.feature.EditableFeature; |
38 | 39 |
import org.gvsig.fmap.dal.feature.Feature; |
39 | 40 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
... | ... | |
43 | 44 |
import org.gvsig.fmap.dal.swing.DALSwingLocator; |
44 | 45 |
import org.gvsig.fmap.geom.Geometry; |
45 | 46 |
import org.gvsig.fmap.geom.Geometry.SUBTYPES; |
46 |
import org.gvsig.fmap.geom.Geometry.TYPES; |
|
47 | 47 |
import org.gvsig.fmap.geom.GeometryLocator; |
48 | 48 |
import org.gvsig.fmap.geom.GeometryManager; |
49 |
import org.gvsig.fmap.geom.GeometryUtils; |
|
49 | 50 |
import org.gvsig.fmap.geom.exception.CreateGeometryException; |
50 | 51 |
import org.gvsig.fmap.geom.operation.GeometryOperationException; |
51 | 52 |
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException; |
... | ... | |
56 | 57 |
import org.gvsig.fmap.geom.primitive.Point; |
57 | 58 |
import org.gvsig.fmap.geom.primitive.Spline; |
58 | 59 |
import org.gvsig.fmap.geom.type.GeometryType; |
60 |
import org.gvsig.fmap.mapcontext.MapContext; |
|
59 | 61 |
import org.gvsig.fmap.mapcontext.layers.CancelationException; |
62 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
|
63 |
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
|
60 | 64 |
import org.gvsig.tools.ToolsLocator; |
61 | 65 |
import org.gvsig.tools.exception.BaseException; |
62 | 66 |
import org.gvsig.tools.i18n.I18nManager; |
63 | 67 |
import org.gvsig.tools.service.spi.AbstractProviderServices; |
64 |
import org.gvsig.tools.util.ToolsUtilLocator; |
|
65 | 68 |
import org.gvsig.vectorediting.lib.spi.EditingProviderServices; |
66 | 69 |
import org.slf4j.Logger; |
67 | 70 |
import org.slf4j.LoggerFactory; |
... | ... | |
69 | 72 |
public class DefaultEditingProviderServices extends AbstractProviderServices |
70 | 73 |
implements EditingProviderServices { |
71 | 74 |
|
72 |
private static final Logger logger = LoggerFactory
|
|
75 |
private static final Logger LOGGER = LoggerFactory
|
|
73 | 76 |
.getLogger(DefaultEditingProviderServices.class); |
74 | 77 |
|
75 | 78 |
@Override |
... | ... | |
123 | 126 |
String msg |
124 | 127 |
= String.format("Can't insert %1$s into %2$s", |
125 | 128 |
eFeature.toString(), featureStore.getName()); |
126 |
logger.info(msg, e);
|
|
129 |
LOGGER.info(msg, e);
|
|
127 | 130 |
} |
128 | 131 |
} |
129 | 132 |
|
... | ... | |
177 | 180 |
String msg |
178 | 181 |
= String.format("Can't insert %1$s into %2$s", |
179 | 182 |
eFeature.toString(), featureStore.getName()); |
180 |
logger.info(msg, e);
|
|
183 |
LOGGER.info(msg, e);
|
|
181 | 184 |
} |
182 | 185 |
} |
183 | 186 |
|
... | ... | |
214 | 217 |
featureStore, feature); |
215 | 218 |
|
216 | 219 |
} catch (Exception e) { |
217 |
logger.warn(e.getMessage(), e);
|
|
220 |
LOGGER.warn(e.getMessage(), e);
|
|
218 | 221 |
} |
219 | 222 |
} |
220 | 223 |
|
... | ... | |
251 | 254 |
featureStore, feature); |
252 | 255 |
|
253 | 256 |
} catch (Exception e) { |
254 |
logger.warn(e.getMessage(), e);
|
|
257 |
LOGGER.warn(e.getMessage(), e);
|
|
255 | 258 |
} |
256 | 259 |
} |
257 | 260 |
|
... | ... | |
306 | 309 |
String msg |
307 | 310 |
= String.format("Can't update %1$s in %2$s", eFeature.toString(), |
308 | 311 |
featureStore.getName()); |
309 |
logger.info(msg, e);
|
|
312 |
LOGGER.info(msg, e);
|
|
310 | 313 |
} |
311 | 314 |
} |
312 | 315 |
|
313 | 316 |
@Override |
314 | 317 |
public Circle createCircle(Point center, double radius, int subtype) |
315 | 318 |
throws CreateGeometryException { |
316 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
317 |
Circle circle = (Circle) geomManager.create(TYPES.CIRCLE, subtype); |
|
318 |
circle.setPoints(center, radius); |
|
319 |
|
|
320 |
return circle; |
|
319 |
return GeometryUtils.createCircle(center, radius, subtype); |
|
321 | 320 |
} |
322 | 321 |
|
323 | 322 |
@Override |
324 | 323 |
public Circle createCircle(Point firstPoint, Point secondPoint, |
325 | 324 |
Point thridPoint, int subtype) throws CreateGeometryException { |
326 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
327 |
Circle circle = (Circle) geomManager.create(TYPES.CIRCLE, subtype); |
|
328 |
circle.setPoints(firstPoint, secondPoint, thridPoint); |
|
329 |
|
|
330 |
return circle; |
|
325 |
return GeometryUtils.createCircle(firstPoint, secondPoint, thridPoint, subtype); |
|
331 | 326 |
} |
332 | 327 |
|
333 | 328 |
@Override |
334 | 329 |
public Arc createArc(Point center, double radius, double startAngle, |
335 | 330 |
double angleExt, int subtype) throws CreateGeometryException { |
336 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
337 |
Arc arc = (Arc) geomManager.create(TYPES.ARC, subtype); |
|
338 |
arc.setPoints(center, radius, startAngle, angleExt); |
|
339 |
return arc; |
|
331 |
return GeometryUtils.createArc(center, radius, startAngle, angleExt, subtype); |
|
340 | 332 |
} |
341 | 333 |
|
342 | 334 |
@Override |
343 | 335 |
public Ellipse createFilledEllipse(Point firstPointAxisA, |
344 | 336 |
Point secondPointAxisA, double halfLengthAxisB, int subtype) |
345 | 337 |
throws CreateGeometryException { |
346 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
347 |
Ellipse ellipse = (Ellipse) geomManager.create(TYPES.ELLIPSE, subtype); |
|
348 |
ellipse.setPoints(firstPointAxisA, secondPointAxisA, halfLengthAxisB); |
|
349 |
return ellipse; |
|
338 |
return GeometryUtils.createFilledEllipse(firstPointAxisA, secondPointAxisA, halfLengthAxisB, subtype); |
|
350 | 339 |
} |
351 | 340 |
|
352 | 341 |
@Override |
353 | 342 |
public Arc createArc(Point start, Point middle, Point end, int subtype) |
354 | 343 |
throws BaseException { |
355 |
|
|
356 |
Arc arc = (Arc) GeometryLocator.getGeometryManager().create(Geometry.TYPES.ARC, subtype); |
|
357 |
arc.setPoints(start, middle, end); |
|
358 |
return arc; |
|
359 |
|
|
344 |
return GeometryUtils.createArc(start, middle, end, subtype); |
|
360 | 345 |
} |
361 | 346 |
|
362 | 347 |
@Override |
363 | 348 |
public Point createPoint(double x, double y, int subtype) |
364 | 349 |
throws CreateGeometryException { |
365 | 350 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
366 |
Point point = (Point) geomManager.create(TYPES.POINT, subtype); |
|
367 |
point.setX(x); |
|
368 |
point.setY(y); |
|
369 |
return point; |
|
351 |
return geomManager.createPoint(x, y, subtype); |
|
370 | 352 |
} |
371 | 353 |
|
372 | 354 |
@Override |
373 | 355 |
public Line createLine(double x1, double y1, double x2, double y2, |
374 | 356 |
int subtype) throws CreateGeometryException { |
375 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
376 |
Line line = (Line) geomManager.create(TYPES.CURVE, subtype); |
|
377 |
line.addVertex(x1, y1); |
|
378 |
line.addVertex(x2, y2); |
|
379 |
return line; |
|
357 |
return GeometryUtils.createLine(x1, y1, x2, y2, subtype); |
|
380 | 358 |
} |
381 | 359 |
|
382 | 360 |
@Override |
... | ... | |
426 | 404 |
@Override |
427 | 405 |
public Point getCenter(Point a, Point b, Point c, int subtype) |
428 | 406 |
throws CreateGeometryException { |
429 |
|
|
430 |
Point midPointAC = getMidPoint(a, c, subtype); |
|
431 |
Double[] lineParamsAC = getLineParams(a, c); |
|
432 |
Point[] bisectorAC |
|
433 |
= getPerpendicular(lineParamsAC[0], lineParamsAC[1], midPointAC, |
|
434 |
subtype); |
|
435 |
|
|
436 |
Point midPointBC = getMidPoint(b, c, subtype); |
|
437 |
Double[] lineParamsBC = getLineParams(c, b); |
|
438 |
Point[] bisectorBC |
|
439 |
= getPerpendicular(lineParamsBC[0], lineParamsBC[1], midPointBC, |
|
440 |
subtype); |
|
441 |
|
|
442 |
return getIntersection(bisectorAC, bisectorBC, subtype); |
|
407 |
return GeometryUtils.getCenter(a, b, c, subtype); |
|
443 | 408 |
} |
444 | 409 |
|
445 | 410 |
@Override |
446 | 411 |
public Point getMidPoint(Point a, Point b, int subtype) |
447 | 412 |
throws CreateGeometryException { |
448 |
double x = (a.getX() + b.getX()) / 2; |
|
449 |
double y = (a.getY() + b.getY()) / 2; |
|
450 |
return createPoint(x, y, subtype); |
|
413 |
return GeometryUtils.getMidPoint(a, b, subtype); |
|
451 | 414 |
} |
452 | 415 |
|
453 | 416 |
@Override |
... | ... | |
589 | 552 |
@Override |
590 | 553 |
public Line createLine(Point p1, Point p2, int subtype) |
591 | 554 |
throws CreateGeometryException { |
592 |
return this.createLine(p1.getX(), p1.getY(), p2.getX(), p2.getY(), |
|
593 |
subtype); |
|
555 |
return GeometryUtils.createLine(p1, p2, subtype); |
|
594 | 556 |
} |
595 | 557 |
|
596 | 558 |
@Override |
597 | 559 |
public Spline createSpline(List<Point> points, int subtype) |
598 | 560 |
throws CreateGeometryException { |
599 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
600 |
Spline spline = (Spline) geomManager.create(TYPES.SPLINE, subtype); |
|
601 |
|
|
602 |
points.forEach((point) -> { |
|
603 |
spline.addVertex(point); |
|
604 |
}); |
|
605 |
|
|
606 |
return spline; |
|
561 |
return GeometryUtils.createSpline(points, subtype); |
|
607 | 562 |
} |
608 | 563 |
|
609 | 564 |
@Override |
... | ... | |
632 | 587 |
@Override |
633 | 588 |
public Arc createEllipse(Point firstPointAxisA, Point secondPointAxisA, |
634 | 589 |
double halfLengthAxisB, int subtype) throws CreateGeometryException { |
635 |
try { |
|
636 |
double lengthAxisA = secondPointAxisA.distance(firstPointAxisA); |
|
637 |
|
|
638 |
Point origen = this.createPoint(0, 0, subtype); |
|
639 |
Arc ellipse = this.createArc( |
|
640 |
origen, |
|
641 |
lengthAxisA / 2, |
|
642 |
0, |
|
643 |
2 * Math.PI, |
|
644 |
subtype); |
|
645 |
|
|
646 |
ellipse.scale(origen, 1, halfLengthAxisB * 2 / lengthAxisA); |
|
647 |
ellipse.rotate(this.getAngle(firstPointAxisA, secondPointAxisA), 0, 0); |
|
648 |
Point centerOfEllipse = this.getMidPoint(firstPointAxisA, secondPointAxisA, subtype); |
|
649 |
ellipse.move(centerOfEllipse.getX(), centerOfEllipse.getY()); |
|
650 |
return ellipse; |
|
651 |
} catch (GeometryOperationNotSupportedException | GeometryOperationException e) { |
|
652 |
throw new CreateGeometryException(Geometry.TYPES.ARC, subtype, e); |
|
653 |
} |
|
590 |
return GeometryUtils.createEllipse(firstPointAxisA, secondPointAxisA, halfLengthAxisB, subtype); |
|
654 | 591 |
} |
655 | 592 |
|
656 | 593 |
@Override |
657 | 594 |
public Circle createCircle(Point firstPoint, Point secondPoint, Point thirdPoint, Point fourthPoint, Point fifthPoint, int subtype) throws CreateGeometryException { |
658 |
EuclideanManager euclideanManager = ToolsUtilLocator.getEuclideanManager(); |
|
659 |
EuclideanLine2D line1 = euclideanManager.createLine2D(firstPoint.getX(), firstPoint.getY(), secondPoint.getX(), secondPoint.getY()); |
|
660 |
EuclideanLine2D line2 = euclideanManager.createLine2D(thirdPoint.getX(), thirdPoint.getY(), fourthPoint.getX(), fourthPoint.getY()); |
|
661 |
return createCircle(line1, line2, fifthPoint, subtype); |
|
595 |
return GeometryUtils.createCircle(firstPoint, secondPoint, thirdPoint, fourthPoint, fifthPoint, subtype); |
|
662 | 596 |
} |
663 | 597 |
|
664 | 598 |
@Override |
665 | 599 |
public Circle createCircle(EuclideanLine2D line1, EuclideanLine2D line2, Point point, int subtype) throws CreateGeometryException { |
600 |
return GeometryUtils.createCircle(line1, line2, point, subtype); |
|
601 |
} |
|
666 | 602 |
|
667 |
GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
668 |
EuclideanManager euclideanManager = ToolsUtilLocator.getEuclideanManager(); |
|
669 |
|
|
603 |
@Override |
|
604 |
public Circle createCircle(Geometry geometry1, Geometry geometry2, double radius, Point firstPoint, Point secondPoint, int subtype) throws CreateGeometryException { |
|
605 |
return GeometryUtils.createCircle(geometry1, geometry2, radius, firstPoint, secondPoint, subtype); |
|
606 |
} |
|
607 |
|
|
608 |
@Override |
|
609 |
public Geometry getGeometry(Point point, FeatureStore store, MapContext mapContext) { |
|
610 |
Geometry geometry = null; |
|
670 | 611 |
try { |
671 |
EuclideanLine2D perpendicular; |
|
672 |
EuclideanLine2D bisector; |
|
673 |
if (line1.isParallel(line2)) { |
|
612 |
double tolerance = mapContext.getViewPort().toMapDistance(mapContext.getLayers().getDefaultTolerance()); |
|
613 |
Geometry buffer = point.buffer(tolerance); |
|
614 |
|
|
615 |
DataManager dataManager = DALLocator.getDataManager(); |
|
616 |
DALExpressionBuilder dalBuilder = dataManager.createDALExpressionBuilder(); |
|
617 |
GeometryExpressionBuilder builder = dalBuilder.expression(); |
|
618 |
String filter = builder.ST_Intersects(builder.geometry(buffer, mapContext.getProjection()), dalBuilder.geometry()).toString(); |
|
619 |
String sortBy = builder.ST_Distance(builder.geometry(buffer), dalBuilder.geometry()).toString(); |
|
674 | 620 |
|
675 |
if (Objects.equals(line1.getYIntercept(), line2.getYIntercept()) |
|
676 |
|| (Objects.equals(Math.abs(line1.getYIntercept()), 0.0) |
|
677 |
&& Objects.equals(Math.abs(line2.getYIntercept()), 0.0))) { //Same lines |
|
678 |
perpendicular = line1.getPerpendicular(point.getX(), point.getY()); |
|
679 |
Point2D intersection = line1.getIntersection(perpendicular); |
|
680 |
return createCircle(point, point.distance(geomManager.createPoint(intersection.getX(), intersection.getY(), subtype)), subtype); |
|
681 |
} else if (Double.isInfinite(line1.getSlope())) { //Parallel and vertical lines |
|
682 |
Point center = createPoint(-(line2.getC() + line1.getC()) / 2.0, point.getY(), subtype); |
|
683 |
double radius = line1.getDistance(center.getX(), center.getY()); |
|
684 |
return createCircle(center, radius, subtype); |
|
685 |
} else { //Parallel lines |
|
686 |
bisector = euclideanManager.createLine2D(line1.getA(), line1.getB(), (line2.getC()+line1.getC())/2); |
|
687 |
} |
|
621 |
Feature f; |
|
622 |
f = store.findFirst(filter, sortBy, true); |
|
623 |
if(f!=null){ |
|
624 |
geometry = f.getDefaultGeometry(); |
|
625 |
} |
|
626 |
|
|
627 |
} catch (Exception ex) { |
|
628 |
LOGGER.warn("Can't get geometry on point ("+point.getX()+","+point.getY(), ex); |
|
629 |
} |
|
630 |
|
|
631 |
return geometry; |
|
632 |
} |
|
688 | 633 |
|
689 |
} else { |
|
690 |
|
|
691 |
EuclideanLine2D[] bisectors = line1.getBisectors(line2); |
|
692 |
|
|
693 |
double distance1 = bisectors[0].getDistance(point.getX(), point.getY()); |
|
694 |
double distance2 = bisectors[1].getDistance(point.getX(), point.getY()); |
|
695 |
|
|
696 |
bisector = bisectors[0]; |
|
697 |
if (distance1 > distance2) { |
|
698 |
bisector = bisectors[1]; |
|
634 |
@Override |
|
635 |
public Geometry getGeometryOfVisibleLayers(Point point, FeatureStore store, MapContext mapContext) { |
|
636 |
|
|
637 |
// Search in the store itself |
|
638 |
Geometry geometry = this.getGeometry(point, store, mapContext); |
|
639 |
// Search in the store for the layers that are in edit |
|
640 |
if(geometry == null){ |
|
641 |
for( Iterator<FLayer> iterator = mapContext.getLayers().deepiterator(); iterator.hasNext(); ) { |
|
642 |
FLayer layer = iterator.next(); |
|
643 |
if(layer instanceof FLyrVect){ |
|
644 |
FLyrVect vectLayer = (FLyrVect) layer; |
|
645 |
if(vectLayer.getFeatureStore()!=store && vectLayer.isEditing()){ |
|
646 |
geometry = this.getGeometry(point, vectLayer.getFeatureStore(), mapContext); |
|
647 |
if(geometry != null){ |
|
648 |
break; |
|
649 |
} |
|
650 |
} |
|
699 | 651 |
} |
700 | 652 |
} |
701 |
|
|
702 |
if (Double.isInfinite(bisector.getSlope())) { |
|
703 |
Point2D intersection = line1.getIntersection(line2); |
|
704 |
Point center = createPoint(intersection.getX(), point.getY(), subtype); |
|
705 |
Double radius = line1.getDistance(center.getX(), center.getY()); |
|
706 |
return createCircle(center, radius, subtype); |
|
707 |
} else if (bisector.getSlope() == 0.0) { |
|
708 |
if (line1.isParallel(line2)) { //Objects.equals(m0, m1)) { //Same slope |
|
709 |
Point center = createPoint(point.getX(), bisector.getYIntercept(), subtype); |
|
710 |
Double radius = line1.getDistance(center.getX(), center.getY()); |
|
711 |
return createCircle(center, radius, subtype); |
|
712 |
} else { |
|
713 |
Point2D intersection = line1.getIntersection(line2); |
|
714 |
Point center = createPoint(point.getX(), intersection.getY(), subtype); |
|
715 |
Double radius = line1.getDistance(center.getX(), center.getY()); |
|
716 |
return createCircle(center, radius, subtype); |
|
653 |
} |
|
654 |
// Search in the store for the active layers |
|
655 |
if(geometry == null){ |
|
656 |
FLayer[] activeLayers = mapContext.getLayers().getActives(); |
|
657 |
for (FLayer activeLayer : activeLayers) { |
|
658 |
if(activeLayer instanceof FLyrVect){ |
|
659 |
FLyrVect activeVectLayer = (FLyrVect) activeLayer; |
|
660 |
if(activeVectLayer.getFeatureStore()!=store && !activeVectLayer.isEditing()){ |
|
661 |
geometry = this.getGeometry(point, activeVectLayer.getFeatureStore(), mapContext); |
|
662 |
if(geometry != null){ |
|
663 |
break; |
|
664 |
} |
|
665 |
} |
|
717 | 666 |
} |
718 | 667 |
} |
719 |
|
|
720 |
perpendicular = bisector.getPerpendicular(point.getX(), point.getY()); |
|
721 |
Point2D intersection = bisector.getIntersection(perpendicular); |
|
722 |
Double radius = line1.getDistance(intersection.getX(), intersection.getY()); |
|
723 |
return createCircle( |
|
724 |
geomManager.createPoint(intersection.getX(), intersection.getY(), subtype), |
|
725 |
radius, |
|
726 |
subtype); |
|
727 |
|
|
728 |
} catch (GeometryOperationNotSupportedException | GeometryOperationException ex) { |
|
729 |
throw new CreateGeometryException(Geometry.TYPES.CIRCLE, subtype, ex); |
|
730 | 668 |
} |
669 |
return geometry; |
|
731 | 670 |
} |
671 |
|
|
672 |
|
|
732 | 673 |
} |
Also available in: Unified diff