Попытка импортировать шейп-файл с помощью RGeo Ruby gem, слишком глубокий уровень стека

Я не знаю, связано ли это с каким-то взаимодействием внутри моего кода или, возможно, с соглашениями об именах внутри шейп-файлов, которые я использую, но следующий код приводит к сообщению Stack level too deep

def read_shapefile
  @shp_path = Dir[File.join( @tmp_path, '*.shp') ].first

  srs_database = RGeo::CoordSys::SRSDatabase::ActiveRecordTable.new

  factory = RGeo::Geos.factory(:srs_database => srs_database, :srid => 96805)
  #factory = RGeo::Geos::CAPIFactory.new
  cartesian_preferred_factory = LandUnit.rgeo_factory_for_column(:location)


  RGeo::Shapefile::Reader.open(@shp_path, factory: factory) do |file|
    file.each do |record|
      cartesian_cast = RGeo::Feature.cast(
          record.geometry, factory: cartesian_preferred_factory, project: true)

      cartesian_cast.each do |poly|
          lu = LandUnit.new
          lu.guid = record.attributes[@params['guid']].to_s
          lu.country_code =  @params['country_code']
          lu.location = poly    
          # error happens here!
          lu.save
      end
    end
  end
end

Миграции для модели:

class CreateLandUnits < ActiveRecord::Migration
  def change
    create_table :land_units do |t|
      t.string :country_code, null: false, index: true
      t.string :guid, index: true
      t.geometry :location, srid: 3785

      t.timestamps
    end
  end
end

Соответствующая часть schema.rb:

  create_table "land_units", force: true do |t|
    t.string   "country_code",                                          null: false
    t.string   "guid"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.spatial  "location",     limit: {:srid=>3785, :type=>"geometry"}
  end

  add_index "land_units", ["location"], :name => "index_land_units_on_location", :spatial => true

Обратная трассировка указывает на active_record/transactions.rb, строка 286:

def rollback_active_record_state!
  remember_transaction_record_state
  yield
rescue Exception
  restore_transaction_record_state
  raise    # HERE<<<
ensure
  clear_transaction_record_state
end

Все перепробовал. Любая помощь будет оценена по достоинству.

Изменить: если кого-то интересуют эти параметры, при неудачном вызове они разрешают guid: '6020048.00' и country_code: 'ca'.

Я также должен добавить, что журнал показывает это:

(0.1ms)  BEGIN
  SQL (0.6ms)  INSERT INTO "land_units" ("country_code", "created_at", "guid", "location", "updated_at") 
  VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["country_code", "ca"], ["created_at", "2015-03-23 20:59:38.771649"], ["guid", "6020048.00"], 
  ["location", "002000000300000ec90000000100000028c164b311c749d0be4049101977159301c164b311c7508b1140491022249508cfc164b311c7671af24049103f70c23377c164b311c785400940491065d156a4f5c164b311c78493be40491082fd398873c164b311c783e2024049109c841e4650c164b311c78327ba404910ae43343896c164b311c7810e65404910b976a8c3dfc164b311c77c6113404910cf2943e8c7c164b311c777d3ba404910e3e11b1b56c164b311c771ff68404910fdcea7cc13c164b311c7716ef74049110061ae5237c164b311c76d520940491113afcec9eec164b311c7631bad4049114313691234c164b311c75f336f40491154764b6b38c164b311c75249bb40491140bebb55fac164b311c749492e40491135844d8b3fc164b311c740bbbb4049112ae8b30272c164b311c737d9274049111f6444e7acc164b311c72f4d334049111430f7e5f3c164b311c726871640491108fa115ffac164b311c71e34d2404910fe160b0597c164b311c7151806404910f28d86b4f4c164b311c70ca8b0404910e7a793a963c164b311c705b232404910deb9fc574ac164b311c703a91d404910dc20d4806ac164b311c6fb1d64404910d0ed325688c164b311c6f290ef404910c605069167c164b311c6e9e83a404910bacf71a130c164b311c6e0cba9404910af46584a4fc164b311c6f115694049105a80074a79c164b311c6f69ca64049103bc8277f0fc164b311c6facd224049102626e4a97cc164b311c6fec1f340491011192ee217c164b311c703ca8a40490ff67dac4e4ac164b311c707dc6d40490fe171e94d20c164b311c70c6bce40490fc98cc82ecdc164b311c720cc5340490fe45c78305ac164b311c73527f340490ffe8cde5378c164b311c749d0be4049101977159301"], ["updated_at", "2015-03-23 20:59:38.771649"
  ]]
   (0.2ms)  ROLLBACK

SQL, который он показывает, отлично работает в консоли! Это безумие. Это наводит на мысль, что проблема в каком-то методе before_save, но я его не определил.


person gamut    schedule 23.03.2015    source источник
comment
Измените свой вопрос, включив в него и саму трассировку стека.   -  person das-g    schedule 26.06.2015


Ответы (1)


Думаю, я мог это понять. Этот код пространственной привязки "96805" не имеет записей на сайте spacereference.org. Я не говорю, что его не существует, но, вероятно, он упоминается в каком-то другом srid.

Однако вы можете отследить его, я полагаю, он существует, но на него ссылаются с помощью другого кода. Часто один и тот же код proj4 упоминается в нескольких ссылках SRID. В любом случае, для одного из ваших наборов шейп-файлов для этого загадочно спроецированного файла откройте файл *.prj в текстовом редакторе. Это покажет вам ваш proj4 код. Вы можете справиться с этим несколькими способами отсюда. Во-первых, вы можете скопировать этот код proj4 в Google и попытаться получить для него официальный srid, а затем перейти оттуда.

В качестве альтернативы вы можете напрямую использовать код proj4 для преобразования геометрии без какого-либо официального srid.

person boulder_ruby    schedule 07.01.2016