目录
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)
}