¿Encuentra polígonos sin ángulos rectos utilizando Open Source GIS o ArcGIS for Desktop?

8

Ahora estamos digitalizando algunos edificios en un área específica.

La regla obligatoria para este trabajo: en la mayoría de los casos, los edificios deben tener ángulos rectos.

Estamos utilizando QGIS con herramientas CAD para este trabajo, pero a veces cometemos errores y creamos polígonos con una forma irregular.

¿Alguien sabe cómo podemos encontrar tales polígonos sin ángulos rectos utilizando código abierto SIG o ArcGIS?

imatvej
fuente

Respuestas:

5

No conozco una herramienta existente para hacer esto, pero puede escribir una en ArcPy o usar GDAL / OGR en las siguientes líneas:

  • Para cada polígono ...
    • Consigue la geometría
    • Siga el devanado del polígono y calcule el ángulo interno en cada vértice.
    • Si algún ángulo no es de 90 grados, agregue el FID / OID (o algún otro atributo) a una lista de rechazos
  • Imprime la lista de rechazos
MappaGnosis
fuente
3
+1 Habiendo escrito un código similar, recomendaría una ligera modificación. Un ángulo atravesado por segmentos de línea extremadamente pequeños no crea problemas (visuales). Además, los ángulos muy cercanos a 90 grados tampoco deberían ser un problema. Esto sugiere calcular el producto interno de cada borde con su predecesor. Compare el valor absoluto del resultado con un umbral (pequeño positivo). Marcar polígonos donde se supera ese umbral. Esto permite simultáneamente grandes desviaciones de 90 grados para bordes pequeños, así como pequeñas desviaciones para bordes grandes. Como beneficio adicional, no tiene que calcular ángulos.
Whuber
¿Alguien intentó implementar la segunda línea de respuesta @MappaGnosis?
b_jugger
2

A continuación se muestra un enfoque posible. La función devuelve verdadero o falso dependiendo de si el polígono tiene algún ángulo por debajo de un cierto tamaño o está dentro de un rango alrededor de un ángulo objetivo. Solo tenga en cuenta que este es un enfoque muy simple y supone la digitalización en línea recta. Realizo pruebas para un círculo, pero no pruebo curvas u otras posibilidades que podrían disparar la función.

angleTarget = ángulo deseado (ej. 90).

edgeVariance = gofre permitido de línea recta (ej. cambio de dirección de 0.5 grados permitido).

angleVariance = desviación permitida del ángulo deseado (ej. 1 si 91 grados está bien).

Brian

private static bool AngleWithinTolerance(IPolygon pPoly, double angletarget, double edgeVariance, double angleVariance)
    {
        GeometryEnvironment geometryEnvironment = new GeometryEnvironment();
        IConstructAngle constructAngle = geometryEnvironment as IConstructAngle;
        IPointCollection ptcol = (IPointCollection)pPoly;
        double angle;

        //No circles!
        if (ptcol.PointCount < 3) return false;

        //Check angle made by last point first point and second point in the collection.
        angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(ptcol.PointCount - 2), ptcol.get_Point(0), ptcol.get_Point(1)) * (180/3.14159250439667));
        if (angle < edgeVariance || (angle < angletarget + angleVariance & angle > angletarget - angleVariance))
        {
            //Angle at index 0 is OK - check all other points in collection.
            for (int x = 0; x != ptcol.PointCount - 2; x++)
            {
                angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(x), ptcol.get_Point(x + 1), ptcol.get_Point(x + 2)) * (180 / 3.14159250439667));
                if (angle > edgeVariance & (angle > angletarget + angleVariance || angle < angletarget - angleVariance))
                {
                    return false;
                }
            }
        }
        else
        {
            return false;
        }
        //never failed.
        return true;
    }
Brian
fuente