You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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依赖:

  1. 在mix.exs中添加依赖:
defp deps do
  [
    {:geo_postgis, "~> 3.0"}
  ]
end
  1. 在Repo模块中启用PostGIS扩展:
defmodule MyApp.Repo do
  use Ecto.Repo,
    otp_app: :my_app,
    adapter: Ecto.Adapters.Postgres,
    extensions: [Geo.PostGIS.Extension]
end

内容的提问来源于stack exchange,提问作者Максим Барулин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:38:37