|
|
|
@ -9,6 +9,7 @@ import org.locationtech.jts.geom.*;
|
|
|
|
|
import org.locationtech.jts.geom.impl.CoordinateArraySequence; |
|
|
|
|
import org.locationtech.jts.operation.buffer.BufferOp; |
|
|
|
|
import org.locationtech.jts.operation.buffer.BufferParameters; |
|
|
|
|
import org.locationtech.jts.util.GeometricShapeFactory; |
|
|
|
|
import org.springframework.core.io.ClassPathResource; |
|
|
|
|
import org.springframework.core.io.Resource; |
|
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
@ -26,6 +27,8 @@ public class AreaUtils {
|
|
|
|
|
private List<Polygon> polygons = new ArrayList<>(); |
|
|
|
|
private List<Point> points = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
private GeometryFactory geometryFactory = new GeometryFactory(); |
|
|
|
|
|
|
|
|
|
public AreaUtils() throws Exception { |
|
|
|
|
this.init(); |
|
|
|
|
} |
|
|
|
@ -39,7 +42,7 @@ public class AreaUtils {
|
|
|
|
|
public boolean overlaps(List<Coordinate> targetCoordList) { |
|
|
|
|
boolean result = false; |
|
|
|
|
|
|
|
|
|
GeometryFactory geometryFactory = new GeometryFactory(); |
|
|
|
|
// GeometryFactory geometryFactory = new GeometryFactory();
|
|
|
|
|
|
|
|
|
|
Polygon targetPolygon = geometryFactory.createPolygon(targetCoordList.toArray(new Coordinate[]{})); |
|
|
|
|
|
|
|
|
@ -62,24 +65,26 @@ public class AreaUtils {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 드론 관제시 정상 비행 체크 |
|
|
|
|
* TODO 드론 관제시 정상 비행 체크 (Line, Polygon) |
|
|
|
|
* |
|
|
|
|
* @param areaCoordList - 비행 구역 좌표 리스트 |
|
|
|
|
* @param targetCoordinate - 드론 좌표 정보 |
|
|
|
|
* @return boolean - true(비정상), false(정상) |
|
|
|
|
*/ |
|
|
|
|
public boolean contains(List<Coordinate> areaCoordList, Coordinate targetCoordinate) { |
|
|
|
|
GeometryFactory geometryFactory = new GeometryFactory(); |
|
|
|
|
|
|
|
|
|
// CoordinateSequence coordinateSequence = new CoordinateArraySequence((CoordinateSequence) targetCoordinate);
|
|
|
|
|
// GeometryFactory geometryFactory = new GeometryFactory();
|
|
|
|
|
|
|
|
|
|
LineString line = new GeometryFactory().createLineString(areaCoordList.toArray(new Coordinate[]{})); |
|
|
|
|
boolean result = false; |
|
|
|
|
if(targetCoordinate != null) { |
|
|
|
|
|
|
|
|
|
Point point = new Point((CoordinateSequence) targetCoordinate, geometryFactory); |
|
|
|
|
Polygon plan = geometryFactory.createPolygon(areaCoordList.toArray(new Coordinate[]{})); // 비행 구역
|
|
|
|
|
// Point target = new Point((CoordinateSequence) targetCoordinate, geometryFactory); // 드론 위치
|
|
|
|
|
Point target = geometryFactory.createPoint(targetCoordinate); |
|
|
|
|
|
|
|
|
|
boolean contains = line.contains(point); |
|
|
|
|
result = plan.contains(target); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return contains; |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -91,7 +96,7 @@ public class AreaUtils {
|
|
|
|
|
*/ |
|
|
|
|
public List<Coordinate> buffer(List<Coordinate> coordList, Integer bufferZone) { |
|
|
|
|
List<Coordinate> bufferList = new ArrayList<>(); |
|
|
|
|
GeometryFactory geometryFactory = new GeometryFactory(); |
|
|
|
|
// GeometryFactory geometryFactory = new GeometryFactory();
|
|
|
|
|
|
|
|
|
|
LineString line = geometryFactory.createLineString(coordList.toArray(new Coordinate[] {})); |
|
|
|
|
Geometry geometry = geometryFactory.createGeometry(line); |
|
|
|
@ -113,6 +118,32 @@ public class AreaUtils {
|
|
|
|
|
return bufferList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public List<Coordinate> createCircle(Coordinate CircleCoord, Integer BufferZone) { |
|
|
|
|
List<Coordinate> coordList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
GeometricShapeFactory shapeFactory = new GeometricShapeFactory(); |
|
|
|
|
// GeometryFactory geometryFactory = new GeometryFactory();
|
|
|
|
|
|
|
|
|
|
double lng = CircleCoord.x; |
|
|
|
|
double lat = CircleCoord.y; |
|
|
|
|
double diameterInMeters = BufferZone; |
|
|
|
|
|
|
|
|
|
shapeFactory.setCentre(new Coordinate(lng , lat)); |
|
|
|
|
shapeFactory.setHeight((diameterInMeters * 2) / 111320d); |
|
|
|
|
shapeFactory.setWidth((diameterInMeters * 2) / (40075000 * Math.cos(Math.toRadians(lat)) / 360)); |
|
|
|
|
shapeFactory.setNumPoints(64); |
|
|
|
|
|
|
|
|
|
final Polygon circle = shapeFactory.createEllipse(); |
|
|
|
|
circle.setSRID(4326); |
|
|
|
|
|
|
|
|
|
Geometry geometry = geometryFactory.createGeometry(circle); |
|
|
|
|
Coordinate[] coords = geometry.getCoordinates(); |
|
|
|
|
|
|
|
|
|
coordList.addAll(Arrays.asList(coords)); |
|
|
|
|
|
|
|
|
|
return coordList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public List<Coordinate> convertCoordinates(List<BasFlightPlanAreaCoordModel> coordList) { |
|
|
|
|
|
|
|
|
|
List<Coordinate> coordinates = new ArrayList<>(); |
|
|
|
@ -143,7 +174,7 @@ public class AreaUtils {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void init() throws Exception { |
|
|
|
|
GeometryFactory geometryFactory = new GeometryFactory(); |
|
|
|
|
// GeometryFactory geometryFactory = new GeometryFactory();
|
|
|
|
|
|
|
|
|
|
// 1. file read
|
|
|
|
|
Resource resource = new ClassPathResource("air/airgeo.json"); |
|
|
|
|