GIS 基础算法
地理信息系统算法基础上机题目(java 实现)
gis_lyh by 2013.4
目录
一、已知一线段 AB,在某个方向选择一点 P,输入距离 d,求线段 AB 延长距离 d 后的
点坐标; ................................................................................................................................... 2
二、判断两线段是否相交; ................................................................................................... 4
三、多边形重心计算; ........................................................................................................... 7
四、编程实现八方向矢量线栅格化; ................................................................................... 9
五、编程实现全路径矢量线栅格化; ................................................................................. 11
六、编程实现间隔取点法达到矢量数据的压缩; ............................................................. 13
七、求点 P(x,y)到线段 l 的最短距离; ................................................................................ 15
八、编写链式编码程序实现栅格数据的压缩; ................................................................. 17
九、编程:用垂距法实现矢量数据的压缩。 ..................................................................... 20
仅供参考---gis_lyh
GIS 基础算法
一、已知一线段 AB,在某个方向选择一点 P,输入距离 d,
求线段 AB 延长距离 d 后的点坐标;
1、 package gis.lyh.algorithm;
2、 import com.vividsolutions.jts.geom.*;
3、
4、 /**
5、 * 点到线段的距离
6、 * @author gis_lyh
7、 *
8、 */
9、 public class PointDistSegment {
10、
11、 /**
12、 * @param args
13、 */
14、 public static void main(String[] args) {
15、
16、
// TODO Auto-generated method stub
Coordinate polyLine[]=new Coordinate[]{new
Coordinate(0,0),new Coordinate(1,1)};
System.out.print(dist);
Coordinate point=new Coordinate(2,3);
double dist=PointToSegment(polyLine,point);
17、
18、
19、
20、
21、 }
22、
23、 /**
24、 * 点到线段的距离
25、 * @param polyLine
26、 * @param point
27、 * @return
28、 */
29、 private static double PointToSegment(Coordinate[] polyLine,
Coordinate point)
30、 {
31、
32、
33、
34、
35、
36、
37、
38、
double dist=0, a,b,c;
a=Distance(polyLine[0],polyLine[1]);
b=Distance(polyLine[0],point);
c=Distance(polyLine[1],point);
if(c<=0.000001||b<=0.000001)
dist=0;
if(a<=0.00001)
仅供参考---gis_lyh
GIS 基础算法
dist=b;
dist=b;
dist= c;
return dist;
if(b*b>=c*c+a*a)
if(c*c>=a*a+b*b)
double p=(a+b+c)/2;
dist=2*Math.sqrt(p*(p-a)*(p-c)*(p-c))/a;
39、
40、
41、
42、
43、
44、
45、
46、
47、
48、 }
49、
50、 /**
51、 * 两断点的距离
52、 * @param coordinate
53、 * @param coordinate2
54、 * @return
55、 */
56、 private static double Distance(Coordinate p1, Coordinate p2)
57、 {
58、
return
Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
59、 }
60、 }
仅供参考---gis_lyh
GIS 基础算法
二、判断两线段是否相交;
package gis.lyh.algorithm;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.WKTReader;
/**
* 使用叉积判断线段是否相交
* @author gis_lyh
*
*/
public class LineIntersectLine {
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
// 使用WKT读取文本创建几何体
WKTReader read=new WKTReader();
LineString polyLine1=(LineString)read.read("LINESTRING(0 0,5
5)");
LineString polyLine2=(LineString)read.read("LINESTRING(0 6,11
6)");
//分别获取线段两端点的值
Coordinate []coordinates=polyLine1.getCoordinates();
Coordinate p1=coordinates[0];
Coordinate p2= coordinates[1];
coordinates=polyLine2.getCoordinates();
Coordinate q1=coordinates[0];
Coordinate q2=coordinates[1];
//是否相互跨立
Boolean b=CrossMethod(p1,p2,q1,q2);
if(b)
System.out.println("线段相交。");
else
System.out.println("线段不相交。");
}
/**
*
仅供参考---gis_lyh
GIS 基础算法
* @param p1
* @param p2
* @param q1
* @param q2
* @return 返回两个叉积
*/
public static Boolean CrossMethod(Coordinate p1, Coordinate
p2,Coordinate q1, Coordinate q2)
{
//判断两直线的最小外包矩阵是否相交
if(Envelope.intersects(p1, p2, q1, q2))
{
double
result1=ResultMethod(CutMethod(p1,q1),CutMethod(q2,q1),CutMethod(p2,q
1));
//System.out.println("result1:"+result1);
double
result2=ResultMethod(CutMethod(q1,p1),CutMethod(p2,p1),CutMethod(q2,p
1));
//System.out.println("result2:"+result2);
if(result1<=0&&result2<=0)
return true;
else
return false;
}
else
return false;
}
/**
* 计算叉积
* @param pCq1
* @param qCq
* @param pCq2
* @return
*/
private static double ResultMethod(Coordinate pCq1, Coordinate
qCq,Coordinate pCq2)
{
double
result=(pCq1.x*qCq.y-qCq.x*pCq1.y)*(pCq2.x*qCq.y-qCq.x*pCq2.y);
return result;
}
仅供参考---gis_lyh
GIS 基础算法
/**
* 矢量相减
* @param p1
* @param q1
* @return
*/
private static Coordinate CutMethod(Coordinate p1, Coordinate q1)
{
}
Coordinate c=new Coordinate();
c.x=p1.x-q1.x;
c.y=p1.y-q1.y;
//System.out.println("c"+c);
return c;
}
仅供参考---gis_lyh
GIS 基础算法
三、多边形重心计算;
package gis.lyh.algorithm;
import com.vividsolutions.jts.geom.*;
/**
* 计算多边形的中心
* @author gis_lyh
*
*/
public class ComputeCenter {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Coordinate polygon[]=new Coordinate[]{new Coordinate(1,1),new
Coordinate(2,2),new Coordinate(2,1),new Coordinate(1,1)};
Coordinate centerPoint=CenterMethod(polygon);
System.out.print(centerPoint);
}
private static Coordinate CenterMethod(Coordinate[] polygon)
{
// TODO Auto-generated method stub
Coordinate point=new Coordinate();
int i,j;
double ai,atmp=0,xtmp=0,ytmp=0;
if(polygon.length<3)
return null;
for(i=polygon.length-1,j=0;j
GIS 基础算法
}
return point;
}
}
仅供参考---gis_lyh