簡體   English   中英

如何通過GDAL從位於RAM中的geotiff創建數據集

[英]How to create dataset from geotiff located in RAM by GDAL

用於打開文件的Gdal函數使用文件名讀取數據,如下所示:

GDALOpen (const char *pszFilename, GDALAccess eAccess)

但我的文件位於內存中。 我使用下一個代碼創建指向文件的指針:

FILE *stream;
stream = fmemopen(buf, lengthOfArray, "r");

是否可以通過某種方式通過文件指針創建GDALDataset?

有技巧和竅門嗎?

GDAL可以選擇從緩沖區創建內存文件。 看到:

http://gdal.org/cpl__vsi_8h.html#a86b6b1c37bb19d954ee3c4a7e910120c

我沒有C ++的經驗,但是在Python中看起來像:

with open('myfile.tif', mode='rb') as f:
    gdal.FileFromMemBuffer('/vsimem/some_memfile', f.read())

然后,您可以像打開普通文件一樣打開該虛擬位置:

ds = gdal.Open('/vsimem/some_memfile')

處理完文件后,請確保取消鏈接,否則它會一直存在。

ds = None
gdal.Unlink('/vsimem/some_memfile')

這是在Linux上使用jni處理Java字節數組中的geotiff文件的C ++完整示例:

#include <jni.h>

#include "gdal_priv.h"
#include "cpl_string.h"
#include "cpl_conv.h"
#include "gdalwarper.h"
#include "cpl_vsi.h"

JNIEXPORT void JNICALL Java_com_box_processing_GEOTransform_run(JNIEnv *env, jobject obj, jbyteArray array) {
    GDALAllRegister();
    jboolean isCopy;
    jbyte* buf = env->GetByteArrayElements(array, &isCopy);
    jsize lengthOfArray = env->GetArrayLength(array);

    const char *pszFormat = "GTiff";
    GDALDriver *poDriver;
    poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);

    VSILFILE* fpMem = VSIFileFromMemBuffer ("/vsimem/temp.tif", (GByte*) buf, (vsi_l_offset) lengthOfArray, FALSE );
    VSIFCloseL(fpMem);

    GDALDataset *poSrcDS = (GDALDataset *) GDALOpen( "/vsimem/temp.tif", GA_ReadOnly );
    GDALDataset *poDstDS;

    const char *pszSrcWKT = NULL;
    pszSrcWKT=GDALGetProjectionRef(poSrcDS);
    double error_threshold = 0.125;
    GDALResampleAlg resampling = GRA_Cubic;

    char*  pszDstWKT = NULL;
    GDALDataset * tmpDS = (GDALDataset*)(GDALDataset*)GDALAutoCreateWarpedVRT(poSrcDS, pszSrcWKT, pszDstWKT, resampling, error_threshold, NULL);
    poDstDS = poDriver->CreateCopy( "/some/folder/example1.tif", (GDALDataset*)tmpDS, FALSE, NULL, NULL, NULL );

    GDALClose( (GDALDatasetH) poDstDS );
    GDALClose( (GDALDatasetH) poSrcDS );
    VSIUnlink( "/vsimem/temp.tif" );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM