golang使用gdal库

golang使用gdal

golang编译 gdal geos库文件

编译gdal

  • 不太懂C++,我使用的是vcpkg编译,具体看这里
  • vcpkg的介绍自行百度学习或者看这里
  • 编译时间有点长(一个小时左右),不想自己编译的直接下载我这个仓库就好了。编译的gdal版本为3.7.1
rem 克隆vcpkg库
git clone git@github.com:microsoft/vcpkg.git

cd vcpkg
rem 下载vcpkg.exe程序
bootstrap-vcpkg.bat

rem 下载完成之后开始编译
vcpkg search gdal

rem 默认编译32位 加 :x64-windows 编译64位的
vcpkg install gdal
vcpkg install gdal:x64-windows

测试C语言环境

  • 我是把编译好的头文件放到mingw对应目录下,但是编译c语言测试程序时能找到头文件,找不到库文件,加了编译参数也不行,但是在vs里面就没问题。

  • 我的编译命令是这个g++ -I D:\DEV\gdal\include -LD:\DEV\gdal\lib -lgdal -o mainc.exe main.c ,会报这个错:undefined reference to 'GDALAllRegister' 或者这个ld: cannot find -lgdal ,未解决。

  • 如果测试go环境时要把main.c注释,不然go编译器会一起编译c语言

测试C/C++代码:

// main.cpp
#include <sti.h>
#include <stdio.h>
#include <gdal.h>
#include <iostream>
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
#include <gdal_alg.h>


int main()
{
	const char* image_name = "E:/testtif/testtif.tif";
	GDALAllRegister();
	GDALDataset* poSrc = (GDALDataset*)GDALOpen(image_name, GA_ReadOnly);
	if (poSrc == nullptr) {
		std::cout << "input image error" << std::endl;
		return -1;
	}

	int width_src = poSrc->GetRasterXSize();
	int height_src = poSrc->GetRasterYSize();
	int band_count_src = poSrc->GetRasterCount();
	printf(stderr, "width: %d, height: %d, bandCount: %d\n", width_src, height_src, band_count_src);
	GDALDataType  gdal_data_type = poSrc->GetRasterBand(1)->GetRasterDataType();
	int depth = GDALGetDataTypeSize((GDALDataType)gdal_data_type);
	printf(stderr, "depth: %d\n", depth);

	GDALClose((GDALDatasetH)poSrc);

	return 0;
}
// main.c
#include "gdal.h"
#include "cpl_conv.h" /* for CPLMalloc() */

#include <errno.h>

int main(int argc, const char* argv[])
{
    if (argc != 2) {
        return EINVAL;
    }
    const char* pszFilename = argv[1];

    GDALDatasetH  hDataset;
    GDALAllRegister();
    const GDALAccess eAccess = GA_ReadOnly;
    hDataset = GDALOpen( pszFilename, eAccess );
    if( hDataset == NULL )
    {
        return -1; // handle error
    }
    return 0;
}

配置golang gdal开发设置

  • 下载gdal的go语言绑定库 go get github.com/lukeroth/gdal
  • 修改这个库的c_windows_amd64.go文件
  • 这个文件在gopath路径下的pkg\mod\github.com\lukeroth\gdal@···,一般是在C:\Users\username\go\pkg\mod\github.com\lukeroth\gdal@···
//go:build windows && amd64
// +build windows,amd64

package gdal

/*
#cgo windows CFLAGS: -ID:/DEV/gdal/include
#cgo windows LDFLAGS: -LD:/DEV/gdal/lib -lgdal -ltiff -lgeotiff_i -lgeos_c
*/
import "C"
  • 把 CFLAGS 改成对应编译好的gdal 库的include文件夹
  • 把 LDFLAGS 改成对应编译好的gdal 库的 lib 文件夹,必须加上-lgdal -lgeos_c参数,不然编译也是会报这个错:undefined reference to 'GDALAllRegister'
  • 下面是编译出来的lib文件,要是再报找不到某个函数就尝试加 -l 参数应该能解决
bz2
charset
freexl
gdal
geos
geos_c
geotiff_i
gif
hdf5
hdf5_cpp
hdf5_hl
hdf5_hl_cpp
iconv
jpeg
json-c-static
json-c
kmlbase
kmlconvenience
kmldom
kmlengine
kmlregionator
kmlxsd
Lerc
libcrypto
libcurl
libecpg
libecpg_compat
libexpat
libhdf5.settings
libnetcdf.settings
libpgcommon
libpgport
libpgtypes
libpng16
libpq
libsharpyuv
libssl
libwebp
libwebpdecoder
libwebpdemux
libwebpmux
libxml2
lz4
lzma
minizip
netcdf
openjp2
pcre2-16
pcre2-32
pcre2-8
pcre2-posix
pkgconf
proj
qhullcpp
qhull_r
spatialite
sqlite3
szip
tiff
turbojpeg
uriparser
zlib
zstd

go环境测试代码

package main

import (
	"fmt"
	"flag"
	gdal "github.com/lukeroth/gdal "
)

func main() {
	flag.Parse()
	filename := flag.Arg(0)
	if filename == "" {
		fmt.Printf("Usage: tiff [filename]\n")
		return
	}
	buffer := make([]uint8, 256 * 256)

	driver, err := gdal.GetDriverByName("GTiff")
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	dataset := driver.Create(filename, 256, 256, 1, gdal.Byte, nil)
	defer dataset.Close()

	spatialRef := gdal.CreateSpatialReference("")
	spatialRef.FromEPSG(3857)
	srString, err := spatialRef.ToWKT()
	dataset.SetProjection(srString)
	dataset.SetGeoTransform([]float64{444720, 30, 0, 3751320, 0, -30})
	raster := dataset.RasterBand(1)
	raster.IO(gdal.Write, 0, 0, 256, 256, buffer, 256, 256, 0, 0)
}

编译geos

  • 编译的gdal应该是包含了geos库了,具体没测试过,先这样把。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang(又称Go)是一种高效、简洁且易于学习的编程语言,逐渐受到越来越多开发者的青睐。对于视频处理领域来说,Golang也有一些成熟和强大的可供使用。 首先,一个被广泛使用Golang视频处理是FFmpeg。FFmpeg是一个开源跨平台的音视频处理工具集,包含了多个工具和,实现了音视频的编解码、转换、解码、流媒体处理等功能。这个可以通过shell命令或者Golang的外部绑定进行调用,具有很高的灵活性和功能全面性。 其次,还有一个受欢迎的Golang音视频处理是Gonum/plot。虽然它主要是用于数据可视化而非视频处理,但用户可以通过使用来制作简单的图表、绘制直方图、箱线图和散点图等各种可视化图形。这对于视频处理中的数据分析和展示非常有用。 另外,GoCV是一个基于Golang的计算机视觉,它是根据OpenCV的C API开发的。GoCV提供了一些用于视频流处理和计算机视觉任务的函数和结构体,例如视频流读取、图像处理、特征提取等。这个相对较新,但已经有一些用户使用并给予积极的反馈。 当然,还有其他一些Golang视频处理,如goav、gstreamer、gocv、go-ffmpeg等等,它们提供了不同的功能和特性,用户可以根据自己的需求选择适合自己的。 总之,Golang作为一种新兴的编程语言,在视频处理领域也有一些强大的可供选择。无论是通过使用FFmpeg来进行音视频编解码和转换,还是使用GoCV进行计算机视觉任务,这些都提供了不同的功能和特性,可以满足大部分视频处理的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值