gdal 合并多边形数据

  • GeoPolygonTool.h
#pragma once

class GeoPolygonToolPrivate;
class GeoPolygonTool
{
public:
	GeoPolygonTool();
	~GeoPolygonTool();

	void addEnvelopData2D(double** data, int count);

	//0:ExteriorRing 1~n:InteriorRings
	char* genUnionEnvelopJson();
private:
	GeoPolygonToolPrivate* _pri;
};

  • GeoPolygonTool.cpp
#include "GeoPolygonTool.h"
#include "ogr/ogr_geometry.h"

#include <string>

#if WIN32
#include <windows.h>
#endif

class GeoPolygonToolPrivate
{
public:
	GeoPolygonToolPrivate(){
		pMultiPolygon = (OGRMultiPolygon*)OGRGeometryFactory::createGeometry(wkbMultiPolygon);
	}
	~GeoPolygonToolPrivate() {
		OGRGeometryFactory::destroyGeometry(pMultiPolygon);
	}

	void addEnvelopData2D(double** data, int count);

	char* genUnionEnvelopJson();
	OGRMultiPolygon* pMultiPolygon;
};

void GeoPolygonToolPrivate::addEnvelopData2D(double** data,int count)
{
	if (data == NULL) return;

	OGRGeometry* pGeom_1 = NULL;
	
	std::string sWKT = "POLYGON ((";

	for (int i = 0; i < count;i++)
	{
		sWKT.append(std::to_string(data[i][0]));
		sWKT.append(" ");
		sWKT.append(std::to_string(data[i][1]));
		sWKT.append(", ");
	}
	sWKT.append(std::to_string(data[0][0]));
	sWKT.append(" ");
	sWKT.append(std::to_string(data[0][1]));
	sWKT.append("))");

	char* szWKT_1 = (char*)sWKT.c_str();

	OGRGeometryFactory::createFromWkt(&szWKT_1, NULL, &pGeom_1);
	if (pGeom_1) {
		pMultiPolygon->addGeometryDirectly(pGeom_1);
	}	
}


char* GeoPolygonToolPrivate::genUnionEnvelopJson()
{
	char* json_out = NULL;
	//用Buffer替代Union,缓冲距离设置为0
	OGRGeometry* pUnion = pMultiPolygon->Buffer(0);
	if (pUnion) {
		json_out = pUnion->exportToJson();

#if WIN32 & _DEBUG
		OutputDebugString(json_out);
#endif
	
	}
	return json_out;
}

//
GeoPolygonTool::GeoPolygonTool()
{
	_pri = new GeoPolygonToolPrivate();
}


GeoPolygonTool::~GeoPolygonTool()
{
	delete _pri;
	_pri = NULL;
}

void GeoPolygonTool::addEnvelopData2D(double** data, int count)
{
	_pri->addEnvelopData2D(data,count);
}

char* GeoPolygonTool::genUnionEnvelopJson()
{
	return _pri->genUnionEnvelopJson();
}


  • Json 解析

#include "GeoPolygonTool.h"

QPolygonF coordinatesPolygon(const QJsonArray& jsonArrs)
{
	double dx, dy;
	QPolygonF polygonOut;
	for (auto itor = jsonArrs.begin(); itor != jsonArrs.end(); ++itor)
	{
		QJsonArray jsonDatas = (*itor).toArray();
		QPolygonF polygon;
		for (auto jtor = jsonDatas.begin(); jtor != jsonDatas.end(); ++jtor)
		{
			float lon = (*jtor).toArray().first().toDouble();
			float lat = (*jtor).toArray().last().toDouble();
			polygon << QPointF(dx, dy);
		}
		if (polygonOut.isEmpty()) {
			polygonOut = polygon;
		}
		else {
			polygonOut = polygonOut.subtracted(polygon);
		}
	}
	return polygonOut;
}

void createUnitedPolygon(std::vector<double**> envelop2dDatas,	QVector<QPolygonF>& polygonUited)
{
    GeoPolygonTool geoTool;

    for (int i = 0; i < envelop2dDatas.size();i++)
    {
        geoTool.addEnvelopData2D(envelop2dDatas.at(i), 360);
    }

    char* json_out = geoTool.genUnionEnvelopJson();
    if (json_out)
    {
        double dx, dy;
        QJson::Parser p;
        QJsonObject jsonObj = p.parse(json_out).toJsonObject();

        QJsonArray jsonArrs = jsonObj.value("coordinates").toArray();
        if (jsonObj.value("type") == "MultiPolygon") {
            //MultiPolygon
            for (auto itor = jsonArrs.begin(); itor != jsonArrs.end(); ++itor)
            {
                polygonUited.push_back(coordinatesPolygon((*itor).toArray()));
            }
        }
        else {
            polygonUited.push_back(coordinatesPolygon(jsonArrs));
        }		
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDAL中,你可以使用多边形来裁剪栅格数据。以下是使用GDAL Python绑定库进行多边形裁剪的一般步骤: 1. 导入必要的库和模块: ```python import ogr import gdal import osr ``` 2. 打开待裁剪的栅格数据多边形数据: ```python # 打开栅格数据 raster_ds = gdal.Open("input_raster.tif") # 打开多边形数据 polygon_ds = ogr.Open("input_polygon.shp") ``` 3. 获取栅格数据的空间参考系统信息,并根据该信息创建输出栅格数据集: ```python # 获取栅格数据的空间参考系统 raster_srs = osr.SpatialReference() raster_srs.ImportFromWkt(raster_ds.GetProjection()) # 创建输出栅格数据集 clipped_ds = gdal.GetDriverByName("GTiff").Create("output_raster.tif", x_size, y_size, bands, data_type) clipped_ds.SetProjection(raster_srs.ExportToWkt()) clipped_ds.SetGeoTransform(geotransform) ``` 4. 获取多边形图层和要素,以及多边形图层的空间参考系统信息: ```python # 获取多边形图层和要素 polygon_layer = polygon_ds.GetLayer() polygon_feature = polygon_layer.GetNextFeature() # 获取多边形图层的空间参考系统 polygon_srs = polygon_layer.GetSpatialRef() ``` 5. 创建裁剪器,并将多边形的几何形状设置为裁剪器的裁剪区域: ```python # 创建裁剪器 clipper = gdal.Clipper() # 设置裁剪区域为多边形的几何形状 clipper.SetClipGeometry(polygon_feature.GetGeometryRef()) ``` 6. 执行裁剪操作,并将结果写入输出栅格数据集: ```python # 执行裁剪操作 clipper.Clip(raster_ds, clipped_ds) # 关闭数据集 raster_ds = None clipped_ds = None ``` 这只是一个简单的示例,实际的使用可能会根据你的数据和需求有所不同。你可以根据情况进行适当的调整和修改。希望这能帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值