我是postgis的新手,在postgressql中使用st_contains时遇到问题。 我有两个桌子: 一张带有multilinestring类型和srid 3857的表格:
'MULTILINESTRING(((5422968.66785559 3677150.09505449,5422968.65492085 3677150.0886859,5422952.17411073 3677141.94577852,5422933.98180744 3677132.88239635,5422908.89206302 3677120.3831169,5422889.41793598 3677110.66168418,5422860.41342641 3677096.31330017,5422843.29303681 3677087.88278276),(5422968.4135149 3677150.59358815,5422980.01582934 3677156.57635076,5422990.22979481 3677161.61762274,5423006.30129137 3677169.56131558))'
和另一个表的点类型和3857像这样:
'POINT(48.6977500915527 31.3106079101563)'
我在st_buffer中使用了多行字符串geom类型的第一个表,并期望从表2中找到该缓冲区内的任何点
当我使用st_contains时不返回任何行,这是什么问题?尽管两个都为3857
select ST_X(P.geom) lng , ST_Y(P.geom) lat from public."Zone" A
inner join public."Points" P on ST_Contains(ST_Buffer(A.geom, 100), P.geom)
答案 0 :(得分:0)
发件人: https://postgis.net/docs/ST_X.html
和
https://postgis.net/docs/ST_Y.html
它表示st_X和st_Y内部的geom必须是一个点,如果不可用,则为NULL。
您可以尝试运行
select A.geom as lines, P.geom as point from public."Zone" A
inner join public."Points" P on ST_Contains(ST_Buffer(A.geom, 100), P.geom);
要查看是否返回任何内容?
答案 1 :(得分:0)
关键点不是3857,而是4326。您需要先将其转换为3857
select st_asText(st_transform(st_GeomFromText('POINT(48.6977500915527 31.3106079101563)',4326),3857));
st_astext
------------------------------------------
POINT(5421008.74296974 3673153.53251071)
话虽如此,使用st_dwithin
比st_buffer
更可靠。