文章目录
前言
之前写了几篇与shp字段相关的文章。
【Java+GDAL】shp新增属性字段与删除属性字段
【Java+GDAL】读取shp信息(字段、要素属性等)
Java使用gdal更改shp要素的字段属性值
Java使用gdal重命名shp属性字段
今天来看看怎么读shp的坐标系信息和EPSG编码。在shp文件中,坐标系信息存储在.prj文件当中,如果数据中不存在该文件则没有坐标系信息。shp文件通常有.shp,.dbf,.shx这三个文件,而.prj文件和.cpg文件有可能没有,.cpg文件是用来存shp的编码方式的(比如utf-8)。
一、GDAL和Java版本
GDAL版本为3.0.1
Java为JDK 17.0.11
二、代码实现
1.引入gdal环境
代码如下(示例):
import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
//自定义shp工具类
public class ShpUtil {
static {
ogr.RegisterAll();
gdal.AllRegister();//设置gdal环境
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");//支持中文路径
gdal.SetConfigOption("SHAPE_ENCODING","CP936");//属性表字段支持中文
}
//......获取坐标系信息方法
}
2.读取坐标信息
代码如下(示例):
/**
* 读坐标系信息
* @param shpPath,shp路径
* @author 415411
* @create 2024/9/11
**/
public static String getShpCoordinateSystem(String shpPath) {
// 只读方式打开文件
DataSource dataSource = ogr.Open(shpPath, 0);
Layer layer = dataSource.GetLayer(0);
// 获取参考坐标系的名称
String name = layer.GetSpatialRef().GetName();
// 输出完成参考坐标系信息
System.out.println(layer.GetSpatialRef().toString());
dataSource.delete();
return name;
}
/**
* 获取坐标系EPSG编码
* @param shpPath,shp路径
* @author 415411
* @create 2024/9/11
**/
public static String getGdbCoordinateEPSG(String shpPath) {
DataSource dataSource = ogr.Open(shpPath, 0);
Layer layer = dataSource.GetLayer(0);
// 获取EPSG编码
String code = layer.GetSpatialRef().GetAttrValue("AUTHORITY", 0)
+ ":" + layer.GetSpatialRef().GetAttrValue("AUTHORITY", 1);
dataSource.delete();
return code;
}
3.测试使用
代码如下(示例):
public static void main(String[] args) throws IOException {
String ref = getShpCoordinateSystem("D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp");
System.out.println(ref);
String epsg = getGdbCoordinateEPSG("D:\\work\\testdata\\mapshp\\mbstyle_cookbook_line.shp");
System.out.println(epsg);
}
使用Sublime Text 3文本编辑器打开查看测试使用数据的.prj文件如下图:
程序输出结果如下图:
总结
提示:今天简单实现了读shp坐标和EPSG编码,对于不存在.prj文件这种无坐标信息等一些情况没有考虑。可以自己使用文本编辑器打开shp中的.prj文件查看里面的坐标信息,然后进行代码调式。
标签:shp,Java,String,EPSG,GDAL,坐标系,gdal From: https://blog.csdn.net/weixin_45011889/article/details/142148163