Tìm đa giác mà không có góc vuông bằng cách sử dụng GIS nguồn mở hoặc ArcGIS cho máy tính để bàn?


8

Bây giờ chúng tôi đang số hóa một số tòa nhà trong khu vực được chỉ định.

Quy tắc bắt buộc cho công việc này - trong hầu hết các trường hợp, các tòa nhà nên có góc vuông.

Chúng tôi đang sử dụng QGIS với các công cụ CAD cho công việc này nhưng đôi khi chúng tôi mắc lỗi và tạo đa giác với hình dạng không đều.

Có ai biết làm thế nào chúng ta có thể tìm thấy các đa giác như vậy mà không có góc phù hợp bằng cách sử dụng GIS hoặc ArcGIS nguồn mở không?

Câu trả lời:


5

Tôi không biết về một công cụ hiện có để làm điều này nhưng bạn có thể viết một công cụ trong ArcPy hoặc sử dụng GDAL / OGR theo các dòng sau:

  • Đối với mỗi đa giác ...
    • Lấy hình học
    • Theo cuộn dây của đa giác và tính góc trong tại mỗi đỉnh
    • Nếu bất kỳ góc nào không phải là 90 độ, hãy thêm FID / OID (hoặc một số thuộc tính khác) vào danh sách từ chối
  • In danh sách từ chối

3
+1 Đã viết mã tương tự, tôi khuyên bạn nên sửa đổi một chút. Một góc được kéo dài bởi các đoạn đường cực nhỏ tạo ra không có vấn đề (trực quan). Ngoài ra, các góc rất gần 90 độ cũng không phải là vấn đề. Điều này cho thấy tính toán sản phẩm bên trong của mỗi cạnh với người tiền nhiệm của nó. So sánh giá trị tuyệt đối của kết quả với ngưỡng (dương nhỏ). Cờ đa giác nơi vượt quá ngưỡng đó. Điều này đồng thời cho phép độ lệch lớn từ 90 độ cho các cạnh nhỏ cũng như độ lệch nhỏ cho các cạnh lớn. Như một phần thưởng, bạn không phải tính toán các góc.
whuber

Bất cứ ai cũng đã thử thực hiện dòng thứ hai của câu trả lời @MappaGnosis?
b_jugger

2

Dưới đây là một cách tiếp cận có thể. Hàm trả về đúng hoặc sai tùy thuộc vào việc đa giác có bất kỳ góc nào dưới một kích thước nhất định hoặc nằm trong một phạm vi xung quanh một góc mục tiêu. Chỉ cần ghi nhớ đây là một cách tiếp cận rất đơn giản và giả định số hóa đường thẳng. Tôi kiểm tra một vòng tròn, nhưng không kiểm tra các đường cong hoặc các khả năng khác có thể làm tăng chức năng.

angleTarget = góc mong muốn (ví dụ 90).

edgeVariance = bánh quế cho phép của đường thẳng (ví dụ: thay đổi hướng 0,5 độ cho phép).

angleVariance = độ lệch cho phép của góc mong muốn (ví dụ 1 nếu 91 độ là OK).

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;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.