gdal在java环境中读取mif/mid文件以及写入数据

 

目录

1、maven项目搭建的gdal环境

2、maven项目搭建后开始代码

3、怎么提取两个Layer中某个字段相同的所有数据(这个并非是取属性交集)?



1、maven项目搭建的gdal环境

引入gdal依赖:

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

在此之前,需要gdal的编译好的文件,配置到对应jdk文件下,如dll文件,详细可见https://blog.csdn.net/wt346326775/article/details/53466418

2、maven项目搭建后开始代码

(1)注册所有驱动

ogr.RegisterAll();

(2)打开mif文件,会生成一个数据源,第一个参数是mif文件地址(mid文件存放的是属性值,而文件结构和字段都是在mif文件中,所有只需要读取mif文件数据就可以了),第二个参数0表示只读

DataSource dataSource = ogr.Open(url, 0);
if (dataSource == null) {
    return;
}

(3)从数据源中取出图层,这个图层就是存放的几何属性,tableName传入的就是mif文件名

Layer layer = dataSource.ExecuteSQL("Select * from {tableName});

(4)可以从图层中读取各种参数,Layer有一系列的方法可以使用,https://www.gdal.org/java/org/gdal/ogr/Layer.html

如:

GetLayerDefn() 得到图层的架构信息FeatureDefn,从架构中获取字段信息

FeatureDefn featureDefn = layer.GetLayerDefn();
int fieldCount = featureDefn.GetFieldCount();
for (int m = 0; m < fieldCount; m++) {
      FieldDefn fieldDefn = featureDefn.GetFieldDefn(m);
      String fieldName = fieldDefn.GetName();//字段名
      int width = fieldDefn.GetWidth();//字段长度
}

GetFeatureCount​() 得到 要素数量

GetExtent​()得到图层范围,得到的是四个点的坐标

GetNextFeature()得到下个要素,用while遍历得到所有要素信息,常与GetFeature(i)做比较,前者效率更高一些

(5)通过Feature.GetFieldAsString(name)获取每个字段的值

 while ((feature = layer.GetNextFeature()) != null) {
   String id = feature.GetFieldAsString("ID");
}

至此mif文件的架构信息和字段都能取到

3、怎么提取两个Layer中某个字段相同的所有数据(这个并非是取属性交集)?


    private Map<String, Feature> readFeature(Layer layer) {
        layer.ResetReading();//重新读取feature
        Feature feature;
        Map<String, Feature> data = new HashMap<String, Feature>();
        while ((feature = layer.GetNextFeature()) != null) {
            String id = feature.GetFieldAsString("ID");
            data.put(id, feature);
        }
        return data;
    }        



        Map<String, Feature> oldMap = readFeature(oldLayer);
        Map<String, Feature> newMap = readFeature(newLayer);
        Set<String> oldIds = oldMap.keySet();
        Set<String> newIds = newMap.keySet();
        oldIds.retainAll(newIds);//取两个ID相同的数据交集
        for (String oldId : oldIds) {
            newMap.get(oldMap)
        }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值