搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

这篇具有很好参考价值的文章主要介绍了搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

搭建JAVA GDAL环境

GDAL是一个栅格和矢量地理空间数据格式的转换库,由开源地理空间基金会按照MIT开源协议发布。作为一个库,它向应用程序为所有支持的数据格式提供统一的栅格抽象数据模型和矢量抽象数据模型。它还提供了用于数据转换和处理的各种有用的命令行实用工具。

GDAL官网: GDAL — GDAL documentation

中文官网:GDAL — GDAL 文档 (osgeo.cn)

下载安装

GISInternals 下载GDAL生产环境包

GISInternals is an online system for creating daily built binary packages for the GDAL and MapServer projects.

GISIinternals是一个在线系统,用于为GDAL和MapServer项目创建每日构建的二进制包。

打开上述地址后,根据自己系统选择对应的版本

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

本地部署

  1. 解压后将GDAL的/bin文件夹下所有的.dll(不包括bin目录下的文件夹)和/bin/gdal/java下的dll文件拷贝到jdk安装路径的bin目录下

    1. 注意不要把GDAL解压到带有中文或空格的目录下
    2. JDK安装目录,指的是当前java程序依赖的jdk的安装目录,如使用的jre运行java程序则需要将相关dll文件方到jre的bin目录下【无法确定运行环境时,建议,直接给jdk和jre都放】
  2. 将GDAL的bin目录添加到Path的环境变量下【建议将以下图片的这些目录都添加到环境变量中,避免后续重复添加】
    搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

  3. 添加环境变量

    1. D:\gdal\bin\gdal\plugins 目录添加到环境变量,变量名为GDAL_DRIVER_PATH
    2. proj.db所在路径D:\gdal\bin\proj9\share添加到环境变量,变量名为PROJ_LIB

使用GDAL命令行

这个库分为两大部分是GDAL和OGR,分别管理着栅格和矢量数据。底层是c语言,上层可以是多种语言(包括python,java等)调用,下方是(栅格和矢量)数据处理的中文索引,以及中文帮助;

附官网数据来源:栅格:栅格raster— GDAL 文档 、矢量Programs — GDAL documentation

栅格

  • Common options
  • gdalinfo :列出有关栅格数据集的信息。
  • gdal_translate :在不同格式之间转换栅格数据。
  • gdaladdo :生成或重建概述图像。
  • gdalwarp :图像重新投影和扭曲实用程序。
  • gdaltindex: Builds an OGR-supported dataset as a raster tileindex.
  • gdalbuildvrt :从数据集列表生成VRT。
  • gdal_contour :从栅格高程模型生成矢量等高线。
  • gdaldem :用于分析和可视化DEM的工具。
  • rgb2pct.py :将24位RGB图像转换为8位调色板。
  • pct2rgb.py :将8位调色板图像转换为24位RGB。
  • gdalattachpct.py: Attach a color table to a raster file from an input file.
  • gdal_merge.py :拼接一组图像。
  • gdal2tiles.py :使用TMS tiles、KMLs和简单的web查看器生成目录。
  • gdal2xyz.py: Translates a raster file into xyz format.
  • gdal_rasterize :将矢量几何图形烧成栅格。
  • gdaltransform :转换坐标。
  • nearblack :将近乎黑白的边框转换为黑色。
  • gdal_retile.py :重定时一组平铺和/或构建平铺棱锥层。
  • gdal_grid :从分散的数据创建规则网格。
  • gdal_proximity.py :生成栅格近似图。
  • gdal_polygonize.py :从栅格生成多边形要素图层。
  • gdal_sieve.py :删除小栅格多边形。
  • gdal_fillnodata.py :通过从边缘插值来填充栅格区域。
  • gdallocationinfo :栅格查询工具
  • gdalsrsinfo :以多种格式(WKT、PROJ.4等)列出有关给定SRS的信息
  • gdalmove.py :就地转换栅格文件的地理参考。
  • gdal_edit.py :就地编辑现有GDAL数据集的各种信息。
  • gdal_calc.py :具有numpy语法的命令行栅格计算器。
  • gdal_pansharpen.py :执行pansharpen操作。
  • gdal-config (Unix) :确定有关GDAL安装的各种信息。
  • gdalmanage :标识、删除、重命名和复制栅格数据文件。
  • gdalcompare.py :比较两个图像。
  • gdal_viewshed :计算栅格的可见性遮罩。
  • gdal_create :创建栅格文件(无源数据集)。

矢量

  • Common options
  • gdalinfo :列出有关栅格数据集的信息。
  • gdal_translate :在不同格式之间转换栅格数据。
  • gdaladdo :生成或重建概述图像。
  • gdalwarp :图像重新投影和扭曲实用程序。
  • gdaltindex: Builds an OGR-supported dataset as a raster tileindex.
  • gdalbuildvrt :从数据集列表生成VRT。
  • gdal_contour :从栅格高程模型生成矢量等高线。
  • gdaldem :用于分析和可视化DEM的工具。
  • rgb2pct.py :将24位RGB图像转换为8位调色板。
  • pct2rgb.py :将8位调色板图像转换为24位RGB。
  • gdalattachpct.py: Attach a color table to a raster file from an input file.
  • gdal_merge.py :拼接一组图像。
  • gdal2tiles.py :使用TMS tiles、KMLs和简单的web查看器生成目录。
  • gdal2xyz.py: Translates a raster file into xyz format.
  • gdal_rasterize :将矢量几何图形烧成栅格。
  • gdaltransform :转换坐标。
  • nearblack :将近乎黑白的边框转换为黑色。
  • gdal_retile.py :重定时一组平铺和/或构建平铺棱锥层。
  • gdal_grid :从分散的数据创建规则网格。
  • gdal_proximity.py :生成栅格近似图。
  • gdal_polygonize.py :从栅格生成多边形要素图层。
  • gdal_sieve.py :删除小栅格多边形。
  • gdal_fillnodata.py :通过从边缘插值来填充栅格区域。
  • gdallocationinfo :栅格查询工具
  • gdalsrsinfo :以多种格式(WKT、PROJ.4等)列出有关给定SRS的信息
  • gdalmove.py :就地转换栅格文件的地理参考。
  • gdal_edit.py :就地编辑现有GDAL数据集的各种信息。
  • gdal_calc.py :具有numpy语法的命令行栅格计算器。
  • gdal_pansharpen.py :执行pansharpen操作。
  • gdal-config (Unix) :确定有关GDAL安装的各种信息。
  • gdalmanage :标识、删除、重命名和复制栅格数据文件。
  • gdalcompare.py :比较两个图像。
  • gdal_viewshed :计算栅格的可见性遮罩。
  • gdal_create :创建栅格文件(无源数据集)。

使用JAVA读取DXF文件并转为KML

  1. gdal安装目录下D:\gdal\bin\gdal\javabin目录下gdal下java目录中的gdal.jar复杂到java项目中

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

  1. 将gdal.jar添加到项目依赖中,右击gdal.jar选择Add as Library;

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

  1. java中复杂以下代码测试
import org.gdal.gdal.gdal;
import org.gdal.ogr.ogr;

//测试案例
class GdalDemo {
	//获取所有驱动的名称并打印
	public void printDriver() {
		gdal.AllRegister();
		int count = ogr.GetDriverCount();
		for (int i = 0; i < count; i++) {
			String driverName = ogr.GetDriver(i).getName();
			System.out.print(driverName + "\t");
		}
		gdal.GDALDestroyDriverManager();
	}

	public static void main(String[] args) {
		GdalDemo demo = new GdalDemo();
		demo.printDriver();
	}
}
  1. 测试成功

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

  1. 完整代码

/**
 * 使用gdal 解析dxf,并将数据读取转为KML 或 GEOJSON
 * 包含坐标转换
 */
public class DXFToGeoJSONConverter {

    public static void main(String[] args) {

        Boolean converter = converter("E://test//1.kml", "E://test//白马2000-3-108.dxf");
        if (converter) {
            System.out.println("成功");
        } else {
            System.out.println("失败");
        }
    }

    /**
     *
     * @param outPath 输出文件全路径
     * @param inPath  读取文件全路径
     * @return
     */
    public static Boolean converter(String outPath, String inPath) {
        // 注册所有的驱动
        //gdal.AllRegister();
        ogr.RegisterAll();
        gdal.SetConfigOption("DWG_ENCODING", "UTF-8");//DWG文件编码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");//支持中文路径
        gdal.SetConfigOption("SHAPE_ENCODING", "CP936");//属性表字段支持中文


        DataSource dataSource = ogr.Open(inPath, 0);
        if (dataSource == null) {
            System.out.println("打开文件失败!" + gdal.GetLastErrorMsg());
            return false;
        }
        System.out.println("打开文件成功!");

        //构造坐标系转换对象
        SpatialReference src = new SpatialReference();
//        src.ImportFromProj4("+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
        src.ImportFromEPSG(4545); // CGCS2000 中央经线 108 3分带  36带
        System.out.println("原坐标系:" + src.ExportToProj4());

        SpatialReference dest = new SpatialReference();
        dest.ImportFromEPSG(4326); // WGS84

        System.out.println("目标坐标系:" + dest.ExportToProj4());
//        SpatialReference dest = dest1.CloneGeogCS();
        CoordinateTransformation transformation = new CoordinateTransformation(src, dest);//源,目标
        //1.创建驱动程序
        Driver dv = ogr.GetDriverByName("KML"); //直接转KML
//        Driver dv = ogr.GetDriverByName("GeoJSON"); //直接转GEOJSON

        int layerCount = dataSource.GetLayerCount();
        System.out.println("总图层数:" + layerCount);
        DataSource ds = dv.CreateDataSource(outPath);

        for (int i = 0; i < layerCount; i++) {
            // 2.循环读取每个图层
            Layer inLayer = dataSource.GetLayerByIndex(i);
            if (inLayer == null) {
                continue;
            }
            String layerName = inLayer.GetName();
            //3.每个DataSource创建一个输出的layer
            Layer outLayer = ds.CreateLayer(layerName, dest, ogrConstants.wkbUnknown, null);
            long featureCount = inLayer.GetFeatureCount();
            System.out.println("总图形数:" + featureCount);
            for (long j = 0; j < featureCount; j++) {
                Feature feature = inLayer.GetFeature(j);
                feature.GetStyleString();
                //4.获取输入的几何对象,调用其转换方法,转换后存入新的layer中
                Geometry geometry = feature.GetGeometryRef();
                geometry.Transform(transformation);
                //注意,转换为后时 经度 纬度 的顺序,如果需要纬度在前,需要交换xy
                //  geometry.SwapXY();
                geometry.CloseRings();
                outLayer.CreateFeature(feature);
            }
        }
        System.out.println("转换成功!!!");
        return true;
    }
}

GDAL坐标转换


/**
 * 用gdal进行坐标转换
 */
public class CoordinateTransformationExample {
    public static void main(String[] args) {
        // 注册GDAL驱动
        gdal.AllRegister();

        // 输入的坐标
        double inputX = 36587998.113885;
        double inputY = 3796047.384520;

        // 创建源坐标系统 (CGCS2000 3度带,中央经线108)
        SpatialReference srcSRS = new SpatialReference();
        srcSRS.ImportFromProj4("+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
        // 创建目标坐标系统 (WGS84)
        SpatialReference tgtSRS = new SpatialReference();
        tgtSRS.ImportFromEPSG(4326);
        // 创建坐标转换对象
        CoordinateTransformation transformation = new CoordinateTransformation(srcSRS, tgtSRS);


        // 执行坐标转换
        double[] transformedCoords = transformation.TransformPoint(inputX, inputY);

        // 输出转换后的经纬度 (转换后经纬度位置交换了,注意不要取错参数)
        System.out.println("Transformed Coordinates (WGS84):");
        System.out.println("Longitude: " + transformedCoords[1]);
        System.out.println("Latitude: " + transformedCoords[0]);
    }
}

可能遇到的错误

ERROR 1: PROJ: proj_create_from_database: D:\ideawork\pkgs\proj-6.2.1-h9f7ef89_0\Library\share\proj\proj.db lacks DATABASE.LAYOUT.VERSION.MAJOR / DATABASE.LAYOUT.VERSION.MINOR metadata. It comes from another PROJ installation.

原因分析:

使用osgeo.osr能够直接从安装的GDAL包读取指定投影类型的信息,在proj.db中存储了常用的投影系统的参数,因此指定EPSG号就能从proj.db中取到投影信息。

经过排查,我的情况是在开发环境中同时安装了GDAL和其他地理空间库(如PostGresql),此时同一环境路径下可能会产生多个proj.db文件,访问它的时候程序会无法判断访问哪个。因此只需要去查找gdal安装的那个proj.db在哪里,在程序中指定环境变量即可解决

解决方法:

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决

其他参考文章:

Gdal 之 dxf转geojson (附加坐标转换)

gdal for java 从安装到各种案例demo实现

GDAL JAVA 开发文档文章来源地址https://www.toymoban.com/news/detail-746873.html

到了这里,关于搭建GDAL JAVA环境;DXF转KML;坐标转换;PROJ: proj_create_from_database 错误解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用netdxf(C#)框架实现dxf文件读取与导出坐标

    窗体FormDxfTool.Designer.cs设计器源程序如下: 关键结构 netDxf.Vector3             可以认为是立体三维坐标(x,y,z) 关键结构 netDxf.Vector2             可以认为是平面二维坐标(x,y) DxfDocument用于读写dxf文件       关键函数Load()用于加载文件       添加实体:dxfDocument.Entities.Add(Ent

    2024年01月16日
    浏览(186)
  • 【ArcGIS微课1000例】0076:KMZ转换KML的方法

    ArcGIS可以很方便的将dwg,shp、等矢量数据转为kmz。 拓展阅读 : 【ArcGIS微课1000例】0075:将AutoCAD(Dwg、Dxf)文件转换为shp、KML(kml、kmz)文件

    2024年02月06日
    浏览(45)
  • 【Linux】CentOS制作Java+GDAL环境镜像并部署运行SpringBoot项目

    环境部署是一个非常繁琐又耗时的工作,尤其是涉及更换操作系统时,其难度更是成倍的增加。本文通过构建起软件运行镜像,并将SpringBoot项目运行在容器中,以期减小软件部署工作所投入的时间与精力。 在Windows环境下构建了一个SpringBoot项目,涉及对MySQL数据库、PostgreSQ

    2024年02月11日
    浏览(45)
  • dxf怎么转换成PDF格式?转换方法其实很简单

    PDF文件是一种可靠的文件格式,可以在各种操作系统和软件上打开和查看。而dxf是CAD文件的一种格式,打开它一般都是需要相关的操作软件才能打开,不是特别方便,将dxf文件转换成PDF格式就可以很好的解决这一问题,下面教大家几种简单方法,一起来学习下吧。   工具一:

    2024年02月16日
    浏览(37)
  • C# GDAL 数字图像处理Part4 获得鼠标位置的地理坐标

            其实在程序设计中,很大部分的工作量都在搞懂Winform的各种控件及其接口,网上的讲解质量也良莠不齐,所以如何使用控件也是一个很苦恼的问题(舍友深受困扰:怎么没有系统性讲Winform的资料)。我也在考虑要不要写一下文章讲讲comboBox、listView、tabControl、pictureBo

    2024年02月10日
    浏览(43)
  • Java转换坐标系,GPS(WGS84)大地200(CGCS200)、百度(BD-09)、高德(GCJ-02)互转,一文搞懂坐标系、坐标转换

    1.分不清的坐标系 WG-S84: 地理坐标系统,GPS仪器记录的经纬度信息,Google Earth采用,Google Map中国范围外使用,高德地图中国范围外使用。 GCJ-02: 投影坐标系统,火星坐标系,中国国家测绘局制定的坐标系统,由WGS-84加密后的坐标。Google中国和搜搜地图,arcgis地图,高德地图

    2024年02月03日
    浏览(50)
  • 【 Java-小记录】墨卡托投影坐标转换经纬度方法

     墨卡托坐标转换 此方法转换结果最接近腾讯地图

    2023年04月18日
    浏览(46)
  • Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

    Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示: Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后,需求是将WKT数据转换成其他坐标系的WKT。 比如说将EPSG:4524的坐标系转换成EPSG:2

    2023年04月25日
    浏览(38)
  • docker 搭建rknn转换环境

    https://github.com/rockchip-linux/rknn-toolkit2 进入到docker 的文件目录下

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包