技术研究之Geotools
前沿
在java中使用 geotool 工具,首先就是要先把这个依赖下载下来
1 | <!-- geotools--> |
【1】.填坑:Maven工程引用GeoTools依赖 将GeoTools对应的编译版本下载下来,并利用《填坑:IDEA导入Maven工程无法下载依赖项》方法,将依赖的jar包注册到本地仓库中。如果你配置了阿里的镜像,可以在自己的maven配置文件修改一下,直接从GeoTools的远程库中下载。
【2】.GeoTools依赖使用Maven下载失败解决办法记录 方法一:直接去官网下载,然后手动拷贝到本地仓库对应位置,然后点击idea中右侧的重新加载maven项目。方法二(推荐):在pom.xml中加入osgeo的仓库地址(注意setting中阿里云镜像的参数应为
1.kml转geojson
为了将 kml 转成 geojson ,我用了这两个库,结果就是很多的问题,首先就是引入的问题。
2.shape转geojson
【1】.java 使用GeoTools工具 geojson 与shp 相互转换 这个代码就可以直接运行,其实大同小异的
【2】.利用geotools实现Shapefile和GeoJSON相互转换
【3】.使用GeoTools进行GeoJSON和Shp的互相转换
3.通过坐标点生成LineString
【1】.通过坐标点生成geojson格式的Polygon文件(Java)
4.生成缓冲区
根据 geojson 格式的线数据,生成缓冲区,经过长时间的尝试,最后我还是搞定了代码,代码如下:
1 | // 创建buffer |
这里有一个问题,如果线有交叉的时候,生成的buffer就会出现空洞的情况,但是在arcgis中却没有产生空洞。
最后我还是用了一个 凸壳分析 (ConvexHull),将这个破洞补上了。
1 | // 生成缓冲区 |
【1】.GeoTools解析GeoJson为要素集(FeatureCollection)含嵌套数组属性 这里有所有的要素类型,遍历要素属性,获取指定属性信息功能。
【2】.gis地理数据处理:geotools将多个线段生成buffer并融合成多边形 这里使用 geometry.buffer(distance) 创建了buffer。
【3】.读写shp等空间数据,进行geometry、SimpleFeature等转换的工具类 这里有 simplefeature 转为 geometry 的方法
【4】.【geotool】wkt、geojson、geometry互相转换
【5】.GeoTools 构建线的缓冲区 BufferOp bufOp = new BufferOp(gfLineString)
【6】.Geotools创建Feature的两种方式 1.SimpleFeatureBuilder方式创建;2.getFeatureWriter方式创建;
【7】.【geotools随笔】FeatureType的创建与修改 这里我参考了 DataUtilities.createType 的创建。
【8】.GeoTools:Shapefile创建 这里其实也有 SimpleFeatureType 接口的说明。ShapefileDataStoreFactory类、ShapefileDataStore类、创建Shapefile文件实示例
【9】.计算JTS缓冲区面积(Java)
【10】.JTS (Java Topology Suite) 开发教程 联合分析 (Union)、凸壳分析 (ConvexHull)、差异分析 (Difference)、对称差异分析 (SymDifference)、构建不规则三角网 (TIN)、几何体致密化 (Densify)
【11】.JTS的buffer支持CAP的样式
【12】.JTS Geometry Operations(二) Buffer,返回的结果是一个Polygon或者 MultiPolygon,注意:bufOp.setEndCapStyle 缓冲样式的设置,总共有三种CAP_ROUND,CAP_BUTT,CAP_SQUARE 对应如下三种情况
5.计算面积
计算面积的方法很简单,就是使用 getArea() 方法获取面积
1 | Geometry defaultGeometry =(Geometry) feature.getDefaultGeometry(); |
计算投影坐标系,就是将 4326 的坐标系转为了 3857 坐标系,然后计算了面积。
1 | /** |
【1】.java geotools 计算面积 这里直接用 polygon.getArea() 计算的面积。
【2】.利用geoTools计算shp面积
【3】.GIS面积计算
【4】.根据wkt或geometry计算面积(平方米) 这里进行了投影转换,将84坐标转为了3857坐标。
【5】.经纬度坐标和投影坐标的转换
【6】.geotools之坐标转换
【7】.利用geoTools计算shp面积 这里也做了一个坐标变换,使用了shp文件坐标系,转为了 3857 坐标系。
【8】.Class Geometry
6.合并多边形
这里我是将多个 geomtry 合并到一个 list 中,然后进行合并的。这些 geomtry 可能相邻,也可能不相邻。
1 | try{ |
【1】.使用Geotools合并多个Geometry成一个图形 1.在geometry数量少的情况下可以直接循环调用geometry的union方法。2.在geometry数量比较多的时候用上面的方法会比较耗时,可以改用GeometryCollection进行合并。
【2】.java List和数组相互转换方法 这是arraylist转换的方法
【3】.GeoTools测试几何合并union 这里有相邻和不相邻的图形合并。
【4】.Geotools中Geometry对象与GeoJson的相互转换
【5】.Java将WKT格式的Geomotry转换成GeoJSON
【6】.JTS-Geometry使用说明 创建多边形:GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
7.抽稀
自带了抽稀算法,不一定好用。
1 | Geometry polyline=new GeometryFactory().createLineString(polygonCoordinateList.toArray(new Coordinate[0])); |
【1】.使用Java对轨迹进行抽稀,并生成mvt(Map Vector Tile)瓦片 这里有两种方法,一种就是使用jts算法,一种是自己实现了的道格拉斯算法。
【2】.JTS-Java图形拓扑学习笔记 没啥用
【3】.简化面 arcgis 简化面操作
8.geojson转为shp
采用参考文章1中的代码,基本上都可以实现,我遇到的问题:class org.geotools.data.directory.DirectoryDataStore cannot be cast to class org.geotools.data.shapefile.ShapefileDataStore (org.geotools.data.directory.DirectoryDataStore and org.geotools.data.shapefile.ShapefileDataStore are in unnamed module of loader ‘app’).
【解决方案】
这个问题的解决方案,就是不要传入一个路径,而是应该传入一个以 .shp 文件结尾的文件。
【1】.使用GeoTools进行GeoJSON和Shp的互相转换
【2】.SpatialDataTransformUtil.java 这里的代码可以用,没有关系,基本上都能用。
【3】.JAVA 超详细 将文件夹目录打包为 ZIP 压缩包并下载
9.问题
(1)java: 读取C:\Users\hj.m2\repository\org\geotools\gt-main\28.2\gt-main-28.2.jar时出错; zip END header not found
当我在新的虚拟机上运行的时候,总是出现下载问题。
【解决方法】
我把整个的 .m2 删除了,然后重新强制下载。
1 | mvn clean install -U |
