# gis-tools **Repository Path**: optcode/gis-tools ## Basic Information - **Project Name**: gis-tools - **Description**: GIS工具包,根据jts工具,结合实际使用场景提取出来的常用工具集合;涵盖几何格式转换(WKT,GeoJSON等)与geometry转换、gis距离计算、度距离单位换算、角度计算、buffer运算、映射截取、几何穿串等操作 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 22 - **Created**: 2023-05-27 - **Last Updated**: 2023-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 前言 根据jts工具,结合实际使用场景提取出来的常用工具集合,涵盖几何转换(WKT,GeoJSON等)、gis距离计算、角度计算、buffer运算、映射截取、几何穿串等操作 # gis-tools使用说明 ## 1. 格式转换 ### 1.1 WktTool使用说明 wkt格式与geometry互转; 1. wkt转geometry操作 ``` Geometry geometry = WktTool.wktToGeo("LINESTRING (116.7262994 35.5153623, 116.726309 35.515362, 116.7263135 35.5153642, 116.72632 35.515364, 116.72633 35.515363, 116.7263355 35.5153617, 116.726343 35.515362)"); ``` 2. geometry转wkt操作 ``` //转换不带Z WktTool.geoToWkt2D(geometry); //转换带Z WktTool.geoToWkt3D(geometry); ``` ### 1.2 GeoJsonTool使用说明 1. geoJson字符串转Geometry > GeoJsonTool.read(String geoJson) 2. Geometry转GeoJson > GeoJsonTool.toJSONString(Geometry geometry) ## 2. 扩圈工具 ### 2.1 BufferTool使用说明 将geometry进行扩圈处理,线场景使用最广,支持延线的方向左右扩、单边扩; 1. 圆角扩圈(上下是矩形,左右是圆角) ``` //distance单位米 BufferTool.bufferCapRound(Geometry geometry, double distance) ``` ![示例图片](docs/statics/buffercapround.png) 2. 扩圈(上下左右四个方向,外接多边形) ``` //distance单位米 BufferTool.bufferCapSquare(Geometry geometry, double distance) ``` 3. 上下扩圈(扩完是矩形) ``` //distance单位米 BufferTool.bufferCapFat(Geometry geometry, double distance) ``` 4. 左扩X米右扩X米 ``` //distance单位米 leftDistance 左扩x米 rightDistance 右扩X米 BufferTool.bufferGeoLeftRight(Geometry geometry, double leftDistance, double rightDistance) ``` 5. 左扩X米 ``` //distance单位米 distance 左扩x米 BufferTool.bufferGeoLeft(Geometry geometry, double distance) ``` ![示例图片](docs/statics/leftxbuffer.png) 6. 右扩X米 ``` //distance单位米 distance 右扩x米 BufferTool.bufferGeoRight(Geometry geometry, double distance) ``` ## 3. 距离工具 ### 3.1 DistanceTool使用说明 点到点距离计算,线距离计算,点到线距离计算,度距离相关转换等工具类,半径采用地球平均半径6371.0087714; 1. 距离转换为度 cmToDegree 2. 距离(KM)转换为度 kmToDegree 3. 度转换为距离(单位KM) degreeToKm 4. 度转换为距离(单位M) degreeToM 5. 度转换为厘米 degreeToCm 6. 获取几何距离单位(米) getLengthM(Geometry geometry) 7. 获取几何距离单位(千米) getLengthKM(Geometry geometry) 8. 获取两点的距离 p2pLenDegrees(Coordinate coordinate0, Coordinate coordinate1) 9. 获取两点距离(KM) p2pLenKm(Coordinate coordinate0, Coordinate coordinate1) 10. 获取两点距离(M) p2pLenM(Coordinate coordinate0, Coordinate coordinate1) 11. 点到线的最近距离 p2LineDegrees(Point point, LineString lineString) 12. 点到线的最近距离(KM) p2LineKM(Point point, LineString lineString) 13. 点到线的最近距离(M) p2LineM(Point point, LineString lineString) ## 4. 角度工具 ### 4.1 AngleTool使用说明 1. 获取顺时针夹角 getCwAngle(Coordinate p0, Coordinate p1, Coordinate p2) > p1: po,p2的交点坐标 2. 获取 逆时针夹角 getCCwAngle(Coordinate p0, Coordinate p1, Coordinate p2) > p1: po,p2的交点坐标 3. 获取两条线段的逆时针夹角 getCCwAngle(Geometry lineString0, Geometry lineString1) 4. 获取两条线段的顺时针夹角 getCwAngle(Geometry lineString0, Geometry lineString1) 5. 判断点coordinate在线lineString的左边还是右边 isLeft(Geometry lineString, Coordinate coordinate) 6. 判断whereLineString在lineString的左侧还是右侧 isLeft(Geometry lineString, Geometry whereLineString) ## 5. 操作工具 ### 5.1 PointTool使用说明 1. 通过线设置point的Z值 getPointZ(Geometry linkString, Point point) 2. 获取平均Z getAvgZ(Geometry geometry) ### 5.2 LineTool使用说明 1. 获取点到线的垂线 verticalLine(Point point, Geometry lineString) 2. 获取垂足(点到线的垂足) (Point point, Geometry lineString) 3. 截取l1在点coordinate0与coordinate1之间的线段 (Geometry l1, Coordinate coordinate0, Coordinate coordinate1) 4. 获取l2在l1上面的线段 getExtractLine(Geometry l1, Geometry l2) 5. 获取l2在l1上面的线段,并借用l1距离垂足xm的形状点,没有的话返回垂足做起、终点 getExtractLine(Geometry l1, Geometry l2, double xm) 6. 获取point在l1上面的位置点(索引位置) PointLocation getLinearLocation(Geometry l1, Geometry point) > PointLocation index:索引位置 segmentFraction:同一个index下面的占比. 应用场景:点到线做映射,然后排序映射后的点 7. 获取 pointGeoList 在线 l1上面的投影线 getExtractLineByPoints(Geometry l1, List pointGeoList) 8. 当geometry两两形状点的跨度大于XM的时候往geometry里面加入形状点 sewing(Geometry geometry, int XM) # gis-tools扩展工具使用说明 ## 1. skewer穿串工具 **使用场景通过数据的挂接开始、结束node关系,完成例如道路线的穿串** ### 1.1.1 创建操作类继承Seeker接口 ``` findNode: 寻找下个节点; stopCondition 停止条件 ``` > 例如: LinkSeeker ### 1.1.2 使用者调用 ``` LinkSeeker rdLinkSeeker = new LinkSeeker(); Skewer skewer = new Skewer<>(rdLinkSeeker, SeekerWay.POINT_END, link); List>> linkedLists = skewer.searchKebab(node,LinkSeeker.linkData); ``` **使用场景通过数据的point起终形状点,完成例如道路线的穿串** ### 1.2.1 创建操作类继承SeekerPoint接口 ``` findNode: 寻找下个节点; stopCondition 停止条件 ``` > 例如: LinkSeekerByPoint ### 1.2.2 使用者调用 ``` LinkSeekerByPoint rdLinkSeeker = new LinkSeekerByPoint(); SkewerPoint skewer = new SkewerPoint<>(rdLinkSeeker, SeekerWay.POINT_END, link); List>> linkedLists = skewer.searchKebab(node, LinkSeekerByPoint.linkData); ``` ## 2. shadow投影计算工具 使用场景,例如: 输入数据: 道路线要素,路牙要素、护栏要素; 通过路牙、护栏要素在道路线上面制作新的要素A; 路牙与护栏共存输出A1,只有路牙A2,只有护栏A3 ### 2.1 构造输入对象 ``` List lineInputList = new ArrayList<>(); //构造 路牙 护栏对象 LineInput lineInput = new LineInput(); lineInput.setLineString(几何); lineInput.setPartType(路牙); lineInput.setNeedShadow(true); lineInputList.add(lineInput); lineInputList.add(lineInput); ``` ### 2.2 计算 ``` LineLabelFactory lineLabelFactory = new LineLabelFactory(lineInputList, 道路线要素几何); List lineLabelList = lineLabelFactory.getLineLabel(partTypeSet->{ if(partTypeSet.contains(1)){ return 1; }else if(partTypeSet.contains(2)){ return 2; }else { return PartType.EMPTY; } }); ``` ## 3. GeoHashTool工具 进行中......