Почему я вижу большое расхождение между расстояниями, рассчитанными с помощью SRID 4326 и 3785?

Я читаю серию блогов Daniel Azuma о Geo-Rails и наткнулся на раздел, который пытаюсь воспроизвести, но с другим SRID. В частности, я ссылаюсь на http://blog.daniel-azuma.com/archives/69 и раздел Работа с данными о местоположении.

У Даниэля Азумы есть таблица locations с атрибутом latlon:

class CreateLocations < ActiveRecord::Migration
  def change
    create_table :locations do |t|
      t.string :name
      t.point :latlon, :geographic => true
      t.timestamps
    end
  end
end

Соответствующий класс Location использует spherical_factory с SRID 4326:

class Location < ActiveRecord::Base
  set_rgeo_factory_for_column(:latlon,
    RGeo::Geographic.spherical_factory(:srid => 4326))
end

Создаются две примерные точки и определяется расстояние между ними:

ruby-1.9.3-p0 :001 > loc = Location.create
ruby-1.9.3-p0 :003 > loc.latlon = "POINT(-122.193963 47.675086)"
ruby-1.9.3-p0 :005 > loc2 = Location.create(:name => 'Space Needle',
                        :latlon => 'POINT(-122.349341 47.620471)')
ruby-1.9.3-p0 :006 > puts "Distance is %.02f meters" %
                      loc.latlon.distance(loc2.latlon)
Distance is 13143.18 meters

Я делаю что-то похожее, но получаю совершенно другой результат (более 6 километров разницы).

Я использую SRID 3785, но у меня сложилось впечатление, что если я выполню соответствующее преобразование из долготы/широты (4326) в 3785, результаты должны быть довольно близкими:

class AddGeopointToLocations < ActiveRecord::Migration
  def change
    add_column :locations, :geopoint, :point, srid: 3785
    add_index :locations, :geopoint, spatial: true
  end
end

Моя модель Location:

class Location < ActiveRecord::Base

  RGEO_FACTORY = RGeo::Geographic.simple_mercator_factory

  set_rgeo_factory_for_column(:geopoint, RGEO_FACTORY.projection_factory)

  def geopoint_geographic
    RGEO_FACTORY.unproject(self.geopoint)
  end
  def geopoint_geographic=(value)
    self.geopoint = RGEO_FACTORY.project(value)
  end

end

Установите точки через parse_wkt и рассчитайте расстояние:

2.0.0p247 :001 > loc.geopoint_geographic = 
            ::Location::RGEO_FACTORY.parse_wkt("POINT (-122.193963 47.675086)")
2.0.0p247 :002 > loc2.geopoint_geographic = 
            ::Location::RGEO_FACTORY.parse_wkt("POINT (-122.349341 47.620471)")
2.0.0p247 :003 > loc.geopoint.distance(loc2.geopoint)
 => 19509.352351913036

Установите точки через point и рассчитайте расстояние:

2.0.0p247 :004 > loc.geopoint_geographic = 
            ::Location::RGEO_FACTORY.point(-122.193963, 47.675086)
2.0.0p247 :005 > loc2.geopoint_geographic = 
            ::Location::RGEO_FACTORY.point(-122.349341, 47.620471)
2.0.0p247 :006 > loc.geopoint.distance(loc2.geopoint)
 => 19509.352351913036

Мой результат — 19.5 kilometers, а результат Даниэля Азумы — 13.1. Почему такая большая разница? Я неправильно конвертирую?

Версии БД: PostgreSQL 9.3.1 и POSTGIS="2.1.0 r11822" GEOS="3.3.8-CAPI-1.7.8" PROJ="Rel. 4.8.0, 6 March 2012"


person user664833    schedule 09.12.2013    source источник


Ответы (1)


Единицы для популярной визуализации CRS Mercator (EPSG:3785 ) метры (м). Единицами для WGS84 (EPSG:4326) являются градусы.

person boulder_ruby    schedule 05.01.2015