Создание координатной (точечной) сетки на полигоне
Я работаю над настольным приложением на основе ГИС с использованием C#. Я использую многопользовательскую библиотеку в этом проекте.
Теперь мне нужно создать сетку объектов на полигоне. Эта ячейка сетки (прямоугольник) должна иметь площадь 20*20 метров.
Я работал над этим и смог создать сетку, но столкнулся с проблемой, касающейся размера ячейки. Всякий раз, когда размер полигона изменялся, размер ячейки также уменьшался. Мой код
// 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;
}
Теперь, когда я попробовал этот код на небольшом размере полигона, размер ячейки сетки также уменьшился.
Я знаю, что мой подход не верен, поэтому я искал его и получил некоторые инструменты. лайк
https://gis.stackexchange.com/questions/79681/creating-spatially-projected-polygon-grid-with-arcmap
Но я хочу создать его в C# и не могу найти ни один алгоритм или любой другой вспомогательный материал.
Пожалуйста, поделитесь своими знаниями. Спасибо
2 ответа
Я не могу понять, если вы хотите, чтобы размер ячейки сетки составлял 20*20 метров, как размер изменяется с полигона на полигон. Это всегда должно быть 20*20 метров.
В вашем коде, где вы взяли значения для ColumnsCount
а также RowsCount
?
Ваши 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;
}
Проблема здесь:
var dXStep = (maxPointX - minPointX) / (ColumnsCount - 1);
var dYStep = (maxPointY - minPointY) / (RowsCount - 1);
потому что это делает размер сетки зависимым от многоугольника, но это должно быть зафиксировано в масштабе вида.
Я не знаком с точечной пространственной структурой, но вы должны работать в некоторой системе координат. Вы должны выровнять свою сетку к этой системе координат, вычислив первый x pos слева от многоугольника на некотором расстоянии от ограничивающего прямоугольника многоугольников (max/min), а затем перейдите с разрешением системы координат до максимального X of полигон