在进行栅格数据行列号和坐标系换算时需要注意以下两点:
1、栅格数据的行列号索引值一般以0开始;
2、坐标系方向与栅格行列索引方向是否相同。
一、将XY表示的坐标系值转换成对应栅格的行列号索引值:
// 栅格数据总行数 int rowCount = 100; // 栅格数据总列数 int columnCount = 100; // 栅格数据最小X坐标 double minX = 0; // 栅格数据最小Y坐标 double minY = 0; // 栅格数据最大X坐标 double maxX = 1000; // 栅格数据最大Y坐标 double maxY = 1000; // 需要换算的X坐标 double x = 400; // 需要换算的Y坐标 double y = 400; // 计算X轴方向每个栅格的坐标跨度(与栅格列相对应) double dx = (maxX - minX) / (double)columnCount; // 计算指定x坐标对应的栅格列索引值(坐标系X轴方向与栅格列索引方向相同) int columnIndex = (int)((x - minX) / dx); // 计算Y轴方向每个栅格的坐标跨度(与栅格行相对应) double dy = (maxY - minY) / (double)rowCount; // 计算指定y坐标对应的栅格行索引值(坐标系Y轴方向与栅格行索引方向相反) int rowIndex = rowCount - (int)((y - minY) / dy) - 1;
二、将栅格的行列号索引值转换成以XY表示的坐标系值:
// 栅格数据总行数 int rowCount = 100; // 栅格数据总列数 int columnCount = 100; // 栅格数据最小X坐标 double minX = 0; // 栅格数据最小Y坐标 double minY = 0; // 栅格数据最大X坐标 double maxX = 1000; // 栅格数据最大Y坐标 double maxY = 1000; // 需要换算的栅格行索引值 int rowIndex = 40; // 需要换算的栅格列索引值 int columnIndex = 40; // 计算X轴方向每个栅格的坐标跨度(与栅格列相对应) double dx = (maxX - minX) / (double)columnCount; // 计算指定栅格列索引值对应的x坐标(坐标系X轴方向与栅格列索引方向相同,并取栅格的中心点作为栅格x坐标) double x = (columnIndex + 0.5) * dx + minX; // 计算Y轴方向每个栅格的坐标跨度(与栅格行相对应) double dy = (maxY - minY) / (double)rowCount; // 计算指定栅格行索引值对应的y坐标(坐标系Y轴方向与栅格行索引方向相反,并取栅格的中心点作为栅格y坐标) double y = (rowCount - rowIndex - 0.5) * dy + minY;