矢量结构数据与栅格结构数据的相互转换,是地理信息系统的基本功能之一,已发展形成了许多高效的转换算法。
源码已经放在github上了,需要朋友自取。
https://github.com/XiaoZhong233/GIS_ALG/blob/master/src/scau/gz/zhw/Raster.java
目录
一、矢量点的栅格化
矢量点的栅格化: 实质是将点的坐标x、y换算为栅格行、列号。
注意:栅格的坐标原点是从左上角开始的,行数I向下递增,列数J向左递增
(X0,Y0)代表栅格的原点,dx,dy代表分别代表栅格的长和宽,也就是大小
实际代码中,这个x0,yo因为已知了栅格大小,所以可以求的出来。
在矢量数据向栅格数据转换的过程中,栅格数据可以用二维数组来表达。
/**
*
* @param point 带转化的矢量点
* @param xOffset 起始栅格点的x位移量
* @param yOffset 起始栅格点的y位移量
* @return 0-行 1-列
*/
public int[] transformRasterPoint(Point point,double xOffset,double yOffset) {
double x0=size+xOffset+this.xOffset;//栅格起始点坐标
double y0=ROW+yOffset+this.yOffset;
int[] rowAndColumn = new int[2];
//像元大小默认为1
rowAndColumn[0] = (int) (1+ (Math.floor(Math.abs((y0-point.getY())/size))));
rowAndColumn[1] = (int)(1+(Math.floor(Math.abs((point.getX()-x0))/size)));
return rowAndColumn;
}
测试结果:
输入:
Raster raster = new Raster(30,30); //创建一个30x30的栅格
Point p = new Point(.5, .5);
System.out.println(p);
int[] a = raster.transformRasterPoint(p, 0, 0);
System.out.println(String.format("I=%d,J=%d", a[0],a[1]));
输出:
(0.500000,0.500000)
I=30,J=1
二、矢量线的栅格化
①八方向栅格化
八方向栅格法很容易理解,就是已知直线的倾角情况,在每行或每列只有一个像元被涂黑。
算法思想:
- 一条线段有两个端点:P1(x1,y1)、P2(x2,y2),先分别确定其行列号(I1,J1)及(I2,J2),然后求出这两个端点位置的行数差和列数差。
- 若行数差大于列数差,则逐行求出本行中心线与过这两个端点的直线的交点(X,Y),得到交点行、列号,将交点“涂黑”:Y=yi行中心线,X=(yi-y1)k+x1&#x