gdal转换格式

#include <iostream>
#include <gdal/ogr_api.h>
#include <gdal/ogr_srs_api.h>

int main() {
    const char* input_file = "path/to/input/file.shp";
    const char* output_file = "path/to/output/file.kml";
    int target_epsg = 4326;
    const char* target_format = "KML";

    // 注册所有驱动程序
    GDALAllRegister();

    // 打开输入数据源
    OGRDataSource* input_ds = (OGRDataSource*)OGRSFDriverRegistrar::Open(input_file, FALSE);
    if (input_ds == nullptr) {
        std::cout << "无法打开输入数据集" << std::endl;
        return 1;
    }

    // 获取第一个图层
    OGRLayer* layer = input_ds->GetLayer(0);

    // 获取原始坐标系
    OGRSpatialReference* source_srs = layer->GetSpatialRef();

    // 定义目标坐标系
    OGRSpatialReference* target_srs = new OGRSpatialReference();
    target_srs->importFromEPSG(target_epsg);

    // 创建输出数据源
    GDALDriver* driver = GetGDALDriverManager()->GetDriverByName(target_format);
    GDALDataset* output_ds = driver->Create(output_file, 0, 0, 0, GDT_Unknown, nullptr);
    if (output_ds == nullptr) {
        std::cout << "无法创建输出数据集" << std::endl;
        return 1;
    }

    OGRLayer* output_layer = output_ds->CreateLayer(layer->GetName(), target_srs, layer->GetGeomType(), nullptr);

    // 复制属性字段
    OGRFeatureDefn* feature_defn = layer->GetLayerDefn();
    int field_count = feature_defn->GetFieldCount();
    for (int i = 0; i < field_count; i++) {
        OGRFieldDefn* field_defn = feature_defn->GetFieldDefn(i);
        output_layer->CreateField(field_defn, TRUE);
    }

    // 创建坐标转换器
    OGRCoordinateTransformation* coord_trans = OGRCreateCoordinateTransformation(source_srs, target_srs);

    // 复制要素
    OGRFeature* feature;
    layer->ResetReading();
    while ((feature = layer->GetNextFeature()) != nullptr) {
        OGRGeometry* geom = feature->GetGeometryRef();

        if (geom != nullptr && coord_trans->Transform(1, &geom) != OGRERR_NONE) {
            std::cout << "无法在转换坐标系时转换几何体" << std::endl;
            return 1;
        }

        OGRFeature* output_feature = OGRFeature::CreateFeature(feature_defn);
        output_feature->SetFrom(feature);
        output_feature->SetGeometry(geom);

        if (output_layer->CreateFeature(output_feature) != OGRERR_NONE) {
            std::cout << "无法创建要素" << std::endl;
            return 1;
        }

        OGRFeature::DestroyFeature(output_feature);
        OGRFeature::DestroyFeature(feature);
    }

    // 关闭数据源
    GDALClose(input_ds);
   
[好像出错了,请稍后再试。]
#include <iostream>
#include <gdal/ogr_api.h>
#include <gdal/ogr_srs_api.h>

void convertShapefile(const char* input_file, const char* output_file, int target_epsg, const char* target_format) {
    // 打开输入数据集
    OGRDataSourceH input_ds = OGR_DS_Open(input_file, FALSE, nullptr);
    if (input_ds == nullptr) {
        std::cout << "无法打开输入数据集" << std::endl;
        return;
    }

    // 获取第一个图层
    OGRLayerH layer = OGR_DS_GetLayer(input_ds, 0);

    // 获取原始坐标系
    OGRSpatialReferenceH source_srs = OGR_L_GetSpatialRef(layer);

    // 定义目标坐标系
    OGRSpatialReferenceH target_srs = OSRNewSpatialReference(nullptr);
    OSRImportFromEPSG(target_srs, target_epsg);

    // 创建输出数据集
    OGRSFDriverH driver = OGRGetDriverByName(target_format);
    OGRDataSourceH output_ds = OGR_Dr_CreateDataSource(driver, output_file, nullptr);
    if (output_ds == nullptr) {
        std::cout << "无法创建输出数据集" << std::endl;
        return;
    }

    OGRLayerH output_layer = OGR_DS_CreateLayer(output_ds, OGR_L_GetName(layer), target_srs, OGR_L_GetGeomType(layer), nullptr);

    // 复制属性字段
    OGRFeatureDefnH feature_defn = OGR_L_GetLayerDefn(layer);
    int field_count = OGR_FD_GetFieldCount(feature_defn);
    for (int i = 0; i < field_count; i++) {
        OGRFieldDefnH field_defn = OGR_FD_GetFieldDefn(feature_defn, i);
        OGR_L_CreateField(output_layer, field_defn, TRUE);
    }

    // 复制要素
    OGRFeatureH feature;
    OGR_L_ResetReading(layer);
    while ((feature = OGR_L_GetNextFeature(layer)) != nullptr) {
        OGRGeometryH geom = OGR_F_GetGeometryRef(feature);
        OGR_G_Transform(geom, source_srs, target_srs);

        OGRFeatureH output_feature = OGR_F_Create(OGR_L_GetLayerDefn(output_layer));
        OGR_F_SetGeometry(output_feature, geom);

        int num_fields = OGR_F_GetFieldCount(feature);
        for (int i = 0; i < num_fields; i++) {
            OGR_F_SetField(output_feature, i, OGR_F_GetFieldAsDouble(feature, i));
        }

        OGR_L_CreateFeature(output_layer, output_feature);

        OGR_F_Destroy(output_feature);
        OGR_F_Destroy(feature);
    }

    // 关闭数据集
    OGR_DS_Destroy(input_ds);
    OGR_DS_Destroy(output_ds);

    OSRDestroySpatialReference(source_srs);
    OSRDestroySpatialReference(target_srs);
}

int main() {
    const char* input_file = "E:\\da_shuju\\work\\data\\QGIS-Sample-Data-master\\qgis_sample_data\\shapefiles\\airports.shp";
    const char* output_file = "E:\\da_shuju\\work\\data\\QGIS-Sample-Data-master\\qgis_sample_data\\shapefiles\\output2.geojson";
    int target_epsg = 4326;
    const char* target_format = "GeoJSON";

    convertShapefile(input_file, output_file, target_epsg, target_format);

    return 0;
}

#include <iostream>
#include <gdal/ogr_api.h>
#include <gdal/ogr_srs_api.h>

int main() {
    const char* input_file = "path/to/input/file.shp";
    const char* output_file = "path/to/output/file.kml";
    int target_epsg = 4326;
    const char* target_format = "KML";

    // 注册所有驱动程序
    GDALAllRegister();

    // 打开输入数据源
    OGRDataSource* input_ds = (OGRDataSource*)OGRSFDriverRegistrar::Open(input_file, FALSE);
    if (input_ds == nullptr) {
        std::cout << "无法打开输入数据集" << std::endl;
        return 1;
    }

    // 获取第一个图层
    OGRLayer* layer = input_ds->GetLayer(0);

    // 获取原始坐标系
    OGRSpatialReference* source_srs = layer->GetSpatialRef();

    // 定义目标坐标系
    OGRSpatialReference* target_srs = new OGRSpatialReference();
    target_srs->importFromEPSG(target_epsg);

    // 创建输出数据源
    GDALDriver* driver = GetGDALDriverManager()->GetDriverByName(target_format);
    GDALDataset* output_ds = driver->Create(output_file, 0, 0, 0, GDT_Unknown, nullptr);
    if (output_ds == nullptr) {
        std::cout << "无法创建输出数据集" << std::endl;
        return 1;
    }

    OGRLayer* output_layer = output_ds->CreateLayer(layer->GetName(), target_srs, layer->GetGeomType(), nullptr);

    // 复制属性字段
    OGRFeatureDefn* feature_defn = layer->GetLayerDefn();
    for (int i = 0; i < feature_defn->GetFieldCount(); i++) {
        output_layer->CreateField(feature_defn->GetFieldDefn(i));
    }

    // 循环复制要素
    layer->ResetReading();
    OGRFeature* feature;
    while ((feature = layer->GetNextFeature()) != nullptr) {
        // 投影变换
        feature->GetGeometryRef()->transformTo(target_srs);

        // 创建新要素
        OGRFeature* output_feature = OGRFeature::CreateFeature(output_layer->GetLayerDefn());
        output_feature->SetFrom(feature);

        // 写入输出图层
        output_layer->CreateFeature(output_feature);

        // 释放要素内存
        OGRFeature::DestroyFeature(output_feature);
        OGRFeature::DestroyFeature(feature);
    }

    // 关闭数据源
    OGRDataSource::DestroyDataSource(input_ds);
    OGRDataSource::DestroyDataSource(output_ds);

    return 0;
}



//这段代码会完成以下操作:

//注册所有的GDAL驱动程序。
//打开输入的Shapefile数据源。
//获取输入数据源中的第一个图层。
//获取原始坐标系。
//定义目标坐标系,使用EPSG代码。
//创建目标格式的输出数据源。
//在输出数据源中创建与输入图层相同名称、几何类型和字段定义的图层。
//复制属性字段。
//循环复制要素,并在复制过程中进行投影变换。
//写入输出图层。
//关闭数据源。
from osgeo import ogr, osr

def convert_shapefile(input_file, output_file, target_epsg, target_format):
    # 打开输入数据集
    input_ds = ogr.Open(input_file)

    # 获取第一个图层
    layer = input_ds.GetLayer()

    # 获取原始坐标系
    source_srs = layer.GetSpatialRef()

    # 定义目标坐标系
    target_srs = osr.SpatialReference()
    target_srs.ImportFromEPSG(target_epsg)

    # 创建输出数据集
    driver = ogr.GetDriverByName(target_format)
    output_ds = driver.CreateDataSource(output_file)
    output_layer = output_ds.CreateLayer(layer.GetName(), srs=target_srs, geom_type=layer.GetGeomType())

    # 复制属性字段
    for i in range(layer.GetLayerDefn().GetFieldCount()):
        output_layer.CreateField(layer.GetLayerDefn().GetFieldDefn(i))

    # 复制要素
    for feature in layer:
        geom = feature.GetGeometryRef()
        geom.Transform(osr.CoordinateTransformation(source_srs, target_srs))
        output_feature = ogr.Feature(output_layer.GetLayerDefn())
        output_feature.SetGeometry(geom)
        for i in range(output_feature.GetFieldCount()):
            output_feature.SetField(i, feature.GetField(i))
        output_layer.CreateFeature(output_feature)

    # 关闭数据集
    input_ds = None
    output_ds = None
input_file = r'E:\da_shuju\work\data\QGIS-Sample-Data-master\qgis_sample_data\shapefiles\airports.shp'
output_file = r'E:\da_shuju\work\data\QGIS-Sample-Data-master\qgis_sample_data\shapefiles\output2.geojson'
target_epsg = 4326
target_format = "GeoJSON"
convert_shapefile(input_file, output_file, target_epsg, target_format)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值