3

Ich schreibe eine App, die ich versuche, einige allgemeine Geolocation-Funktionen zu integrieren, einschließlich der Speicherung einiger Breiten-/Längenkoordinaten als Punkt in einer Datenbank. Damit soll dem Benutzer ermöglicht werden, entweder seinen Standort (vom Gerät zur Verfügung gestellt) oder einen Google-Map-Marker zur Auswahl seiner Koordinaten zu verwenden. Es ist mir gelungen, die Koordinaten von der Karte oder dem Gerät zu erhalten, aber ich habe Probleme, jetzt einen Punkt von ihnen zu erstellen, um in die Datenbank zu speichern.RGeo Fehler beim Erstellen eines Punktes von lat/lon

ich die Dokumentation gelesen haben und versucht, indem diesen Code zu meiner meiner initializer:

initializer/rgeo.rb

require 'rgeo-activerecord' 

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| 
    # By default, use the GEOS implementation for spatial columns. 
    config.default = RGeo::Geos.factory_generator 

    # But use a geographic implementation for point columns. 
    config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point") 
end 

Gemfile:

gem 'activerecord-postgis-adapter' 

gem 'rgeo' 

gem 'rgeo-activerecord' 

Migration:

def change 
add_column :monuments, :grid_ref, :point, geographic: true 
end 

ich diesen Fehler in der Schienen-Konsole erhalten, wenn Sie einen Punkt zu erstellen versuchen:

irb(main):004:0> m.grid_ref = "POINT(-122.193963 47.675086)" 
ArgumentError: invalid value for Float(): "POINT(-122.193963 47.675086)" 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/oid/point.rb:20:in `Float' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/oid/point.rb:20:in `block in type_cast' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/oid/point.rb:20:in `map' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/oid/point.rb:20:in `type_cast' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/oid/point.rb:18:in `type_cast' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/type/value.rb:23:in `type_cast_from_database' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/type/mutable.rb:5:in `type_cast_from_user' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute.rb:100:in `type_cast' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute.rb:42:in `original_value' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute.rb:37:in `value' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute.rb:46:in `value_for_database' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute_methods/dirty.rb:164:in `store_original_raw_attribute' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute_methods/dirty.rb:93:in `write_attribute' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/attribute_methods.rb:50:in `__temp__76279646f5275666' 
    from (irb):4 
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/commands/console.rb:110:in `start' 
... 9 levels... 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/commands/rails.rb:6:in `call' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/command_wrapper.rb:38:in `call' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application.rb:185:in `block in serve' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application.rb:156:in `fork' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application.rb:156:in `serve' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application.rb:131:in `block in run' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application.rb:125:in `loop' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application.rb:125:in `run' 
    from /usr/local/lib/ruby/gems/2.2.0/gems/spring-1.6.4/lib/spring/application/boot.rb:18:in `<top (required)>' 
    from /usr/local/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from /usr/local/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require' 

ich nach der Lektüre this Demonstration dieses Ansatzes hat was darauf schließen lässt, dass das Modell implizit WKT String versteht, dessen Umwandlung intern auf einen „Punkt " Objekt.

+0

Haben Sie das Problem gelöst? Meine Schienen sind ziemlich rostig und ich habe auch Probleme, ein Punktobjekt zu erstellen ... Werde hier wieder posten, wenn ich eine Lösung finde ... Ich habe einige ähnliche Lösungen für die Antwort unten versucht, aber noch nichts gefunden funktioniert bis jetzt. – dave

Antwort

0

Die Lösung gefunden. SRID muss angegeben werden, geographic_factory ist jetzt spherical_factory und der Punkt ist eine Methode, die in der sphärischen Factory der angegebenen SRID aufgerufen wird.

Zur Zeit habe ich die folgende Hilfsmethode implementiert, die mit Rails 4.2.6, Postgis und Postgresql funktioniert.

Bitte beachten Sie, dass die Fabrik der Parameter zuerst :) Länge nimmt vorwärts

def set_latlon(lat, lng) 

    factory = RGeo::Geographic.spherical_factory(srid: 4326) 

    # NOTE: this method takes the LNG parameter first! 
    self.latlon = factory.point(lng, lat) 

end 

Umzug, wenn Sie die gleiche räumliche Konfiguration Tutorial folgen, die ich bin, werden Sie feststellen, dass die Zeile in dieser erstellt Weg wird fehlschlagen. Ich adressierte dies, indem ich die Spalte :point durch die Spalte :geographic ersetzte. Der Migrationscode ist unten.

class Location < ActiveRecord::Migration 
    def change 
    remove_column :locations, :latlon # formerly of type :point 
    add_column :locations, :latlon, :geography, limit: {:srid=>4326, :type=>"point", :geographic=>true}, null: false 
    end 
end 
0

Verwenden st_point, nicht point als Typ:

add_column :monuments, :grid_ref, :st_point, geographic: true 

Postgresql hat einen point Typ, so der Typname in der postgis Adapter st_point geändert wurde.

Siehe https://github.com/rgeo/activerecord-postgis-adapter#point-and-polygon-types-with-activerecord-42:

Vor der Version 3 wurden die Punkt- und Polygon-Typ unterstützt. In ActiveRecord 4.2, der Postgresql-Adapter hinzugefügt Unterstützung für die nativen PostgreSQL Punkt und Polygon-Typen, die mit diesem Typen des gleichen Namens Konflikt. Der PostGIS-Punkttyp muss als st_point referenziert werden, und der PostGIS-Polygontyp muss als st_polygon referenziert werden.

Verwandte Themen