Java 使用GDAL 读写 shapefile

简介:

读取shp文件,并把它转化为json

复制代码
import org.gdal.ogr.*;
import org.gdal.ogr.Driver;
import org.gdal.gdal.*;

public class GdalShpTest {
    public static void main(String[] args) {
        // 注册所有的驱动
        ogr.RegisterAll();
        // 为了支持中文路径,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
        // 为了使属性表字段支持中文,请添加下面这句
        gdal.SetConfigOption("SHAPE_ENCODING","");

        String strVectorFile = "D:\\test\\NODE.shp";
        //打开文件
        DataSource ds = ogr.Open(strVectorFile,0);
        if (ds == null)
        {
            System.out.println("打开文件失败!" );
            return;
        }
        System.out.println("打开文件成功!" );
        Driver dv = ogr.GetDriverByName("GeoJSON");
        if (dv == null)
        {
            System.out.println("打开驱动失败!" );
            return;
        }
        System.out.println("打开驱动成功!" );
        dv.CopyDataSource(ds, "D:\\test\\node.json");
        System.out.println("转换成功!" );
    }
}
复制代码

写shp文件

复制代码
import org.gdal.ogr.*;
import org.gdal.gdal.*;
class writeShp2 {
    public static void main(String[] args) {
        writeShp2 readshpObj = new writeShp2();
        readshpObj.WriteVectorFile();
    }

    static void WriteVectorFile() {
        String strVectorFile = "D:\\test\\test.shp";

        ogr.RegisterAll();
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
        gdal.SetConfigOption("SHAPE_ENCODING", "CP936");

        String strDriverName = "ESRI Shapefile";
        org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
        if (oDriver == null) {
            System.out.println(strVectorFile + " 驱动不可用!\n");
            return;
        }
        DataSource oDS = oDriver.CreateDataSource(strVectorFile, null);
        if (oDS == null) {
            System.out.println("创建矢量文件【" + strVectorFile + "】失败!\n");
            return;
        }

        Layer oLayer = oDS.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null);
        if (oLayer == null) {
            System.out.println("图层创建失败!\n");
            return;
        }

        // 下面创建属性表
        // 先创建一个叫FieldID的整型属性
        FieldDefn oFieldID = new FieldDefn("FieldID", ogr.OFTInteger);
        oLayer.CreateField(oFieldID);

        // 再创建一个叫FeatureName的字符型属性,字符长度为50
        FieldDefn oFieldName = new FieldDefn("FieldName", ogr.OFTString);
        oFieldName.SetWidth(100);
        oLayer.CreateField(oFieldName);

        FeatureDefn oDefn = oLayer.GetLayerDefn();

        // 创建三角形要素
        Feature oFeatureTriangle = new Feature(oDefn);
        oFeatureTriangle.SetField(0, 0);
        oFeatureTriangle.SetField(1, "三角形");
        Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))");
        oFeatureTriangle.SetGeometry(geomTriangle);
        oLayer.CreateFeature(oFeatureTriangle);

        // 创建矩形要素
        Feature oFeatureRectangle = new Feature(oDefn);
        oFeatureRectangle.SetField(0, 1);
        oFeatureRectangle.SetField(1, "矩形");
        Geometry geomRectangle = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))");
        oFeatureRectangle.SetGeometry(geomRectangle);
        oLayer.CreateFeature(oFeatureRectangle);

        // 创建五角形要素
        Feature oFeaturePentagon = new Feature(oDefn);
        oFeaturePentagon.SetField(0, 2);
        oFeaturePentagon.SetField(1, "五角形");
        Geometry geomPentagon = Geometry.CreateFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,70 0))");
        oFeaturePentagon.SetGeometry(geomPentagon);
        oLayer.CreateFeature(oFeaturePentagon);

        oDS.SyncToDisk();
        System.out.println("\n数据集创建完成!\n");
    }
}
复制代码

 

 

得到test.dbf, test.shp, test.shx。

test.dbf如下:

打开形状如下

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/5868010.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Java
使用Java读写dbf文件【附源代码】
使用Java读写dbf文件【附源代码】
|
4月前
|
Java 关系型数据库 MySQL
某Java程序员在外包公司每天读写删改几年后,发现跳不出来了
面试了一波Java程序员,有好几位80后的。按理说,他们有将近十年的工作开发时间,无论经验还是技术都应该称得上老司机了。着重考察了Spring中bean的后置处理器相关问题,大概是这样问的:
|
8月前
|
Java
Java 字符流解密:深入探究字符数据的读写之道
在 Java 编程中,字符流是一个重要的概念,它为我们提供了一种处理字符数据的方法。与字节流不同,字符流专门用于处理字符数据,包括文本文件的读写以及字符编码的转换。本文将带您深入探索 Java 中的字符流,揭示其原理、分类、用法以及在实际开发中的应用场景。
|
8月前
|
Java 关系型数据库 MySQL
某Java程序员在外包公司每天读写删改几年后,发现跳不出来了
面试了一波Java程序员,有好几位80后的。按理说,他们有将近十年的工作开发时间,无论经验还是技术都应该称得上老司机了。着重考察了Spring中bean的后置处理器相关问题,大概是这样问的:
|
8月前
|
存储 Java
java使用ini4j读写和修改ini配置文件(支持section)
java使用ini4j读写和修改ini配置文件(支持section)
313 0
java使用ini4j读写和修改ini配置文件(支持section)
|
10月前
|
Java Unix Linux
Java串口通信,串口读写卡工具介绍
Java串口通信,串口读写卡工具介绍
|
10月前
|
监控 Java 测试技术
我的小工具,java版串口读写卡测试工具
我的小工具,java版串口读写卡测试工具
|
11月前
|
XML 存储 Java
Apache POI 实现用Java操作Excel完成读写操作
Apache POI是一个用于操作Microsoft Office格式文件(包括xls、docx、xlsx、pptx等)的Java API库。POI全称为Poor Obfuscation Implementation,是Apache Software Foundation的一个开源项目。它提供了一组Java API,使得Java程序可以读取、写入和操作Microsoft Office格式文件。
Java:apache.poi读写Excel文件
Java:apache.poi读写Excel文件
264 0
|
Java 程序员
JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
64 0