栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

gdal 合并多边形数据

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 

#if WIN32
#include 
#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 envelop2dDatas,	QVector& 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));
        }		
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703569.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号