8 votos

¿Cómo encontrar polígonos sin ángulos rectos mediante un SIG de código abierto o ArcGIS for Desktop?

Ahora estamos digitalizando algunos edificios en una zona 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 nos equivocamos y creamos polígonos con una forma irregular.

¿Sabe alguien cómo podemos encontrar esos polígonos sin ángulos rectos utilizando SIG de código abierto o ArcGIS?

5voto

Nick Puntos 3115

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

  • Para cada polígono...
    • Obtener la geometría
    • Siga el enrollamiento del polígono y calcule el ángulo interno en cada vértice
    • Si algún ángulo no es de 90 grados, añade el FID/OID (o algún otro atributo) a una lista de rechazos
  • Imprimir la lista de rechazos

2voto

mouviciel Puntos 2474

A continuación se muestra un posible enfoque. La función devuelve true o false dependiendo de si el polígono tiene algún ángulo por debajo de un determinado tamaño o está dentro de un rango alrededor de un ángulo objetivo. Sólo tenga en cuenta que este es un enfoque muy simple y asume la digitalización de líneas rectas. Yo compruebo si hay un círculo, pero no compruebo si hay curvas u otras posibilidades que podrían hacer tropezar la función.

angleTarget = ángulo deseado (por ejemplo, 90).

edgeVariance = waffle admisible de la línea recta (por ejemplo, se permite un cambio de dirección de 0,5 grados).

angleVariance = desviación permitida del ángulo deseado (por ejemplo, 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;
    }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X