如何在Ecto查询的PostGIS中正确使用st_buffer函数?
在Ecto查询的PostGIS中正确使用ST_Buffer的方法
针对你遇到的问题,以下是几种可行的解决方案:
方法1:使用geo_postgis封装的st_point函数构建点
利用geo_postgis提供的原生函数,直接传入经纬度和SRID,Ecto会自动处理参数绑定:
from(r in Region, select: count(r.ogc_fid), where: st_intersects(r.region_geometry, st_buffer(st_point(^long, ^lat, 4326), 0.05)) ) |> Repo.one() > 0
方法2:为Geo.Point指定类型转换
如果已经有Geo.Point结构体,通过type/2函数告诉Ecto将其转换为PostgreSQL可识别的geometry类型:
point = %Geo.Point{coordinates: {long, lat}, srid: 4326} from(r in Region, select: count(r.ogc_fid), where: st_intersects(r.region_geometry, st_buffer(type(^point, :geometry), 0.05)) ) |> Repo.one() > 0
方法3:修复Fragment的参数传递方式
手动构建完整的WKT字符串作为参数传入,避免将占位符放在WKT的引号内部:
from(r in Region, select: count(r.ogc_fid), where: st_intersects( r.region_geometry, fragment( "ST_Buffer(ST_GeomFromText(?, 4326), ?, 'quad_segs=2')", ^"POINT(#{long} #{lat})", 0.05 ) ) ) |> Repo.one() > 0
前置要求
确保已正确配置geo_postgis依赖:
- 在
mix.exs中添加依赖:
defp deps do [ {:geo_postgis, "~> 3.0"} ] end
- 在Repo模块中启用PostGIS扩展:
defmodule MyApp.Repo do use Ecto.Repo, otp_app: :my_app, adapter: Ecto.Adapters.Postgres, extensions: [Geo.PostGIS.Extension] end
内容的提问来源于stack exchange,提问作者Максим Барулин
相关产品推荐
相关产品推荐

