0

我有这个架构,它有一个Geo Geo.Point

defmodule Api.Shop do
  use Ecto.Schema
  import Ecto.Changeset
  import Api.Repo
  import Ecto.Query

  @derive {Poison.Encoder, only: [:name, :place_id, :geo_json, :distance]}
  schema "shops" do
    field :name, :string
    field :place_id, :string
    field :point, Geo.Point
    field :geo_json, :string, virtual: true
    field :distance, :float, virtual: true

    timestamps()
  end

  def encode_model(shop) do
    %Api.Shop{shop | geo_json: Geo.JSON.encode(shop.point) }
  end

  defimpl Poison.Encoder, for: Api.Shop do
    def encode(shop, options) do
      shop = Api.Shop.encode_model(shop)
      Poison.Encoder.Map.encode(Map.take(shop, [:id, :name, :geo_json]), options)
    end
  end

  def changeset(shop, params \\ %{}) do
    shop
    |> cast(params, [:name, :place_id, :point])
    |> validate_required([:name, :place_id, :point])
    |> unique_constraint(:place_id)
  end......
end

当我shop.point在查询中返回该字段时:

  def create_query_no_keyword(categories, shop_ids) do
    products_shops_categories = from p in Product,
    distinct: p.id,
    join: ps in ProductShop, on: p.id == ps.p_id,
    join: s in Shop, on: s.id == ps.s_id,
    join: pc in ProductCategory, on: p.id == pc.p_id,
    join: c in Subcategory, on: c.id == pc.c_id,
    where: c.id in ^categories,
    where: s.id in ^shop_ids,
    group_by: [p.id, p.name, p.brand],
    select: %{product: p, categories: fragment("json_agg( DISTINCT (?, ?)) AS category", c.id, c.name), shops: fragment("json_agg( DISTINCT (?, ?, ?)) AS shop", s.id, s.name, s.point)}
  end

返回的实际上0101000020E6100000A3BDB0EB0DD9654030AC2C1BE76D42C0是错误的格式 - WKB。我正在寻找编码为具有可读坐标的 WKT。

当查询返回时,我如何获得s.point格式WKT并因此具有坐标?

4

1 回答 1

1

我发现这个 Stack Exchange GIS 答案是解决方案:

将此用于点对象:

SELECT ST_AsText(the_geom) 
       FROM myTable; and viewing X,Y and geom object:

SELECT ST_X(the_geom), ST_Y(the_geom), ST_AsText(the_geom) 
       FROM myTable;

Geo图书馆使用PostGIS,解决方案是 PostGIS 特定的。您需要使用ST_AsText、 或ST_XST_YPostGIS 中选择列。

我的选择语句更改为:

select: %{product: p, categories: fragment("json_agg( DISTINCT (?, ?)) AS category", c.id, c.name), shops: fragment("json_agg( DISTINCT (?, ?, ST_X(?), ST_Y(?))) AS shop", s.id, s.name, s.point, s.point)}
于 2017-06-01T23:28:13.733 回答