用geotools容易将shapefile、geojson、kml等地理信息数据解析成它识别的FeatureCollection对象,然后在进行其他的数据操作。dxf文件是AutoCAD的数据交换文件,不带坐标系定义。有时候需要将以上的这些数据转成dxf文件,这时需要借助gdal环境和java本地方法接口写入,读取dxf也能实现(本文不介绍)。本文用基于java语言的geotools和gdal本地方法接口来处理FeatureCollection对象。

1.gdal环境

  • 安装

Linux:

root@shanks:~# apt-get install gdal-bin libgdal-dev libgdal-java

注意安装的版本,本文示例是在Linux环境下实现。
Windows:

下载地址http://www.gdal.org/usergroup0.html,下载安装相应的安装包。

  • JNI包

gdal安装后提供本地方法给java调用,对应的版本JNI接口依赖添加(本例使用的是2.1.0):
maven:

<dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>2.1.0</version>
</dependency>

gradle:

org.gdal:gdal:2.1.0

有时不能准确的找到.dll或者.so文件,需记住库文件所在的路径。本例子库文件路径是在“/usr/lib/jni”下,目录下有文件:

root@shanks:/usr/lib/jni# ls
libgdalconstjni.so  libgdalconstjni.so.20  libgdaljni.so  libgdaljni.so.20  libogrjni.so  libogrjni.so.20  libosrjni.so  libosrjni.so.20

2.数据操作

  • 完整的代码

Demo.java

package shanks.demo;import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
import org.gdal.osr.SpatialReference;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.feature.FeatureCollection;
import org.geotools.referencing.CRS;
import org.opengis.feature.simple.SimpleFeature;
import java.io.File;public class Demo {public static void main(String[] args) {try {// 注册驱动ogr.RegisterAll();// 支持中文路径gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");// 属性表字段支持中文gdal.SetConfigOption("SHAPE_ENCODING","CP936");String in = "/home/shanks/shp/test_shp/t.shp";  // 输入文件路径String out = "/home/shanks/shp/test_shp/dxf/dxf.dxf";  // 输出文件路径File shp_file = new File(in);// 读shapefileShapefileDataStore dataStore = new ShapefileDataStore(shp_file.toURI().toURL());// 得到FeatureCollection对象FeatureCollection featureCollection = dataStore.getFeatureSource().getFeatures();//坐标系String srs = CRS.lookupIdentifier(featureCollection.getSchema().getCoordinateReferenceSystem(),true);int srid = Integer.valueOf(srs.split(":")[1]);// 将要输出的类型,这里是导出DXF文件Driver driver = ogr.GetDriverByName("DXF");if(null == driver)throw new NullPointerException("获取DXF驱动失败!");DataSource dataSource = driver.CreateDataSource(out);if(null == dataSource)throw new NullPointerException("DataSource创建失败!");// gdal坐标系SpatialReference spatialReference = new SpatialReference();spatialReference.ImportFromEPSG(srid);final String layer0 = "Layer0";// 创建一个Layer。dxf中可以创建多个LayerLayer layer = dataSource.CreateLayer(layer0,spatialReference);if(null == layer)throw new NullPointerException("Layer创建失败!");// dxf的属性字段集合。固定的某些字段:// "ExtendedEntity","SubClasses","Text","EntityHandle","Linetype","Layer"等FeatureDefn featureDefn = layer.GetLayerDefn();// 查看固定属性for (int i=0;i<featureDefn.GetFieldCount();i++) {FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);System.out.print(fieldDefn.GetName() + ": ");System.out.println(fieldDefn.GetFieldType());  // ogrConstants中定义的常量}// 迭代器SimpleFeatureIterator iterator = (SimpleFeatureIterator) featureCollection.features();// 装配while (iterator.hasNext()) {SimpleFeature simpleFeature = iterator.next();Feature feature = new Feature(featureDefn);// FIDString fid = simpleFeature.getID();feature.SetFID(Integer.parseInt(fid.substring(fid.lastIndexOf(".") + 1)));// 这行代码可以提取simpleFeature中的属性值,但不能写入新生成的gdal dxf属性中。// 如果simpleFeature的的字段与"ExtendedEntity","SubClasses","Text","EntityHandle","Linetype","Layer"等吻合,则可以按对应的值写入。// 本例子的t.shp属性不一致,所以没有遍历填入// Collection<Property> properties = simpleFeature.getProperties();// 写入"Layer"字段值feature.SetField("Layer", layer0);// 几何信息,WKTGeometry geometry = ogr.CreateGeometryFromWkt(simpleFeature.getDefaultGeometry().toString());feature.SetGeometry(geometry);// layer添加featurelayer.CreateFeature(feature);}// 关闭迭代iterator.close();// 关闭对象连接dataSource.delete();// 以下几行代码判断Feature的写入数量DataSource source = ogr.Open(out,0);boolean code = featureCollection.size() == source.GetLayer(0).GetFeatureCount();System.out.println("\n判断写入前后Feature数量是否相等: " + code);source.delete();} catch (Throwable e){e.printStackTrace();}}
}

运行时可以带虚拟机参数:

-Djava.library.path="/usr/lib/jni"
  • 输出结果:
Layer: 4
SubClasses: 4
ExtendedEntity: 4
Linetype: 4
EntityHandle: 4
Text: 4
BlockName: 4
BlockScale: 3
BlockAngle: 2判断写入前后Feature数量是否相等: true

具体流程见代码中的注释,执行无误后得到文件/home/shanks/shp/test_shp/dxf/dxf.dxf,可在AutoCAD、QGIS、ArcGIS中打开。可见只需用geotools框架将geojson、kml、gml3等数据解析成FeatureCollection中间对象,很容易将其转为dxf文件。

JAVA实现Shapefile等转DXF格式相关推荐

  1. chatGPT回答:java如何将dwg转为dxf

    通过以下步骤将DWG文件转换为DXF文件: 第一种: 1.打开AutoCAD软件. 2.选择"打开"选项,导入DWG文件. 3.在"文件"菜单中选择" ...

  2. java pdf 多页转换为png格式的图片

    java pdf 多页转换为png格式的图片  适用于 无论pdf有多少页均可 废话不说,直接上代码 import java.awt.Graphics; import java.awt.image.B ...

  3. 使用OGR创建dxf格式矢量数据

    使用OGR库创建DXF格式的数据和创建Shp格式的数据基本一样,代码除了注册驱动不一样之外,其他的完全一样. 需要注意的是,OGR创建DXF格式需要data文件夹下的head.dxf,所以首先要设置G ...

  4. dxf转pdf linux,4个最好的PDF转DXF格式的在线转换器

    DXF格式或设计交换格式是指可以在任何图形和CAD程序之间交换图形.图像和文本的格式.将二维或三维图形转换并保存为PDF格式的次数很少.因此,如果您已经扫描了一些图形并希望将其转换为DXF格式,则可以 ...

  5. 使用Java将HTML转成Word格式文件

    转载自  使用Java将HTML转成Word格式文件 import java.io.ByteArrayInputStream; import java.io.File; import java.io. ...

  6. cad转dxf格式文件太大_想知道DWG、DWT、DWS和DXF是什么吗?从了解4种CAD图形格式开始吧...

    原创:就说我在开发区 常用图形文件格式盘点 CAD中的图形文件格式共9种,其扩展名分别为: ❶DWG – 图形或块文件 ❷DWT – 图形样板文件 ❸DWS – 图形标准文件 ❹DXF – 图形交换文 ...

  7. java使用Formatter的时候中英文格式不能对齐

    java使用Formatter的时候中英文格式不能对齐 今天看java编程思想的时候,在第13章13.5小节格式化输出的时候遇到一个问题就是格式化内容中有中文的时候不能很好的对齐,于是上网找解决方法在 ...

  8. AD19 基础应用技巧(快速定义PCB板框,CAD中DWG转DXF格式导入)

    [B站@一个假的攻城狮]导入CAD图纸到PCB,Altium Designer 21教程,第九节. http://www.keyboard-layout-editor.com/ http://buil ...

  9. java解析webp格式图片宽高;java解析webp图片转png格式

    java解析webp格式图片宽高:java解析webp图片转png格式 package 你的包名:***.***.***.***;import java.io.FileInputStream; imp ...

最新文章

  1. Java面试宝典——————Java基础部分(三)
  2. 宇宙膨胀背后的故事(卅三):宇宙之有生于无
  3. SQL2000: MMC 不能打开文件
  4. model存储 swift_Swift语言IOS8开发战记10.Data Model
  5. vue --- 2.0 编译的实现
  6. 电源模块的9个主要性能指标及其作用
  7. 计算机网络之数据链路层:8、介质访问控制之信道划分介质访问控制
  8. wangeditor php上传本地图片,wangEditor 本地上传图片配置
  9. vmware ubuntu硬盘空间不够用,空间扩展
  10. opencv处理视频颠倒问题
  11. SoundMorph Dust for Mac(双耳环绕音频颗粒合成仪)
  12. 详解用Navicat工具将Excel中的数据导入Mysql中
  13. FireReport 层次坐标 使用问题A1[A1:-1]=A1
  14. 项目:心肺复苏按压仪+沁恒赤兔ch32v307+嵌入式开发
  15. securecrt通过ssh连接板子: 密钥交换失败,没有兼容的加密程序
  16. skynet master/slave 模式
  17. python模拟按键_Python在windows下模拟按键和鼠标点击代码
  18. css炫酷标题,炫酷 CSS 背景效果的 10 个代码片段
  19. 【BZOJ1062】[NOI2008]糖果雨【二维树状数组】
  20. ubuntu 16.04 安装anaconda tensorflow opencv keras openslide-python pycharm

热门文章

  1. 现在主流免杀是源码免杀
  2. JAVA调用DingTalk
  3. selenium免登录Java_使用selenium+java模拟登陆今日头条时需要手机验证码登陆,第二次怎么免输入信息登陆?...
  4. windows7怎么安装android,安卓手机安装运行Win7系统教程(图文)
  5. JavaScript Date对象详解 以及 时间戳和时间的相互转换
  6. 干掉PPT!现场编码的职级晋升答辩你参加过么?
  7. python量化分析数据_Python数据分析_量化分析.pdf
  8. zemax-06扫描系统
  9. X79 – E5 1620 1620v2 黑苹果10.15
  10. qmt量化接口查询功能封装源码