当前位置: 首页 > 编程笔记 >

Java用GDAL读写shapefile的方法示例

史磊
2023-03-14
本文向大家介绍Java用GDAL读写shapefile的方法示例,包括了Java用GDAL读写shapefile的方法示例的使用技巧和注意事项,需要的朋友参考一下

GDAL介绍

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

GDAL官方网址:http://www.gdal.org/,它能支持当前流行的各种地图数据格式,包括栅格和矢量地图,具体参考官方网站。该库使用C/C++开发,在Java中使用需要自己编译,具体编译过程这里就不说了,下面来看看本文的主要内容吧。

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如下:

打开形状如下

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

 类似资料:
  • 本文向大家介绍iOS读写json文件的方法示例,包括了iOS读写json文件的方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于iOS读写json文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 一.获取沙盒路径 每个iOS应用都有自己专属的应用沙盒,应用沙盒就是文件系统中的目录。但是iOS系统会将每个应用的沙盒目录与文件系统的其他部分隔

  • 本文向大家介绍用python读写excel的方法,包括了用python读写excel的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了用python读写excel的方法。分享给大家供大家参考。具体如下: 最近需要从多个excel表里面用各种方式整理一些数据,虽然说原来用过java做这类事情,但是由于最近在学python,所以当然就决定用python尝试一下了。发现python果然简洁很

  • 本文向大家介绍nodejs简单读写excel内容的方法示例,包括了nodejs简单读写excel内容的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了nodejs简单读写excel内容的方法。分享给大家供大家参考,具体如下: 支持读写Excel的node.js模块 node-xlsx: 基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件; exce

  • 本文向大家介绍java简单解析xls文件的方法示例【读取和写入】,包括了java简单解析xls文件的方法示例【读取和写入】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java简单解析xls文件的方法。分享给大家供大家参考,具体如下: 读取: 写入: 更多关于java相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DO

  • 本文向大家介绍Android如何读写CSV文件方法示例,包括了Android如何读写CSV文件方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍的是关于Android读写CSV文件的相关内容,CSV也就是Comma-Separated Values逗号分隔的文本文件, 读写csv文件和读写普通文件类似;写的时候给数据之间添加上逗号。 设定存储路径和文件名: 写CSV文件 使

  • 本文向大家介绍Python使用minidom读写xml的方法,包括了Python使用minidom读写xml的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python使用minidom读写xml的方法。分享给大家供大家参考。具体分析如下: 一 python提供的xml支持 2种工业标准的xml解析方法-SAX和DOM。SAX(simple API for XML),是基于事件处理的