Làm thế nào để sử dụng ST_Intersection?


15

Đây là một bản tóm tắt nhanh về những gì tôi đang cố gắng thực hiện: Tôi có 3 bảng trong Postgres, 'a' và 'b', mỗi bảng có một cột Đa giác và 'c' có một cột Điểm. Những gì tôi đang cố gắng làm ở đây là để có các giao điểm hình học giữa 'a', 'b' và 'c' và hiển thị các hình học như vậy trên lớp vectơ OpenLayers.

Tôi đã biết cách hiển thị bất kỳ loại hình học nào từ Chuỗi trong OpenLayers, nhưng tôi gặp rắc rối với chức năng ST_Intersection của PostGIS, tôi đang làm điều này:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

trong đó a.geom và b.geom đều là các cột hình học và tôi nhận được thông báo lỗi này:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

Ngoài ra, tôi đã cố gắng diễn tả hình học kết quả dưới dạng văn bản bằng ST_AsText như thế này:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

nhưng nó gửi cho tôi thông báo lỗi này:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Tôi không biết mình đang làm gì sai, tôi chỉ muốn lấy WKT của Đa giác để hiển thị nó trên OpenLayers, đây là cách tôi hiển thị hình học từ WKT:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

CẬP NHẬT: Tôi đã thử tiếp theo:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

nhưng tôi nhận được thông báo lỗi tiếp theo:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Tôi đã thêm isvalid để xác minh chỉ các đa giác hợp lệ đang được đánh giá, nhưng nó báo lỗi là ở ST_Intersection (a, b), cả a, b và c đều có SRID giống nhau nên tôi thực sự bối rối, xin lỗi nếu tôi hỏi quá nhiều, nhưng tôi khá mới với PostGIS vì vậy tôi hy vọng tôi không làm phiền bạn nhiều. Cảm ơn.


1
Điều gì SELECT PostGIS_Full_Version();trở lại?
Mike T

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel. 4.7.1, ngày 23 tháng 9 năm 2009" USE_STATS
Uriel

Câu trả lời:


8

Tôi đoán là nó sẽ thất bại nếu giao lộ trả về NULL. Vì vậy, bạn nên thêm một mệnh đề where kiểm tra nếu thực sự có một giao lộ trước khi bạn cố gắng tạo WKT.


Tôi đã thử cái này 'VÀ ST_isvalid (b.geom) =' t '; nhưng nó trả về cùng một lỗi: ** ERROR: Hàm st_intersection (a, b) không tồn tại. GỢI Ý: Không có chức năng nào khớp với các loại đối số và tên đã cho. Bạn có thể cần thêm phôi loại rõ ràng. ** Tôi thực sự bế tắc về điều này, nếu bạn có thể giúp tôi, tôi thực sự sẽ đánh giá cao nó.
Uriel

Hãy thử tóm tắt (a.geom) và tóm tắt (b.geom) để điều tra các giá trị.
underdark

tóm tắt -------------------------- Đa giác [BS] với 1 vòng nhẫn 0 có 4 điểm Đa giác [BS] với 1 vòng nhẫn 0 có 5 điểm Đa giác [BS] với 1 vòng nhẫn 0 có 10 điểm
Uriel

Vâng, nó phải là ST_Intersection (a.geom, b.geom) chứ không phải ST_Intersection (a, b)
underdark

6

Manh mối là

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Như thông báo lỗi cho biết bạn không thể sử dụng st_intersection theo cách đó. Tóm tắt các câu trả lời khác bạn nên sử dụng một cái gì đó như thế này:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK không có ý nghĩa để sử dụng st_overlapsst_intersects trong cùng một câu vì chúng khá giống nhau .


4

Tôi kiểm tra giữa các lớp đa giác khác nhau và nó đã thất bại nếu có ít nhất một hình học không hợp lệ trong một trong các lớp. Bạn đã kiểm tra tính hợp lệ của đa giác của mình bằng ST_isvalid (the_geom) chưa? Nó có thể là chìa khóa.


Tôi đã thử cái này 'VÀ ST_isvalid (b.geom) =' t '; nhưng nó trả về cùng một lỗi: ** ERROR: Hàm st_intersection (a, b) không tồn tại. GỢI Ý: Không có chức năng nào khớp với các loại đối số và tên đã cho. Bạn có thể cần thêm phôi loại rõ ràng. ** Tôi thực sự lạc lõng vì sao nó không hoạt động
Uriel

2

Hãy thử một cái gì đó như thế này:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

Nguồn


Tôi cũng đã thử điều đó nhưng nó cũng trả về cùng một thông báo lỗi: GỢI Ý: Không có chức năng nào khớp với tên và loại đối số đã cho. Bạn có thể cần thêm phôi loại rõ ràng.
Uriel

Sẽ thế nào nếu bạn sử dụng "INNER THAM GIA b TRÊN ST_Intersection (a.geom, b.geom)"?
CaptDragon

Nó cho biết: ERROR: đối số của THAM GIA / BẬT phải là kiểu boolean, không phải kiểu hình học.
Uriel

shizer ... phải có gì đó không đúng với dữ liệu hoặc thứ gì đó vì loại truy vấn này phù hợp với tôi.
CaptDragon

Tôi đã thêm AND ST_isvalid (a.geom) = 't' AND ST_isvalid (b.geom) = 't'; cuối cùng chỉ đánh giá các hình học hợp lệ nhưng nó cho tôi biết lỗi nằm ở chỗ đó (a, b)
Uriel

1

Tôi đã cố gắng loại trừ các hình học không hợp lệ nhưng nó không hoạt động, vì vậy cuối cùng tôi phải xóa mọi hình học không hợp lệ và sau đó sử dụng:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

Như bạn có thể thấy tôi đã bỏ qua phần ST_Intersection (a, b) và phần này hoạt động rất tốt, tôi là một loại beacuse buồn, tôi không thể tìm cách loại trừ bất kỳ hình học không hợp lệ nào khỏi lựa chọn của mình, dù sao cũng cảm ơn mọi người vì đã giúp tôi ngoài này.


0

Tôi đã có vấn đề này một lần.

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

Tôi đã có thể giải quyết lỗi này bằng phương pháp này.
- Sử dụng QGIS
- Thêm lớp vectơ từ cơ sở dữ liệu của bạn
- Lấy điểm từ thông báo lỗi và tìm kiếm nó trong QGIS
   "QuickWKT" (plugin) có thể được sử dụng để tìm nó
- Sau đó, bạn sẽ thấy vấn đề linestring
- Bật chế độ chỉnh sửa
- Chọn "công cụ nút" để hiển thị nút màu xanh lá cây (vấn đề nút)
- Di chuyển nút ra khỏi nút chồng lấp
- Lưu thay đổi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.