#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)