资讯专栏INFORMATION COLUMN

Elixir Ecto: 使用Geo库操作空间数据(地理坐标)

Blackjun / 3120人阅读

摘要:简介数据格式空间数据的文本标识空间数据的二进制标识基于对象表示法的地理空间信息数据交换格式的库提供了上述三种格式的相互转换函数配置添加依赖配置扩展创建删除扩展的移植脚本脚本内容执行移植插入数据轨迹点粤获取经纬度粤查询联系如何查询字段例

简介

数据格式

Abbr Fullname Description
WKT Well Known Text 空间数据的文本标识
WKB Well Known Binary 空间数据的二进制标识
GeoJSON GeoJSON 基于Javascript对象表示法的地理空间信息数据交换格式GeoJSON

Elixir 的 Geo 库提供了上述三种格式的相互转换函数.

配置

添加依赖

defp deps do
  [{:geo, "~> 1.0"}]
end

配置扩展

config :electric_proto, ElectricProto.Repo,
  adapter: Ecto.Adapters.Postgres,
  # loggers: [],
  # loggers: [{Ecto.LogEntry, :log, [:info]}],
  url: "postgres://postgres:root@localhost/geometry_db",
  extensions: [{Geo.PostGIS.Extension, library: Geo}]

创建/删除扩展的移植脚本

$ mix ecto.gen.migration enable_postgis
* creating priv/repo/migrations
* creating priv/repo/migrations/20160706021353_enable_postgis.exs

脚本内容

defmodule GeometryDb.Repo.Migrations.EnablePostgis do
  use Ecto.Migration

  def up do
    execute "CREATE EXTENSION IF NOT EXISTS postgis"
  end

  def down do
    execute "DROP EXTENSION IF EXISTS postgis"
  end
end

执行移植

mix ecto.migrate -r GeometryDb.Repo
插入数据
defmodule ElectricProto.Model.Contrail do
  @moduledoc """
  轨迹点
  """
  use ElectricProto.Model
  alias Ecto.DateTime, as: EctoDateTime
  alias Geo.Point

  @primary_key {:id, :id, autogenerate: true}

  schema "contrail" do
    field :station_id,        :string        
    field :electromobile_id,  :string        
    field :timestamp,         EctoDateTime   
    field :coordinates,       Point          

    timestamps
  end

  @spec insert(map) :: {:ok, Schema.t} | {:error, Changeset.t}
  def insert(map) do
    Map.merge(%__MODULE__{}, map) |> Repo.insert
  end

  def get(id) do
    Repo.get(__MODULE__, id)
  end

  def test_insert do
    row = %{
      station_id: "FC-R55M560100003",
      timestamp: EctoDateTime.from_erl({{2016,07,06},{13,34,30}}),
      electromobile_id: "粤A12345",
      coordinates: %Geo.Point{coordinates: {49.44, 17.87}}
      
    }
    insert(row)
  end

  @doc """
  获取经纬度
  http://lbs.qq.com/tool/getpoint/index.html
  """
  def test_insert2 do
    t = DateTime.utc_now
    row = %{
      station_id: "FC-R55M560100003",
      timestamp: EctoDateTime.from_erl({{t.year, t.month, t.day},{t.hour, t.minute, t.second}}),
      electromobile_id: "粤A12345",
      coordinates: Geo.WKT.decode("POINT(29.608279 106.500773)")
    }
    insert(row)
  end
  
  def test_get do
    get 1
  end
end
查询

联系如何查询GEO字段

例子: 查询运动轨迹 例子: 在地图上绘制轨迹

通过前一个例子查询到的坐标点的集合, 可以调用地图API绘制一条线路, 这条线路就是目标的运动轨迹.

使用案例

汽车跟踪防盗

船舶跟踪

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38949.html

相关文章

  • Elixir Ecto: 模型的嵌入(Embed)

    摘要:及其以上版本可以存储类似这样的非结构化数据作为一个的数据封装器提供了这些非结构话的数据到原生数据类型的序列化和反序列化嵌入的记录具有所有常规模型所具有的东西比如结构化的字段生命周期回调变更集下面研究如何把结构嵌入到模型当中使用嵌入单个结构可 Postgres 9.4 及其以上版本可以存储类似 arrays, json, jsonb 这样的非结构化数据. Ecto 作为一个 Elixir...

    ningwang 评论0 收藏0
  • Elixir Ecto: 在Postgresql中插入二进制数据

    摘要:本文以用一个在数据库中保存图片信息为例展示如何向中插入二进制数据首先我们要知道中唯一一种二进制数据的类型为表示字节数组或字节序列对应于和中的下面是一个示例迁移脚本这里也可以为实际上在执行数据库中字段的类型就是当然除了图片文件以外你还 本文以用一个在数据库中保存图片信息为例, 展示如何向 Postgresql 中插入二进制数据. showImg(https://segmentfault....

    CarterLi 评论0 收藏0
  • Elixir Ecto: 在Postgres中使用UUID类型的主键

    摘要:使用作为主键的目的降低类型这种自增线性特征作为随机生成的字符串让更离散增强系统的反爬虫能力至少避免通过的线性增加来爬取内容这种最简单的爬取方式使用主键的是那种方式各有优缺点可按实际需求自行权衡在应用程序中生成并插入到数据库通过使用扩展自动生 使用UUID作为主键的目的 降低Serial类型这种自增ID线性特征, UUID作为随机生成的字符串, 让ID更离散, 增强系统的反爬虫能力(至...

    OnlyLing 评论0 收藏0
  • Elixir Ecto: PostgreSQL大自增长主键的设置

    摘要:要解决的问题数据库中存储的行数超过了类型所能容纳的数量因此需要采用类型的整数作为主键的取值范围为到的取值范围为到完整的字段的数据类型可以参考这里迁移脚本要点的参数要设置为通过宏指定主键列类型为模型的声明要点主键要声明为类型完 要解决的问题 数据库中存储的行数超过了 serial 类型所能容纳的数量, 因此需要采用 bigserial 类型的整数作为主键serial 的取值范围为: 1...

    yvonne 评论0 收藏0
  • 【戴嘉乐】基于IPFS和GeoHash构建具有地理位置价值服务的DDApp(理论篇)

    摘要:数据将具有如下个特点将二维的经纬度转换成字符串,比如下图展示了北京个区域的字符串,分别是,等等,每一个字符串代表了某一矩形区域。例如,坐标对,位于北京安定门附近,后形成的值为。 作者简介:戴嘉乐( Mr.Maple ) | 前百度高级研发工程师 | IPFS应用实践者&布道师|个人网站:https://www.daijiale.cn联系方式:微信号:daijiale6239。 show...

    lmxdawn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<