PostGIS ST_Buffer半径帮助


9

我正在尝试查找给定点五英里半径内的所有点。我有这样的查询:

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

我想不出要代替?(半径)以获得五英里的东西。一切都在EPSG 4326中,根据PostGIS文档(据我所知),我的半径应该以米为单位。如果我投入12,070.0m(约5英里),我将在全国范围内进行比赛。有人知道我在想什么吗?


4326是dd(十进制度数)。当投影为latlon时,12070是一个很大的区域(半径)。
Brad Nesom

1
错误-12 070米= 7.49995029英里,所以5英里就是8046.72米,所以(?= 8046.72)-您的数据是地理还是几何?
Mapperz

Answers:


14

因为没有投影数据-它是椭球上的点-线性距离有点没有意义。在赤道上五英里远比在北极圈上5英里小。但是幸运的是,PostGIS(> = 1.5)可以为您提供答案:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

它具有geography专门用于此类事物的类型。它与几何相似,但是仅使用EPSG:4326,并且使用它的功能要少得多。

在上面的示例中,我在兴趣点上调用了ST_GeogFromText()(还有一个ST_GeographyFromText(),我不确定是否存在差异)(它可以与常规WKT一起使用,因为SRID参数是冗余),然后将latlon列转换为地理位置类型。如果您要执行很多操作,则在表中创建地理位置列并完全跳过转换会更有效。最后,ST_DWithin()可以获取地理参数,并且可以对线性距离执行正确的操作。


感谢您的帮助。我对PostGIS还是很陌生。
Nik

4

也许您想要使用ST_DWithin函数。请参阅st_buffer文档中的注释。
ST_Buffer

人们经常会错误地使用此功能尝试进行半径搜索。创建半径搜索缓冲区是缓慢且毫无意义的。请改用ST_DWithin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.