gis bugfix

This commit is contained in:
wu-xingying
2024-07-01 15:18:45 +00:00
committed by ob-robot
parent 973f1bafd4
commit c770941bf6
18 changed files with 80 additions and 50 deletions

View File

@ -47,6 +47,7 @@ public:
virtual ObVertexes& get_vertexes() = 0; virtual ObVertexes& get_vertexes() = 0;
virtual ObLineSegments* get_line_segments() = 0; virtual ObLineSegments* get_line_segments() = 0;
virtual ObSegments* get_segments() = 0; virtual ObSegments* get_segments() = 0;
virtual void destroy_cache() = 0;
}; };
class ObCachedGeomBase : public ObCachedGeom { class ObCachedGeomBase : public ObCachedGeom {
@ -67,6 +68,7 @@ public:
virtual int contains(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override; virtual int contains(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override;
virtual int cover(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override; virtual int cover(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override;
virtual int within(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override; virtual int within(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override;
virtual void destroy_cache() {this->~ObCachedGeomBase();}
virtual ObGeometry* get_cached_geom() { return origin_geo_;} virtual ObGeometry* get_cached_geom() { return origin_geo_;}
virtual ObGeoCacheType get_cache_type() { return ObGeoCacheType::GEO_BASE_CACHE;} virtual ObGeoCacheType get_cache_type() { return ObGeoCacheType::GEO_BASE_CACHE;}
virtual void set_cached_geom(ObGeometry* geo) { origin_geo_ = geo; } virtual void set_cached_geom(ObGeometry* geo) { origin_geo_ = geo; }

View File

@ -37,7 +37,7 @@ int ObCachedGeoLinestring::init()
ret = OB_ALLOCATE_MEMORY_FAILED; ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("alloc point location analyzer failed", K(ret)); LOG_WARN("alloc point location analyzer failed", K(ret));
} else { } else {
lAnalyzer_ = new(buf) ObLineIntersectionAnalyzer(this, &rtree_); lAnalyzer_ = new(buf) ObLineIntersectionAnalyzer(this, rtree_);
} }
} }
} }

View File

@ -35,6 +35,7 @@ public:
virtual ObGeoCacheType get_cache_type() { return ObGeoCacheType::GEO_LINESTRING_CACHE;} virtual ObGeoCacheType get_cache_type() { return ObGeoCacheType::GEO_LINESTRING_CACHE;}
virtual int intersects(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override; virtual int intersects(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override;
virtual ObLineSegments* get_line_segments() { return &line_segments_; } virtual ObLineSegments* get_line_segments() { return &line_segments_; }
virtual void destroy_cache() { this->~ObCachedGeoLinestring(); }
private: private:
ObRstarTree<ObLineSegment> rtree_; ObRstarTree<ObLineSegment> rtree_;
ObLineIntersectionAnalyzer *lAnalyzer_; ObLineIntersectionAnalyzer *lAnalyzer_;

View File

@ -25,6 +25,7 @@ public:
: ObCachedGeomBase(geom, allocator, srs) {} : ObCachedGeomBase(geom, allocator, srs) {}
virtual ~ObCachedGeoPoint() {}; virtual ~ObCachedGeoPoint() {};
virtual ObGeoCacheType get_cache_type() { return ObGeoCacheType::GEO_POINT_CACHE;} virtual ObGeoCacheType get_cache_type() { return ObGeoCacheType::GEO_POINT_CACHE;}
virtual void destroy_cache() { this->~ObCachedGeoPoint(); }
virtual int intersects(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override; virtual int intersects(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override;
}; };

View File

@ -79,7 +79,7 @@ int ObCachedGeoPolygon::init_point_analyzer()
ret = OB_ALLOCATE_MEMORY_FAILED; ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("alloc point location analyzer failed", K(ret)); LOG_WARN("alloc point location analyzer failed", K(ret));
} else { } else {
pAnalyzer_ = new(buf) ObPointLocationAnalyzer(this, &seg_rtree_); pAnalyzer_ = new(buf) ObPointLocationAnalyzer(this, seg_rtree_);
} }
} }
} }
@ -228,7 +228,7 @@ int ObCachedGeoPolygon::init_line_analyzer()
ret = OB_ALLOCATE_MEMORY_FAILED; ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("alloc line segment intersection analyzer failed", K(ret)); LOG_WARN("alloc line segment intersection analyzer failed", K(ret));
} else { } else {
lAnalyzer_ = new(buf) ObLineIntersectionAnalyzer(this, &rtree_); lAnalyzer_ = new(buf) ObLineIntersectionAnalyzer(this, rtree_);
// collect line segments // collect line segments
ObGeoSegmentCollectVisitor seg_visitor(&line_segments_); ObGeoSegmentCollectVisitor seg_visitor(&line_segments_);
if (OB_FAIL(get_cached_geom()->do_visit(seg_visitor))) { if (OB_FAIL(get_cached_geom()->do_visit(seg_visitor))) {
@ -318,24 +318,29 @@ int ObCachedGeoPolygon::get_point_position_in_polygon(int p_idx, const ObPoint2d
} else { } else {
pos = ObPointLocation::INVALID; pos = ObPointLocation::INVALID;
for (int i = start; i < end && OB_SUCC(ret) && pos == ObPointLocation::INVALID; ++i) { for (int i = start; i < end && OB_SUCC(ret) && pos == ObPointLocation::INVALID; ++i) {
ObPointLocationAnalyzer tmp_pAnalyzer(this, rings_rtree_.rtrees_[i]); if (OB_ISNULL(rings_rtree_.rtrees_[i])) {
if (i == start) { ret = OB_BAD_NULL_ERROR;
// exterior ring LOG_WARN("rtree is null", K(ret), K(i));
if (OB_FAIL(tmp_pAnalyzer.calculate_point_position(test_point))) { } else {
ObPointLocationAnalyzer tmp_pAnalyzer(this, *rings_rtree_.rtrees_[i]);
if (i == start) {
// exterior ring
if (OB_FAIL(tmp_pAnalyzer.calculate_point_position(test_point))) {
LOG_WARN("calculate point position failed", K(ret), K(input_vertexes_[i]));
} else if (tmp_pAnalyzer.get_position() == ObPointLocation::EXTERIOR) {
// outside the exterior ring
pos = ObPointLocation::EXTERIOR;
} else if (tmp_pAnalyzer.get_position() == ObPointLocation::BOUNDARY) {
pos = ObPointLocation::BOUNDARY;
} // if is ObPointLocation::INTERIOR, need to check inner rings
} else if (OB_FAIL(tmp_pAnalyzer.calculate_point_position(test_point))) {
LOG_WARN("calculate point position failed", K(ret), K(input_vertexes_[i])); LOG_WARN("calculate point position failed", K(ret), K(input_vertexes_[i]));
} else if (tmp_pAnalyzer.get_position() == ObPointLocation::EXTERIOR) { } else if (tmp_pAnalyzer.get_position() == ObPointLocation::INTERIOR) {
// outside the exterior ring // inside a hole => outside the polygon
pos = ObPointLocation::EXTERIOR; pos = ObPointLocation::EXTERIOR;
} else if (tmp_pAnalyzer.get_position() == ObPointLocation::BOUNDARY) { } else if (tmp_pAnalyzer.get_position() == ObPointLocation::BOUNDARY) {
pos = ObPointLocation::BOUNDARY; pos = ObPointLocation::BOUNDARY;
} // if is ObPointLocation::INTERIOR, need to check inner rings }
} else if (OB_FAIL(tmp_pAnalyzer.calculate_point_position(test_point))) {
LOG_WARN("calculate point position failed", K(ret), K(input_vertexes_[i]));
} else if (tmp_pAnalyzer.get_position() == ObPointLocation::INTERIOR) {
// inside a hole => outside the polygon
pos = ObPointLocation::EXTERIOR;
} else if (tmp_pAnalyzer.get_position() == ObPointLocation::BOUNDARY) {
pos = ObPointLocation::BOUNDARY;
} }
} }

View File

@ -36,7 +36,13 @@ public:
ring_segments_(&seg_mode_arena, common::ObModIds::OB_MODULE_PAGE_ALLOCATOR), ring_segments_(&seg_mode_arena, common::ObModIds::OB_MODULE_PAGE_ALLOCATOR),
poly_count_(0), poly_count_(0),
inited_(false) {} inited_(false) {}
~ObRingsRtree() {} ~ObRingsRtree() {
for (int i = 0; i < rtrees_.size(); ++i) {
if (OB_NOT_NULL(rtrees_[i])) {
rtrees_[i]->~ObRstarTree();
}
}
}
int get_ring_strat_idx(int p_idx, int &start, int& end); int get_ring_strat_idx(int p_idx, int &start, int& end);
ObRtreeVecArena rtrees_arena_; ObRtreeVecArena rtrees_arena_;
ObIntArena int_arena_; ObIntArena int_arena_;
@ -71,6 +77,7 @@ public:
virtual int cover(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override; virtual int cover(ObGeometry& geo, ObGeoEvalCtx& gis_context, bool &res) override;
virtual ObLineSegments* get_line_segments() { return &line_segments_; } virtual ObLineSegments* get_line_segments() { return &line_segments_; }
virtual ObSegments* get_segments() { return &segments_; } virtual ObSegments* get_segments() { return &segments_; }
virtual void destroy_cache() {this->~ObCachedGeoPolygon();}
private: private:
int get_farthest_point_position(ObVertexes& vertexes, ObPointLocation& farthest_position, bool& has_point_internal); int get_farthest_point_position(ObVertexes& vertexes, ObPointLocation& farthest_position, bool& has_point_internal);
int init_line_analyzer(); int init_line_analyzer();

View File

@ -146,7 +146,7 @@ int ObGeoPointLocationVisitor::calculate_point_location_in_linestring(T_IBIN *ge
typename T_IBIN::value_type::iterator iter = line->begin(); typename T_IBIN::value_type::iterator iter = line->begin();
typename T_IBIN::value_type::iterator iter_after = line->begin() + 1; typename T_IBIN::value_type::iterator iter_after = line->begin() + 1;
ObSegment seg; ObSegment seg;
for (uint32_t i = 0; i < geo_size - 1 && OB_SUCC(ret); ++i, ++iter, ++iter_after) { for (uint32_t i = 0; i < geo_size - 1 && OB_SUCC(ret) && point_location_ != ObPointLocation::BOUNDARY && point_location_ != ObPointLocation::INTERIOR; ++i, ++iter, ++iter_after) {
seg.begin.x = iter->template get<0>(); seg.begin.x = iter->template get<0>();
seg.begin.y = iter->template get<1>(); seg.begin.y = iter->template get<1>();
seg.end.x = (iter_after)->template get<0>(); seg.end.x = (iter_after)->template get<0>();

View File

@ -58,6 +58,7 @@ public:
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
} else { } else {
try { try {
rtree_index_.~RStarTree();
new (&rtree_index_) RStarTree(rtree_nodes.begin(), rtree_nodes.end()); new (&rtree_index_) RStarTree(rtree_nodes.begin(), rtree_nodes.end());
is_built_ = true; is_built_ = true;
} catch (...) { } catch (...) {

View File

@ -32,15 +32,12 @@ int ObLineIntersectionAnalyzer::segment_intersection_query(ObGeometry *geo)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
is_intersect_ = false; is_intersect_ = false;
if (OB_ISNULL(rtree_index_)) { if (!rtree_index_.is_built()) {
ret = OB_ERR_NULL_VALUE;
LOG_WARN("rtree index is null", K(ret));
} else if (!rtree_index_->is_built()) {
ObLineSegments* line_segs = cache_geo_->get_line_segments(); ObLineSegments* line_segs = cache_geo_->get_line_segments();
if (OB_ISNULL(line_segs)) { if (OB_ISNULL(line_segs)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("should not be null", K(ret)); LOG_WARN("should not be null", K(ret));
} else if (OB_FAIL(rtree_index_->construct_rtree_index(line_segs->segs_))) { } else if (OB_FAIL(rtree_index_.construct_rtree_index(line_segs->segs_))) {
LOG_WARN("construct rtree index failed", K(ret)); LOG_WARN("construct rtree index failed", K(ret));
} }
} }
@ -58,7 +55,7 @@ int ObLineIntersectionAnalyzer::segment_intersection_query(ObGeometry *geo)
inter_res = LineIntersect::NO_INTERSCT; inter_res = LineIntersect::NO_INTERSCT;
if (OB_FAIL(input_segments.segs_[i].get_box(box))) { if (OB_FAIL(input_segments.segs_[i].get_box(box))) {
LOG_WARN("failed to get segment box", K(ret)); LOG_WARN("failed to get segment box", K(ret));
} else if (OB_FAIL(rtree_index_->query(QueryRelation::INTERSECTS, box, res))) { } else if (OB_FAIL(rtree_index_.query(QueryRelation::INTERSECTS, box, res))) {
LOG_WARN("failed to query rtree", K(ret)); LOG_WARN("failed to query rtree", K(ret));
} else { } else {
for (uint32_t j = 0; j < res.size() && OB_SUCC(ret) && !is_check_done(inter_res); j++) { for (uint32_t j = 0; j < res.size() && OB_SUCC(ret) && !is_check_done(inter_res); j++) {

View File

@ -23,7 +23,7 @@ class ObLineIntersectionAnalyzer {
public: public:
typedef std::pair<ObCartesianBox, ObLineSegment *> RtreeNodeValue; typedef std::pair<ObCartesianBox, ObLineSegment *> RtreeNodeValue;
public: public:
ObLineIntersectionAnalyzer(ObCachedGeomBase *cache_geo, ObRstarTree<ObLineSegment> *rtree_index) ObLineIntersectionAnalyzer(ObCachedGeomBase *cache_geo, ObRstarTree<ObLineSegment> &rtree_index)
: cache_geo_(cache_geo), : cache_geo_(cache_geo),
rtree_index_(rtree_index), rtree_index_(rtree_index),
flags_(0) {} flags_(0) {}
@ -39,7 +39,7 @@ public:
bool set_after_visitor() { return false; } bool set_after_visitor() { return false; }
private: private:
ObCachedGeomBase *cache_geo_; ObCachedGeomBase *cache_geo_;
ObRstarTree<ObLineSegment> *rtree_index_; ObRstarTree<ObLineSegment> &rtree_index_;
union { union {
struct { struct {
uint8_t is_intersect_ : 1; uint8_t is_intersect_ : 1;

View File

@ -20,14 +20,14 @@ namespace common {
int ObPointLocationAnalyzer::calculate_point_position(const ObPoint2d &test_point) int ObPointLocationAnalyzer::calculate_point_position(const ObPoint2d &test_point)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (OB_ISNULL(rtree_index_) || OB_ISNULL(cache_geo_)) { if (OB_ISNULL(cache_geo_)) {
ret = OB_ERR_NULL_VALUE; ret = OB_ERR_NULL_VALUE;
LOG_WARN("rtree index or cache geo is null", K(rtree_index_), K(cache_geo_), K(ret)); LOG_WARN("rtree index or cache geo is null", K(cache_geo_), K(ret));
} else if (!rtree_index_->is_built()) { } else if (!rtree_index_.is_built()) {
if (OB_ISNULL(cache_geo_->get_segments())) { if (OB_ISNULL(cache_geo_->get_segments())) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("should not be null.", K(ret)); LOG_WARN("should not be null.", K(ret));
} else if (OB_FAIL(rtree_index_->construct_rtree_index(*(cache_geo_->get_segments())))) { } else if (OB_FAIL(rtree_index_.construct_rtree_index(*(cache_geo_->get_segments())))) {
LOG_WARN("construct rtree index failed", K(ret)); LOG_WARN("construct rtree index failed", K(ret));
} }
} }
@ -37,7 +37,7 @@ int ObPointLocationAnalyzer::calculate_point_position(const ObPoint2d &test_poin
ObCartesianBox box; ObCartesianBox box;
box.set_box(std::min(cache_geo_->get_x_min() - 1.0, test_point.x), test_point.y, box.set_box(std::min(cache_geo_->get_x_min() - 1.0, test_point.x), test_point.y,
std::max(cache_geo_->get_x_max() + 1.0, test_point.x), test_point.y); std::max(cache_geo_->get_x_max() + 1.0, test_point.x), test_point.y);
if (OB_FAIL(rtree_index_->query(QueryRelation::INTERSECTS, box, res))) { if (OB_FAIL(rtree_index_.query(QueryRelation::INTERSECTS, box, res))) {
LOG_WARN("failed to query rtree", K(ret)); LOG_WARN("failed to query rtree", K(ret));
} else { } else {
bool is_on_boundary = false; bool is_on_boundary = false;

View File

@ -23,7 +23,7 @@ class ObPointLocationAnalyzer {
public: public:
typedef std::pair<ObCartesianBox, ObSegment *> RtreeNodeValue; typedef std::pair<ObCartesianBox, ObSegment *> RtreeNodeValue;
public: public:
ObPointLocationAnalyzer(ObCachedGeomBase *cache_geo, ObRstarTree<ObSegment> *rtree_index) ObPointLocationAnalyzer(ObCachedGeomBase *cache_geo, ObRstarTree<ObSegment> &rtree_index)
: cache_geo_(cache_geo), : cache_geo_(cache_geo),
rtree_index_(rtree_index), rtree_index_(rtree_index),
position_(ObPointLocation::INVALID), position_(ObPointLocation::INVALID),
@ -36,7 +36,7 @@ public:
void update_farthest_position(); void update_farthest_position();
private: private:
ObCachedGeomBase *cache_geo_; ObCachedGeomBase *cache_geo_;
ObRstarTree<ObSegment> *rtree_index_; ObRstarTree<ObSegment> &rtree_index_;
ObPointLocation position_; ObPointLocation position_;
uint32_t intersect_cnt_; uint32_t intersect_cnt_;
}; };

View File

@ -1798,8 +1798,7 @@ int ObDmlCgService::generate_das_projector(const ObIArray<uint64_t> &dml_column_
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
IntFixedArray &old_row_projector = das_ctdef.old_row_projector_; IntFixedArray &old_row_projector = das_ctdef.old_row_projector_;
IntFixedArray &new_row_projector = das_ctdef.new_row_projector_; IntFixedArray &new_row_projector = das_ctdef.new_row_projector_;
bool is_spatial_index = das_ctdef.table_param_.get_data_table().is_spatial_index() bool is_spatial_index = das_ctdef.table_param_.get_data_table().is_spatial_index();
&& das_ctdef.op_type_ == DAS_OP_TABLE_UPDATE;
uint8_t extra_geo = (is_spatial_index) ? 1 : 0; uint8_t extra_geo = (is_spatial_index) ? 1 : 0;
//generate old row projector //generate old row projector
if (!old_row.empty()) { if (!old_row.empty()) {

View File

@ -624,19 +624,19 @@ int ObSpatialDMLIterator::get_geo_wkb(
ObObjMeta &geo_meta) const ObObjMeta &geo_meta) const
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const uint64_t geo_col_id = das_ctdef_->table_param_.get_data_table().get_spatial_geo_col_id(); const uint64_t rowkey_num = das_ctdef_->table_param_.get_data_table().get_rowkey_column_num();
const bool has_old_row = !main_ctdef_->old_row_projector_.empty(); geo_idx = row_projector_->at(rowkey_num);
geo_idx = -1; if (geo_idx >= store_row->cnt_) {
for (int64_t i = 0; OB_SUCC(ret) && i < main_ctdef_->column_ids_.count() && -1 == geo_idx; ++i) { ret = OB_ERR_UNEXPECTED;
const int64_t projector_idx = has_old_row ? main_ctdef_->old_row_projector_.at(i) : i; LOG_WARN("invalid index for sr", K(ret), KPC(store_row), K(row_projector_));
if (geo_col_id == main_ctdef_->column_ids_.at(i)) { } else {
if (projector_idx >= store_row->cnt_) { geo_wkb = store_row->cells()[geo_idx].get_string();
ret = OB_ERR_UNEXPECTED; bool found = false;
LOG_WARN("invalid index for sr", K(ret), KPC(store_row), K(i), K(main_ctdef_->old_row_projector_)); uint64_t geo_col_id = das_ctdef_->table_param_.get_data_table().get_spatial_geo_col_id();
} else { for (int64_t i = 0; OB_SUCC(ret) && i < main_ctdef_->column_ids_.count() && !found; ++i) {
geo_idx = projector_idx; if (geo_col_id == main_ctdef_->column_ids_.at(i)) {
geo_wkb = store_row->cells()[projector_idx].get_string();
geo_meta = main_ctdef_->column_types_.at(i); geo_meta = main_ctdef_->column_types_.at(i);
found = true;
} }
} }
} }

View File

@ -1193,6 +1193,18 @@ int ObGeoExprUtils::check_box_intersects(ObGeometry &geo1, ObGeometry &geo2, ObI
return ret; return ret;
} }
ObGeoConstParamCache::~ObGeoConstParamCache()
{
if (OB_NOT_NULL(cached_param1_)) {
cached_param1_->destroy_cache();
cached_param1_ = nullptr;
}
if (OB_NOT_NULL(cached_param2_)) {
cached_param2_->destroy_cache();
cached_param1_ = nullptr;
}
}
ObGeometry * ObGeoConstParamCache::get_const_param_cache(int arg_idx) ObGeometry * ObGeoConstParamCache::get_const_param_cache(int arg_idx)
{ {
ObGeometry * res = nullptr; ObGeometry * res = nullptr;

View File

@ -229,7 +229,7 @@ public:
cached_param1_(nullptr), cached_param1_(nullptr),
param2_(nullptr), param2_(nullptr),
cached_param2_(nullptr) {} cached_param2_(nullptr) {}
~ObGeoConstParamCache() {}; ~ObGeoConstParamCache();
ObGeometry *get_const_param_cache(int arg_idx); ObGeometry *get_const_param_cache(int arg_idx);
ObCachedGeom *get_cached_geo(int arg_idx); ObCachedGeom *get_cached_geo(int arg_idx);

View File

@ -1338,3 +1338,6 @@ ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 20,20 20,20 0, 0 0)))'))
select st_intersects(ST_GeomFromText('LINESTRING(0 0 0, 10 10 10, 20 25 30, 50 60 -60)',26918),ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10 10), POINT(30 30 -30), LINESTRING(15 15 -15, 20 20 30),MULTIPOLYGON(((-1 -1 -1,10 10 0,-10 -20 20,0 -10 0,-1 -1 -1)))))',26918)); select st_intersects(ST_GeomFromText('LINESTRING(0 0 0, 10 10 10, 20 25 30, 50 60 -60)',26918),ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10 10), POINT(30 30 -30), LINESTRING(15 15 -15, 20 20 30),MULTIPOLYGON(((-1 -1 -1,10 10 0,-10 -20 20,0 -10 0,-1 -1 -1)))))',26918));
st_intersects(ST_GeomFromText('LINESTRING(0 0 0, 10 10 10, 20 25 30, 50 60 -60)',26918),ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10 10), POINT(30 30 -30), LINESTRING(15 15 -15, 20 20 30),MULTIPOLYGON(((-1 -1 -1,10 10 0,-10 -20 20,0 st_intersects(ST_GeomFromText('LINESTRING(0 0 0, 10 10 10, 20 25 30, 50 60 -60)',26918),ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10 10), POINT(30 30 -30), LINESTRING(15 15 -15, 20 20 30),MULTIPOLYGON(((-1 -1 -1,10 10 0,-10 -20 20,0
1 1
select st_intersects(ST_GeomFromText('LINESTRING(0 0, 10 10, 20 25 , 50 60 )'),ST_GeomFromText('point(5 5 )')) ;
st_intersects(ST_GeomFromText('LINESTRING(0 0, 10 10, 20 25 , 50 60 )'),ST_GeomFromText('point(5 5 )'))
1

View File

@ -1099,4 +1099,6 @@
SELECT ST_INTERSECTS(ST_GEOMFROMTEXT('POINT(10 10)'), SELECT ST_INTERSECTS(ST_GEOMFROMTEXT('POINT(10 10)'),
ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 20,20 20,20 0, 0 0)))')); ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 20,20 20,20 0, 0 0)))'));
select st_intersects(ST_GeomFromText('LINESTRING(0 0 0, 10 10 10, 20 25 30, 50 60 -60)',26918),ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10 10), POINT(30 30 -30), LINESTRING(15 15 -15, 20 20 30),MULTIPOLYGON(((-1 -1 -1,10 10 0,-10 -20 20,0 -10 0,-1 -1 -1)))))',26918)); select st_intersects(ST_GeomFromText('LINESTRING(0 0 0, 10 10 10, 20 25 30, 50 60 -60)',26918),ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10 10), POINT(30 30 -30), LINESTRING(15 15 -15, 20 20 30),MULTIPOLYGON(((-1 -1 -1,10 10 0,-10 -20 20,0 -10 0,-1 -1 -1)))))',26918));
select st_intersects(ST_GeomFromText('LINESTRING(0 0, 10 10, 20 25 , 50 60 )'),ST_GeomFromText('point(5 5 )')) ;