Ruta de aprendizaje de la API C++ de GDAL (5) Clase de geometría OGRGeometry OGRGeometry

Distancia

Distancia doble virtual (const  OGRGeometry *) const

Calcular distancia entre dos geometrías Devuelve la distancia más corta entre dos geometrías. Las distancias se expresan en las mismas unidades que las coordenadas geométricas

parámetro:

poOtherGeom  : otra geometría para comparar.

Devuelve: la distancia entre geometrías, o -1 si se produce un error

// 创建两个点
OGRPoint point1(0, 0);
OGRPoint point2(3, 4);

// 计算两个点之间的距离
double distance = point1.Distance(&point2);

cout << "Distance between point1 and point2: " << distance << endl;

Casco convexo

Virtual  OGRGeometry  *ConvexHull() const

Compute Convex Hull creará y devolverá un nuevo objeto Geometry que contiene el casco convexo de la geometría en la que se llama al método

Devuelve: la geometría recién asignada ahora propiedad de la persona que llama, o NULL en caso de falla

    // 创建一个线环(LinearRing)
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(1, 0);
    ring.addPoint(1, 1);
    ring.addPoint(0, 1);
    ring.addPoint(0, 0);

    // 创建一个多边形(Polygon)
    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算凸包
    OGRGeometry* convexHull = polygon.ConvexHull();

    // 输出凸包的WKT表示
    char* wkt;
    convexHull->exportToWkt(&wkt);
    std::cout << "Convex Hull: " << wkt << std::endl;

    // 释放内存
    CPLFree(wkt);
    delete convexHull;

Casco cóncavo

virtual  OGRGeometry  *ConcaveHull(doble dfRatio, bool bAllowHoles) const

Cálculo del "casco cóncavo" de una geometría Cálculo del "casco cóncavo" de una geometría

El casco cóncavo está completamente contenido dentro del casco convexo y también contiene todos los puntos de entrada, pero con un área más pequeña. La relación de área es la relación de las áreas de los cascos convexos y cóncavos. Comúnmente utilizado para convertir multipuntos en regiones poligonales. contiene todos los puntos en la geometría de entrada

parámetro:

  • dfRatio  -- la relación del área de los cascos convexos y cóncavos.

  • bAllowHole  : si se permiten agujeros.

Devuelve: la geometría recién asignada ahora propiedad de la persona que llama, o NULL en caso de falla

    // 创建一个线环(LinearRing)
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(1, 0);
    ring.addPoint(1, 1);
    ring.addPoint(0, 1);
    ring.addPoint(0, 0);

    // 创建一个多边形(Polygon)
    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算凹多边形凸包
    double concaveHullRatio = 0.8; // 指定一个凹多边形凸包的压缩比例
    bool allowHoles = true;        // 允许生成含有洞的凹多边形凸包
    OGRGeometry* concaveHull = polygon.ConcaveHull(concaveHullRatio, allowHoles);

    // 输出凹多边形凸包的WKT表示
    char* wkt;
    concaveHull->exportToWkt(&wkt);
    std::cout << "Concave Hull: " << wkt << std::endl;

    // 释放内存
    CPLFree(wkt);
    delete concaveHull;


Buffer

OGRGeometry virtual   *Búfer(doble dfDist, int nQuadSegs = 30) const

Búfer de geometría computacional

Genera una nueva geometría que contiene el búfer desde el que se llamó. Una zona de influencia es un polígono que contiene el área dentro de la distancia de zona de influencia de la geometría original

Algunas partes de la zona de influencia se describen correctamente como curvas, pero se convierten en polígonos aproximados. El parámetro nQuadSegs se puede usar para controlar cuántas líneas se deben usar para definir los cuadrantes del círculo de curva de 90 grados. Un valor de 30 es un valor predeterminado razonable. Los valores más grandes dan como resultado una gran cantidad de vértices en la geometría del búfer resultante, mientras que los números más pequeños reducen la precisión de los resultados.

parámetro:

  • dfDist  : la distancia de zona de influencia que se va a aplicar. Se expresará en las mismas unidades que las coordenadas geométricas.

  • nQuadSegs  : número de segmentos utilizados para aproximar la curvatura de 90 grados (cuadrante).

Devuelve: la geometría recién creada, o NULL si se produjo un error

 // 创建一个点(Point)
 OGRPoint point(0, 0);

// 对点进行缓冲区分析,生成一个缓冲区几何对象
double bufferDistance = 1.0; // 缓冲区的距离
int numQuadSegments = 30;    // 四边形段数,用于控制缓冲区的平滑程度
OGRGeometry* buffer = point.Buffer(bufferDistance, numQuadSegments);

Intersección

Virtual OGRGeometry *Intersección(const  OGRGeometry *) const

Calcular la intersección

Genera una nueva geometría que es la región de intersección de las dos geometrías operadas. El método Intersects()  se puede usar para probar si dos geometrías se cruzan

La validez de la geometría no se comprueba. Si no está seguro de la validez de la geometría de entrada, llame a IsValid() antes  , de lo contrario, el resultado puede ser incorrecto

parámetro:

poOtherGeom  : otra geometría que se cruza con "esta" geometría.

Devuelve: la nueva geometría que representa el punto de intersección, o NULL si no hay intersección o se produce un error

    // 创建两个多边形对象
    OGRLinearRing ring1, ring2;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    ring2.addPoint(0.5, 0.5);
    ring2.addPoint(0.5, 1.5);
    ring2.addPoint(1.5, 1.5);
    ring2.addPoint(1.5, 0.5);
    ring2.addPoint(0.5, 0.5);

    OGRPolygon polygon1, polygon2;
    polygon1.addRing(&ring1);
    polygon2.addRing(&ring2);

    // 计算两个多边形的交集
    OGRGeometry* intersection = polygon1.Intersection(&polygon2);

Unión

OGRGeometry virtual * Unión (const  OGRGeometry *) const 

Federación de cálculo

Genera una nueva geometría que es la región de unión de las dos geometrías operadas

La validez de la geometría no se comprueba. Si no está seguro de la validez de la geometría de entrada, llame a IsValid() antes  , de lo contrario, el resultado puede ser incorrecto

parámetro:

poOtherGeom  -- La otra geometría para combinar con "esta" geometría.

Devuelve: la nueva geometría que representa la unión o NULL si se produce un error

// 创建两个多边形对象
    OGRLinearRing ring1, ring2;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    ring2.addPoint(0.5, 0.5);
    ring2.addPoint(0.5, 1.5);
    ring2.addPoint(1.5, 1.5);
    ring2.addPoint(1.5, 0.5);
    ring2.addPoint(0.5, 0.5);

    OGRPolygon polygon1, polygon2;
    polygon1.addRing(&ring1);
    polygon2.addRing(&ring2);

    // 计算两个多边形的并集
    OGRGeometry* unionGeometry = polygon1.Union(&polygon2);

UniónEn Cascada

OGRGeometría virtual   * UnionCascaded() constante

Cálculo de unión usando cascada Las geometrías de entrada deben ser multifacéticas

La validez de la geometría no se comprueba. Si no está seguro de la validez de la geometría de entrada, llame a IsValid() antes  , de lo contrario, el resultado puede ser incorrecto

Devuelve: la nueva geometría que representa la unión o NULL si se produce un error

    // 创建一个多边形对象
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 1);
    ring.addPoint(1, 1);
    ring.addPoint(1, 0);
    ring.addPoint(0, 0);

    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 计算多边形与其自身的并集
    OGRGeometry* unionGeometry = polygon.UnionCascaded();
  • Virtual OGRGeometry *UnionCascaded() const: Esta función se utiliza para devolver la unión (Union) del objeto de geometría actual consigo mismo. Es decir, combina todos los componentes geométricos del objeto geométrico actual para obtener un nuevo objeto geométrico que contiene todos los componentes. Por ejemplo, si el objeto de geometría actual es un polígono que contiene varios anillos separados, la función devuelve un nuevo polígono que contiene la unión de todos los anillos.

  • Virtual OGRGeometry *Union(const OGRGeometry*) const: Esta función se utiliza para devolver la unión (Union) del objeto de geometría actual y otro objeto de geometría. Es decir, realiza una operación de unión en el objeto de geometría actual con otro objeto de geometría para obtener un nuevo objeto de geometría que contiene todos los componentes de los dos objetos de geometría. Por ejemplo, si el objeto de geometría actual es un polígono y el parámetro pasado es otro polígono, la función devolverá un nuevo polígono que contiene el resultado de la unión de los dos polígonos.

  • Resumir:

  • UnionCascaded()La función se utiliza para calcular el resultado de la unión dentro del objeto de geometría actual.
  • Union(const OGRGeometry*)La función se utiliza para calcular el resultado de la unión del objeto geométrico actual y otro objeto geométrico.

Unión unaria

OGRGeometry  *UnaryUnion() const

Devuelve la unión de todos los componentes de una sola geometría, que normalmente se usa para convertir una colección en el conjunto más pequeño de polígonos que cubren la misma área.

Devuelve: la nueva geometría que representa la unión o NULL si se produce un error

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 1);
    ring1.addPoint(1, 1);
    ring1.addPoint(1, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 2);
    ring2.addPoint(2, 2);
    ring2.addPoint(2, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的一元并集
    OGRGeometry* unaryUnionGeometry = polygon1.Union(&polygon2);

Diferencia

virtual  OGRGeometry  *Diferencia(const  OGRGeometry *) const

calcular la diferencia

Genera una nueva geometría que es la región de esta geometría con la región de la segunda geometría eliminada

La validez de la geometría no se comprueba. Si no está seguro de la validez de la geometría de entrada, llame a IsValid() antes  , de lo contrario, el resultado puede ser incorrecto

parámetro:

poOtherGeom  : la otra geometría que se eliminará de la geometría "esta".

Devuelve: la nueva geometría que representa la diferencia, o NULL si la diferencia está vacía o se produjo un error

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 2);
    ring1.addPoint(2, 2);
    ring1.addPoint(2, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 3);
    ring2.addPoint(3, 3);
    ring2.addPoint(3, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的差异
    OGRGeometry* differenceGeometry = polygon1.Difference(&polygon2);

SymDiferencia

virtual OGRGeometry *SymDifference(const  OGRGeometry *) const

Calcular diferencia simétrica

Genera una nueva geometría que es la diferencia simétrica de esta geometría y la segunda geometría pasada al método

La validez de la geometría no se comprueba. Si no está seguro de la validez de la geometría de entrada, llame a IsValid() antes  , de lo contrario, el resultado puede ser incorrecto

parámetro:

poOtherGeom  -- la otra geometría.

Devuelve: la nueva geometría que representa la diferencia simétrica, o NULL si la diferencia está vacía o se produce un error

    // 创建两个多边形对象
    OGRLinearRing ring1;
    ring1.addPoint(0, 0);
    ring1.addPoint(0, 2);
    ring1.addPoint(2, 2);
    ring1.addPoint(2, 0);
    ring1.addPoint(0, 0);

    OGRPolygon polygon1;
    polygon1.addRing(&ring1);

    OGRLinearRing ring2;
    ring2.addPoint(1, 1);
    ring2.addPoint(1, 3);
    ring2.addPoint(3, 3);
    ring2.addPoint(3, 1);
    ring2.addPoint(1, 1);

    OGRPolygon polygon2;
    polygon2.addRing(&ring2);

    // 计算两个多边形对象的对称差异
    OGRGeometry* symDifferenceGeometry = polygon1.SymDifference(&polygon2);

Centroide

virtual OGRErr Centroid(OGRPoint  *poPoint) const

Calcular centroide geométrico

La posición del centroide se aplica al  objeto OGRPoint entrante  . El centroide no está necesariamente dentro de la geometría.

Devuelve: OGRERR_NONE en caso de éxito o OGRERR_FAILURE en caso de error

    // 创建一个多边形对象
    OGRLinearRing ring;
    ring.addPoint(0, 0);
    ring.addPoint(0, 4);
    ring.addPoint(4, 4);
    ring.addPoint(4, 0);
    ring.addPoint(0, 0);

    OGRPolygon polygon;
    polygon.addRing(&ring);

    // 创建一个空的 OGRPoint 对象用于存储质心
    OGRPoint centroidPoint;

    // 计算多边形对象的质心
    OGRErr err = polygon.Centroid(&centroidPoint);

    if (err == OGRERR_NONE) {
        // 输出质心的坐标
        double x = centroidPoint.getX();
        double y = centroidPoint.getY();
        std::cout << "Centroid coordinates: (" << x << ", " << y << ")" << std::endl;
    } else {
        std::cout << "Error calculating centroid." << std::endl;







Supongo que te gusta

Origin blog.csdn.net/qq_69574549/article/details/131923388
Recomendado
Clasificación