ncl 添加点shp文件_JAVA用geotools读写shape格式文件

这篇博客详细介绍了如何使用Java的Geotools库来读取和写入Shape格式的文件,包括读取.dbf文件、读取和写入.shp文件(以点为例)的步骤,并给出了不同Geotools版本的代码示例。
摘要由CSDN通过智能技术生成

JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2)

(后面添加对应geotools 10.0版本的写法)

读shape文件。

shape格式文件最少包含3个文件,他们的后缀是:.shp, .dbf, .shx。

.shp存储地理形状和位置信息,.dbf存储属性信息,.shx是索引文件。

单独读取DBF文件

public void readDBF(String path) {

Java代码  

DbaseFileReader reader = null;

try {

reader = new DbaseFileReader(new ShpFiles(path), false, Charset.forName("GBK"));

DbaseFileHeader header = reader.getHeader();

int numFields = header.getNumFields();

//迭代读取记录

while (reader.hasNext()) {

try {

Object[] entry = reader.readEntry();

for (int i=0; i

String title = header.getFieldName(i);

Object value = entry[i];

System.out.println(title+"="+value);

}

} catch (Exception e) {

e.printStackTrace();

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (reader != null) {

//关闭

try {reader.close();} catch (Exception e) {}

}

}

}

读取3个文件,以point为例:

public void readSHP(String path) {

Java代码  

ShapefileDataStore shpDataStore = null;

try{

shpDataStore = new ShapefileDataStore(new File(path).toURI().toURL());

shpDataStore.setStringCharset(Charset.forName("GBK"));

String typeName = shpDataStore.getTypeNames()[0];

FeatureSource featureSource = null;

featureSource = (FeatureSource)shpDataStore.getFeatureSource(typeName);

FeatureCollection result = featureSource.getFeatures();

System.out.println(result.size());

FeatureIterator itertor = result.features();

while(itertor.hasNext()){

SimpleFeature feature = itertor.next();

Collection p = feature.getProperties();

Iterator it = p.iterator();

while(it.hasNext()) {

Property pro = it.next();

if (pro.getValue() instanceof Point) {

System.out.println("PointX = " + ((Point)(pro.getValue())).getX());

System.out.println("PointY = " + ((Point)(pro.getValue())).getY());

} else {

System.out.println(pro.getName() + " = " + pro.getValue());

}

}

}

itertor.close();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch(IOException e) { e.printStackTrace(); }

}

写shape文件,以point为例:

Java代码  

public static void main(String[] args) {

try{

//定义属性

final SimpleFeatureType TYPE = DataUtilities.createType("Location",

"location:Point," + // 

"POIID:String," + // 

"MESHID:String," + // a number attribute

"OWNER:String"

);

SimpleFeatureCollection collection = FeatureCollections.newCollection();

GeometryFactory geometryFactory = new GeometryFactory();

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);

double latitude = Double.parseDouble("116.123456789");

double longitude = Double.parseDouble("39.120001");

String POIID = "2050003092";

String MESHID = "0";

String OWNER = "340881";

/* Longitude (= x coord) first ! */

Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));

Object[] obj = {point, POIID, MESHID, OWNER};

SimpleFeature feature = featureBuilder.buildFeature(null, obj);

collection.add(feature);

feature = featureBuilder.buildFeature(null, obj);

collection.add(feature);

File newFile = new File("D:/newPoi.shp");

ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

Map params = new HashMap();

params.put("url", newFile.toURI().toURL());

params.put("create spatial index", Boolean.TRUE);

ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);

newDataStore.createSchema(TYPE);

newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);

Transaction transaction = new DefaultTransaction("create");

String typeName = newDataStore.getTypeNames()[0];

SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);

if (featureSource instanceof SimpleFeatureStore) {

SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;

featureStore.setTransaction(transaction);

try {

featureStore.addFeatures(collection);

transaction.commit();

} catch (Exception problem) {

problem.printStackTrace();

transaction.rollback();

} finally {

transaction.close();

}

} else {

System.out.println(typeName + " does not support read/write access");

}

} catch (Exception e) {

e.printStackTrace();

}

}

以下代码对应geotools10.0版本

一、读shp文件(图形信息+属性信息)的写法:

Java代码  

import java.io.File;

import java.nio.charset.Charset;

import java.util.Iterator;

import org.geotools.data.shapefile.ShapefileDataStore;

import org.geotools.data.shapefile.ShapefileDataStoreFactory;

import org.geotools.data.simple.SimpleFeatureIterator;

import org.geotools.data.simple.SimpleFeatureSource;

import org.opengis.feature.Property;

import org.opengis.feature.simple.SimpleFeature;

public class ShpNew {

public static void main(String[] args) {

ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

try {

ShapefileDataStore sds = (ShapefileDataStore)dataStoreFactory.createDataStore(new File("D:\\work\\shpdir\\Poi.shp").toURI().toURL());

sds.setCharset(Charset.forName("GBK"));

SimpleFeatureSource featureSource = sds.getFeatureSource();

SimpleFeatureIterator itertor = featureSource.getFeatures().features();

while(itertor.hasNext()) {

SimpleFeature feature = itertor.next();

Iterator it = feature.getProperties().iterator();

while(it.hasNext()) {

Property pro = it.next();

System.out.println(pro);

}

}

itertor.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

二、读图形信息

Java代码  

try {

ShpFiles sf = new ShpFiles("D:\\Poi.shp");

ShapefileReader r = new ShapefileReader( sf, false, false, new GeometryFactory() );

while (r.hasNext()) {

Geometry shape = (Geometry) r.nextRecord().shape();  //com.vividsolutions.jts.geom.Geometry;

System.out.println(shape.toString());

}

r.close();

} catch (Exception e) {

e.printStackTrace();

}

三、读dbf文件

Java代码  

public void readDBF() {

try {

FileChannel in = new FileInputStream("D:\\Poi.dbf").getChannel();

DbaseFileReader dbfReader =  new DbaseFileReader(in, false,  Charset.forName("GBK"));

DbaseFileHeader header = dbfReader.getHeader();

int fields = header.getNumFields();

while ( dbfReader.hasNext() ){

DbaseFileReader.Row row =  dbfReader.readRow();

//              System.out.println(row.toString());

for (int i=0; i

System.out.println(header.getFieldName(i) + " : " + row.read(i));

}

}

dbfReader.close();

in.close();

} catch (Exception e) {

e.printStackTrace();

}

}

四、写shape文件

Java代码  

public void write(String filepath) {

try {

//创建shape文件对象

File file = new File(filepath);

Map params = new HashMap();

params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );

ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);

//定义图形信息和属性信息

SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();

tb.setCRS(DefaultGeographicCRS.WGS84);

tb.setName("shapefile");

tb.add("the_geom", Point.class);

tb.add("POIID", Long.class);

tb.add("NAMEC", String.class);

ds.createSchema(tb.buildFeatureType());

ds.setCharset(Charset.forName("GBK"));

//设置Writer

FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);

//写下一条

SimpleFeature feature = writer.next();

feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.123, 39.345)));

feature.setAttribute("POIID", 1234567890l);

feature.setAttribute("NAMEC", "某兴趣点1");

feature = writer.next();

feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.456, 39.678)));

feature.setAttribute("POIID", 1234567891l);

feature.setAttribute("NAMEC", "某兴趣点2");

writer.write();

writer.close();

ds.dispose();

//读取刚写完shape文件的图形信息

ShpFiles shpFiles = new ShpFiles(filepath);

ShapefileReader reader = new ShapefileReader(shpFiles, false, true, new GeometryFactory(), false);

try {

while (reader.hasNext()) {

System.out.println(reader.nextRecord().shape());

}

} finally {

reader.close();

}

} catch (Exception e) { }

}

五、由源shape文件创建新的shape文件

Java代码  

public void transShape(String srcfilepath, String destfilepath) {

try {

//源shape文件

ShapefileDataStore shapeDS = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(new File(srcfilepath).toURI().toURL());

//创建目标shape文件对象

Map params = new HashMap();

FileDataStoreFactorySpi factory = new ShapefileDataStoreFactory();

params.put(ShapefileDataStoreFactory.URLP.key, new File(destfilepath).toURI().toURL());

ShapefileDataStore ds = (ShapefileDataStore) factory.createNewDataStore(params);

// 设置属性

SimpleFeatureSource fs = shapeDS.getFeatureSource(shapeDS.getTypeNames()[0]);

//下面这行还有其他写法,根据源shape文件的simpleFeatureType可以不用retype,而直接用fs.getSchema设置

ds.createSchema(SimpleFeatureTypeBuilder.retype(fs.getSchema(), DefaultGeographicCRS.WGS84));

//设置writer

FeatureWriter writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);

//写记录

SimpleFeatureIterator it = fs.getFeatures().features();

try {

while (it.hasNext()) {

SimpleFeature f = it.next();

SimpleFeature fNew = writer.next();

fNew.setAttributes(f.getAttributes());

writer.write();

}

} finally {

it.close();

}

writer.close();

ds.dispose();

shapeDS.dispose();

} catch (Exception e) { e.printStackTrace();    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值