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

前端之家收集整理的这篇文章主要介绍了Elixir Ecto: 使用Geo库操作空间数据(地理坐标)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

简介

数据格式

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

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

配置

添加依赖

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

配置扩展

@H_404_62@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}]

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

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

脚本内容

@H_404_62@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

执行移植

@H_404_62@mix ecto.migrate -r GeometryDb.Repo

插入数据

@H_404_62@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}}),coordinates: Geo.WKT.decode("POINT(29.608279 106.500773)") } insert(row) end def test_get do get 1 end end

查询

联系如何查询GEO字段

例子: 查询运动轨迹

例子: 在地图上绘制轨迹

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

使用案例

  • 汽车跟踪防盗

  • 船舶跟踪

猜你在找的Postgre SQL相关文章