GIS算法基础(五)矢量数据向栅格数据的转换(点,线算法实现) | 您所在的位置:网站首页 › gis算法基础期末考试 › GIS算法基础(五)矢量数据向栅格数据的转换(点,线算法实现) |
矢量结构数据与栅格结构数据的相互转换,是地理信息系统的基本功能之一,已发展形成了许多高效的转换算法。
源码已经放在github上了,需要朋友自取。 https://gitee.com/XiaoZhong233/GIS_ALG 目录 一、矢量点的栅格化 二、矢量线的栅格化 ①八方向栅格化 算法思想: 算法实现: 测试: ②全路径栅格化 算法思想 算法实现: 测试结果: 一、矢量点的栅格化矢量点的栅格化: 实质是将点的坐标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;式中k=(x2-x1)/(y2-y1),这个公式不看也罢,其实就是两直线求交点的方程若行数差小于或等于列数差,则逐列求出本列中心线与过这两个端点的直线的交点(X,Y),得到交点行、列号,将交点“涂黑” :X=xi行中心线,Y=(xj-x1)k’+y1;式中k’=(y2-y1) /(x2-x1) 算法实现: public void RasterLine(Point start,Point end,int type,double xOffset,double yOffset) { //开始点与结束点的起始坐标 int[] startPoint = transformRasterPoint(start, 0, 0); int[] endPoint = transformRasterPoint(end, 0, 0); // System.out.println(String.format("开始点:(%d,%d)", startPoint[0],startPoint[1])); System.out.println(String.format("结束点:(%d,%d)", endPoint[0],endPoint[1])); //涂黑,开始点与终止点(值设为1) setValue(startPoint[0], startPoint[1]); setValue(endPoint[0], endPoint[1]); Line line = new Line(start, end); //如果是垂直或者水平者直接涂黑 if(line.isHorizontal() || Double.doubleToLongBits(start.getX())==Double.doubleToLongBits(end.getX())) { if(line.isHorizontal()) { int i = startPoint[0]; int j0 = Math.min(startPoint[1], endPoint[1]); int j1 = Math.max(startPoint[1], endPoint[1]); while(j0!=j1) { setValue(i, j0); j0++; } }else { int i = startPoint[1]; int j0 = Math.min(startPoint[0], endPoint[0]); int j1 = Math.max(startPoint[0], endPoint[0]); while(j0!=j1) { setValue(j0, i); j0++; } } return; } //行差与列差 int difOfRow = Math.abs(startPoint[0]-endPoint[0]); int difOfColumn = Math.abs(startPoint[1]-endPoint[1]); //若行差大于列差,则逐行求出本行中心线与过两个端点的直线的交点 //反之则反之 if(difOfRow>difOfColumn) { //求每行中心线 int num = Math.min(startPoint[0], endPoint[0]); //用于记录当前行 while(num=difY) { //开始点与结束点的起始坐标 if(Double.doubleToLongBits(end.getY()) |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |