博客讨论了在QGIS中,两个多边形在视觉上相交,但在使用几何对象的intersects方法时返回false的问题。原因是其中一个几何对象实际上是一条线段而非完整的多边形。通过为几何对象添加一个极小的Buffer(0.01),使得原本相交的几何形状在数学上变为真正相交,从而解决了问题。
摘要由CSDN通过智能技术生成
上图两个ploygon在qgis上是相交的,但是使用
geometry1.intersects(geometry2) = false
原因:geometry2 的ploygon 为一条线段
String geom2 = "POLYGON ((13424522.607350014 3689604.6833999963, 13424515.744900092 3689602.2228004425, 13424514.623300763 3689588.520600244, 13424517.519300671 3689580.0576009, 13424531.934903784 3689577.296599313, 13424538.456499573 3689588.266200122, 13424536.184500214 3689600.5367996185, 13424522.607350014 3689604.6833999963))";
String geom1 = "POLYGON ((13424533.784500118 3689581.9672003356, 13424538.084499832 3689584.7631998626, 13424538.084499832 3689584.7631998626, 13424533.784500118 3689581.9672003356, 13424533.784500118 3689581.9672003356))";
// String geom1 = "LINESTRING (13424533.784500118 3689581.9672003356, 13424538.084499832 3689584.7631998626, 13424538.084499832 3689584.7631998626, 13424533.784500118 3689581.9672003356, 13424533.784500118 3689581.9672003356)";
Geometry ploygon2 = READER.read(geom2);
Geometry geometry1 = READER.read(geom1);
System.out.println(ploygon2.intersects(geometry1));
打印结果:false
解决办法:将geometry进行buffer(0.01)之后再进行判断
String geom2 = "POLYGON ((13424522.607350014 3689604.6833999963, 13424515.744900092 3689602.2228004425, 13424514.623300763 3689588.520600244, 13424517.519300671 3689580.0576009, 13424531.934903784 3689577.296599313, 13424538.456499573 3689588.266200122, 13424536.184500214 3689600.5367996185, 13424522.607350014 3689604.6833999963))";
String geom1 = "POLYGON ((13424533.784500118 3689581.9672003356, 13424538.084499832 3689584.7631998626, 13424538.084499832 3689584.7631998626, 13424533.784500118 3689581.9672003356, 13424533.784500118 3689581.9672003356))";
// String geom1 = "LINESTRING (13424533.784500118 3689581.9672003356, 13424538.084499832 3689584.7631998626, 13424538.084499832 3689584.7631998626, 13424533.784500118 3689581.9672003356, 13424533.784500118 3689581.9672003356)";
Geometry ploygon2 = READER.read(geom2);
Geometry geometry1 = READER.read(geom1);
System.out.println(ploygon2.intersects(geometry1.buffer(0.01)));
打印结果:true
此函数计算形状集合的 n 次交叉区域,并允许识别形状
相交
的每个交叉区域。
该函数将一个参数作为输入,一个包含形状几何描述的结构 S,并提供一个输出参数,一个包含不同形状交叉点的结构,在交叉点和相关区域中包含形状索引。 第二个参数是可选的。 Display_result 是一个二进制值,指示结果是应该显示 (1) 还是不显示 (0)。
输入: S :包含多边形几何描述的结构。 S(i) 包含与第 i 个形状相关的所有信息S(i).P(j) 可以访问第 j 个的几何描述第 i 个形状的元素。 XData : S(i).P(j).x : 向量YData : S(i).P(j).y : 向量Kong:S(i).P(j).Kong:二进制值(1= Kong,0= 填充)。 此二元变量指示是否考虑多边形S(i).P(j) 是不是一个洞。 Kong用数字上的虚线。
输出: Geo :包含几何描述
//
判断
两多边形边界是否
相交
function is
Polygon
s
Intersect
ant($plyA, $plyB) {//面面
for ($i = 0, $il = count( $plyA ); $i < $il; $i++) {
for ($j = 0, $jl = count( $plyB ); $j < $jl; $j++)...
使用考虑到浮点不规则性的公式(通过可配置的epsilon)
提供用于构造有效操作序列的API
支持GeoJSON "
Polygon
"和"Multi
Polygon
"类型(实验性)
在某种程度上基于F. Martinez(2008)算法: ,
npm install polybooljs
或者,对于浏览器,在目录中查找单个文件。 当包含在页面中时,它将公开全局PolyBool 。
var PolyBool = require ( 'polybooljs' ) ;
PolyBool .
intersect
( {
regions : [
[ [ 50 , 50 ]
/** 1 解线性方程组, 求线段交点. **/
// 如果分母为0 则平行或共线, 不
相交
let denominator = (b.y - a.y) * (d.x - c.x) - (a.x - b.x) * (c.y - d.y);
if (denominator == 0) {
return false;
// 线段所在直线的交点坐标 (x , y)
let x =
((b.x ...
SqlSession [.....] was not registered for synchronization because synchronization is not active
10389
SqlSession [.....] was not registered for synchronization because synchronization is not active
求求大佬救救我:
SqlSession [.....] was not registered for synchronization because synchronization is not active
求求大佬救救我:
OpenDRIVE文件格式详解
小鱼不吃鱼干:
java 使用GeoTools工具 geojson 与shp 相互转换
weixin_55118807: