2017-06-01 3 views
0

私はGeoGeo.Pointあり、このスキーマがあります。人間が読める形式として地理ライブラリからJSONエンコード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.pointWKTの形式になるため、クエリによって返される座標はどのようになりますか?

+0

|> Geo.WKB.decode |> Geo.WKT.encode'? – Dogbert

+0

@Dogbertちょうど私がそのコードを書いているのだろうか? – BeniaminoBaggins

+0

IO.inspect(create_query_no_keyword(categories、shop_ids)|> Api.Repo.all) 'の出力を投稿できますか?そのWKB値が返された値のどこにあるかは完全にはわかりません。 – Dogbert

答えて

1

私はthis Stack Exchange GIS answerがソリューションであることが判明:ポイントオブジェクトのための

使用この:

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の特異的でした。 PostGISのST_AsTextまたはST_XおよびST_Yを使用して列を選択する必要があります。

私のselect文は、これに変更:

どう ` "01 ..." 程度
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)} 
関連する問題