在多边形上创建要素(点)网格

时间:2016-10-24 20:00:44

标签: c# gis geospatial arcgis dotspatial

我正在使用C#开发基于GIS的桌面应用程序。我在这个项目中使用了点空间库。

现在我需要在多边形上创建一个特征网格。此网格单元格(矩形)应 20 * 20 Meter Square

我已经研究过并且能够创建网格但面临与单元格大小相关的问题。每当多边形尺寸改变时,单元尺寸也会减小。我的代码。

         // Polygon Width = 2335
        // Polygon Height = 2054

        int RowsCount = 111;
        int ColumnsCount = 111;

        var maxPointX = Polygon.Extent.MaxPointX;
        var minPointX = Polygon.Extent.MinPointX;

        var maxPointY = Polygon.Extent.MaxPointY;
        var minPointY = Polygon.Extent.MinPointY;

        var dXStep = (maxPointX - minPointX) / (ColumnsCount - 1);
        var dYStep = (maxPointY - minPointY) / (RowsCount - 1);

        var gridColumnsPoints = new double[1000000];
        var gridRowPoints = new double[1000000];

        //   Calculate the coordinates of grid
        var nextPointX = minPointX;

        for (int i = 1; i <= ColumnsCount; i++)
        {
            gridColumnsPoints[i - 1] = nextPointX;
            nextPointX = nextPointX + dXStep;
        }

        var nextPointY = minPointY;

        for (int i = 1; i <= RowsCount; i++)
        {
            gridRowPoints[i - 1] = nextPointY;
            nextPointY = nextPointY + dYStep;
        }

输出 enter image description here

现在,当我在小尺寸的Polygon上尝试此代码时,网格单元的大小也会减少。

enter image description here

我知道我的方法不正确,所以我搜索了它并获得了一些工具。像

https://gis.stackexchange.com/questions/79681/creating-spatially-projected-polygon-grid-with-arcmap

但我想用C#创建它,无法找到任何算法或任何其他帮助材料。

请分享您的知识。感谢

2 个答案:

答案 0 :(得分:1)

我无法理解,如果您希望网格单元格大小为 20 * 20米,则大小如何从多边形变为多边形。它应始终 20 * 20米

在您的代码中,您在哪里获得ColumnsCountRowsCount的值?

您的dx和dy应始终为20(如果空间参考单位为米),或者您需要将20米转换为适当的空间参考单位长度。

用于创建网格的伪代码:

var xMax = Polygon.extent.xmax;
var xMin = Polygon.extent.xmin;
var yMax = Polygon.extent.ymax;
var yMin = Polygon.extent.ymin;

var gridCells = [];
var x = xMin, y = yMin;

while(x <= xMax){
    var dx = x + 20;

    while(y <= yMax){
        var dy = y + 20;

        var cell = new Extent(x, y, dx, dy);
        gridCells.push(cell);

        y = dy;
    }
    x = dx;
}

答案 1 :(得分:1)

问题在于:

    var dXStep = (maxPointX - minPointX) / (ColumnsCount - 1);
    var dYStep = (maxPointY - minPointY) / (RowsCount - 1);

因为它使网格大小依赖于多边形,但应该固定到视图的比例。

我不熟悉dotpatial框架,但你必须在一种坐标系中操作。您应该通过计算距离多边形边界框(最大/最小)一定距离的多边形左边的第一个x位置,然后将坐标系的分辨率逐步调整到最大X,将网格对齐到该坐标系。多边形。