【问题标题】:Add geometry field to PostGIS with Rails使用 Rails 将几何字段添加到 PostGIS
【发布时间】:2015-10-05 02:35:19
【问题描述】:

我有一个数据库,其中有一个名为地址的表。我想添加一个几何字段。我可以在 pgAdmin 中执行此操作,但不确定它如何与 Rails 一起使用。

我认为 sql 会是:

ALTER TABLE addresses ADD geom geometry(Point,4326)

那我就想跑了

UPDATE addresses SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);

我可以在 Rails 中执行此操作还是必须在 pgAdmin(或 psql)中执行此操作?

谢谢。新手迷失在混合多个应用程序的复杂性中。

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-4 gis postgis


    【解决方案1】:

    你正在使用这个 gem activerecord-postgis-adapter 吗?如果没有,您可以使用它,然后您可以在迁移文件中添加 geometry 列:

    create_table :my_spatial_table do |t|
      t.column :shape1, :geometry
    end
    

    或:

    create_table :my_spatial_table do |t|
      t.geometry :shape2
    end
    

    activerecord-postgis-adapter 扩展了ActiveRecord 的迁移语法以支持某些空间类型,例如geometry。因此,您可以像使用其他内置类型(stringdateinteger 等)一样在 Rails 迁移中无缝使用 geometry 类型,同时使用此 gem。

    有关更多信息和示例,请参阅 gem 文档中的 Creating Spatial Tables 部分。

    【讨论】:

    • 感谢两位的回答。我必须回去看看我是否有适配器。我肯定做了一些 PostGIS 初始化。我需要一些时间来整理它。而且我需要更仔细地阅读空间表参考。
    • 我阅读了关于 rGeo 的文章,不想再增加一层复杂性。我正在努力的教程并没有要求它ngauthier.com/2013/08/postgis-and-rails-a-simple-approach.html。而且我需要更仔细地阅读创建空间表参考。感谢您的建议。
    【解决方案2】:

    我没有在我的数据库中创建 postgis 扩展(一个严重的错误并造成了一些无法正常工作的挫败感)。访问我的数据库 在命令行中从 psql 输入

    \c my_database_name

    然后在 psql 中再次

    create extension postgis

    在 Rails 中,我必须添加正确的列(可以在创建数据库时完成),这是 @K M Rakibul Islam 建议的一部分。

    add_column :addresses, :geom, :geometry

    现在我们有了geometry 类型的列geom。下一步超出了我的要求,但它是它通往的地方。有经度和纬度是不够的。因为我知道语法,所以我在 pgAdmin 中执行此操作,但如果我通过 Rails 完成它会更好。

    UPDATE addresses SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);

    我现在需要查看 geom 字段是否正确。但这不是这个线程的一部分。

    【讨论】:

      【解决方案3】:

      在使用 Rails 3.1 时,您有 PostGIS geometry 数据类型的表。这些似乎与rake db:schema:dumprake db:test:clonerake test:* 任务不兼容。

      首先,您需要一个支持 PostGIS 功能的 PostgreSQL 模板。

      创建模板数据库

      $ psql -U postgres
      > CREATE DATABASE template_postgis WITH TEMPLATE=template1 ENCODING='UTF8';
      > \c template_postgis;
      > CREATE LANGUAGE plpgsql;
      

      将必要的 PostGIS 函数加载到模板中(我使用的是 Homebrew,因此请找到 PostGIS SQL 文件的路径):

      $ psql -f /usr/local/share/postgis/postgis.sql template_postgis
      $ psql -f /usr/local/share/postgis/spatial_ref_sys.sql template_postgis
      

      将数据库设置为模板并授予权限:

      $ psql -U postgres template_postgis
      > UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template_postgis';
      > GRANT ALL ON geometry_columns TO PUBLIC;
      > GRANT ALL ON spatial_ref_sys TO PUBLIC;
      

      然后,将 gem postgis_adapter 添加到您的 Gemfile 并运行 bundle。之后添加模板:template_postgis 到您的config/database.yml,如下所示:

      development:
        adapter: postgresql
        template: template_postgis
        database: postgis_db
      

      【讨论】:

      • 我正在运行 Rails 4.2.4。我确实有 ```adaptor:postgresql```` 但没有模板和数据库集。但我必须看看这是否在 4.2.4 中有所改变。正如我在回复@K M Rakibul Islam 时指出的那样,我还有一些学习要做。
      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 2017-12-18
      • 2011-08-22
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多