Java用GDAL读写shapefile的方法示例_java

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

打开形状如下

总结

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索gdal
, shapefile
, java读取shapefile
gdal读取shapefile
gdal shapefile、gdal wkt转shapefile、shapefile 读写、gdal shape、gdal java示例,以便于您获取更多的相关知识。

时间: 2024-10-29 05:30:41

Java用GDAL读写shapefile的方法示例_java的相关文章

Java判断是否为闰年的方法示例_java

import java.util.Scanner; public class LeapYear { public static void main(String[] arg){ Scanner scan = new Scanner(System.in); System.out.println("请输入一个年份:"); long year= scan.nextLong(); if(year%4==0 && year%100 !=0 ||year%400 ==0){ Sys

java 字符串分割的三种方法(总结)_java

最近在项目中遇到一个小问题,一个字符串分割成一个数组,类似String str="aaa,bbb,ccc"; 然后以","为分割符,将其分割成一个数组,用什么方法去实现呢? 第一种方法: 可能一下子就会想到使用split()方法,用split()方法实现是最方便的,但是它的效率比较低 第二种方法: 使用效率较高的StringTokenizer类分割字符串,StringTokenizer类是JDK中提供的专门用来处理字符串分割子串的工具类.它的构造函数如下: publ

java实现文件变化监控的方法(推荐)_java

一. spring配置文件:application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://ww

java类加载器和类反射使用示例_java

一.一个命令对应一个进程. 当我们启动一个Java程序,即启动一个main方法时,都将启动一个Java虚拟机进程,不管这个进程有多么复杂.而不同的JVM进程之间是不会相互影响的.这也就是为什么说,Java程序只有一个入口--main方法,让虚拟机调用.而两个mian方法,对应的是2个JVM进程,启动的是两个不同的类加载器,操作的实际上是不同的类.故而不会互相影响. 二.类加载. 当我们使用一个类,如果这个类还未加载到内存中,系统会通过加载.连接.初始化对类进行初始化. 1.类加载:指的是将类的c

Java基础教程之构造器与方法重载_java

在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值. 显式初始化要求我们在写程序时就确定初始值,这有时很不方便.我们可以使用构造器(constructor)来初始化对象.构造器可以初始化数据成员,还可以规定特定的操作.这些操作会在创建对象时自动执行. 定义构造器 构造器是一个方法.像普通方法一样,我们在类中定义构造器.构造

Java中字符串的一些常见方法分享_java

1.Java中字符串的一些常见方法 复制代码 代码如下: /** *  */package com.you.model; /** * @author Administrator * @date 2014-02-24 */public class Replace {  /**  * @param args  */ public static void main(String[] args)  {  /**   * 原字符串   */  String str = "78454545855ksdjnf

Java的JSON转换库GSON的基本使用方法示例_java

下载和部署GSONGSON的GitHub页面地址:https://github.com/google/gson 在使用GSON API工作之前,你需要下载库(jar文件),并将其包含到类路径中.库,连同源代码和Java文档,都可以从http://code.google.com/p/google-gson/downloads/list下载.下载完毕后,添加gson-<version>.jar到类路径.对于那些偏好使用Maven管理依赖(JAR文件)的读者,添加如下依赖到pom.xml. <

java 遍历MAP的几种方法示例代码_java

java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>(); map.put("username", "qq"); map.put("passWord", "123"); map.put("userID", "1"); map.put("email", "qq

将Java的List结构通过GSON库转换为JSON的方法示例_java

发现了google的gson,因为之前对于protocolbuf有一些了解,带着一些好奇心,我开始使用了gson. GitHub主页:https://github.com/google/gson 经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段. 将List或者Map转换成json非常简单:     public String ge