使用gdal计算点与圆相交的条件:
注意:以下方法以WKT格式为准。
1.圆形在GDAL中无法直接通过两个点位信息以及半径描述出来,需要自己通过构建圆形的方式才能拼凑出符合GDAL的图形描述,其中参数graph为图形描述信息
eg:
String graph="105.4471206665039,28.889448344707493,105.45038223266602,28.88773173093796"
/**
* 获得圆形的图形描述
* @param graph
* @return
*/
protected String getCircle(String graph ){
String[] points=graph.split(",");
if (points.length==4){
CirclePoint centerPoint=new CirclePoint();
centerPoint.setLng(Double.parseDouble(points[0]));
centerPoint.setLat(Double.parseDouble(points[1]));
CirclePoint endPoint=new CirclePoint();
endPoint.setLng(Double.parseDouble(points[2]));
endPoint.setLat(Double.parseDouble(points[3]));
centerPoint.setDistance(getRadius(centerPoint,endPoint));
double sin=0.0;
double cos=0.0;
double x=0.0;
double y=0.0;
List
for (int i = 0;
i <100 ;
i++) {
sin=Math.sin((6.2831853071795862 * i) / 100.0);
cos = Math.cos((6.2831853071795862 * i) / 100.0);
x = centerPoint.getLng() + (centerPoint.getDistance() * sin);
y = centerPoint.getLat() + (centerPoint.getDistance() * cos);
CirclePoint point =new CirclePoint();
point.setLng(x);
point.setLat(y);
list.add(point);
}
String graphinfo="POLYGON((";
for (int i = 0;
i < list.size() ;
i++) {
if (i
graphinfo+=""+circle.getLng()+" "+circle.getLat()+",";
}else if (i==list.size()-1){
CirclePoint circle =list.get(i);
CirclePoint firstCircle=list.get(0);
graphinfo+=""+circle.getLng()+" "+circle.getLat()+","+firstCircle.getLng()+" "+firstCircle.getLat()+"))";
}
}
return graphinfo;
}
return "";
}
/**
* 获取圆的半径
* @param centerPoint
* @param endPoint
* @return
*/
protected double getRadius(CirclePoint centerPoint,CirclePoint endPoint){
double x1=centerPoint.getLng();
double y1=centerPoint.getLat();
double x2=endPoint.getLng();
double y2=endPoint.getLat();
double radius=Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2));
return radius;
}
2.多边形也需要拼装成符合wkt格式,其中该方法的参数golygon为图形描述信息
eg:
String golygon="105.43652057647705,28.886371180415154,105.44085502624512,28.8847403973341,105.43368816375732,28.88375334441662“
/**
* 拼装多边形wkt格式
* @param golygon
* @return
*/
protected String dealWithPolygon(String golygon){
String[] points=golygon.split(",");
String graph="";
for (int i = 0;
i if(i==0){
graph="POLYGON(("+points[0]+" ";
}else if (i>0&&(i%2==0)){
graph+=points[i]+" ";
}else if(i>0&&(i%2)==1){
if (i!=points.length-1){
graph+=points[i]+",";
}else {
graph+=points[i]+"))";
}
}
}
return graph;
}
【GDAL关于圆形,多边形的创建以及如何判断点位是否与图形相交】3.如何在拼装好WKT格式后使用gdal,调用Geometry的Intersect方法判断是否相交
//根据判断图形是多边形还是圆形来判断多边形 拼装wkt
if ("POLYGON".equals(graphinfo.getType())){
ploygonStr=dealWithPolygon(graphinfo.getGraph());
}
if ("POINT".equals(graphinfo.getType())){
ploygonStr=getCircle(graphinfo.getGraph());
}
try {
Geometry ploygon =Geometry.CreateFromWkt(ploygonStr);
if (ployPoint.Intersect(ploygon)){
source.setPassuuid(graphinfo.getUuid());
resultList.add(source);
}
} catch (Exception e) {
e.printStackTrace();
}
推荐阅读
- MFC|gdal 图像金字塔
- GDAL功能模块列表
- 深入解析GDAL库的RasterIO()函数
- c++|gdal2.2.3关闭数据集失败的问题
- 初学者的领悟|百分比截断方法增加图像对比度的原理
- 初学者的领悟|c++实现使用GDAL实现大幅影像的快速读取
- GDAL|GDAL影像重采样
- gdal应用-gdalbuildvrt
- GDAL应用