RGeo 0.5.2 и RGeo::CoordSys::SRSDatabase::ActiveRecordTable

Прежде всего, извините, если это действительно просто, но я просто не могу понять это. Я использую RGeo для преобразования между UTM и широтой/долготой, вот так;

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

 # create the coordinate factory for the relevant UTM zone
 utm_factory = RGeo::Cartesian.factory(:srid => srid,
                                       :srs_database => srs_database)
 utm_location = utm_factory.point(easting, northing)

 # create the standard WGS84 lat/long coordinate factory
 wgs84_proj4 = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
 wgs84_factory = RGeo::Geographic.spherical_factory(proj4: wgs84_proj4, :srid => 4326)

 # perform the UTM -> lat/long cast
 RGeo::Feature.cast(utm_location, :factory => wgs84_factory, :project => true)

Как видите, я использую RGeo::CoordSys::SRSDatabase::ActiveRecordTable.

Я только что обновился до RGeo 0.5.2 и заметил, что этот класс устарел.

Достаточно справедливо, но теперь я не уверен, что такое альтернативная методология... Я провел разведку и не могу найти подходящую документацию.

Кроме того, мой первоначальный метод всегда казался мне немного сложным - есть ли более простой способ выполнить преобразование UTM -> широта/долгота с помощью RGeo?

Заранее спасибо!

Бен


person benjimix    schedule 30.01.2016    source источник


Ответы (2)


Хорошо, на самом деле мне удалось решить это довольно быстро. Вот что сработало для меня:

 if hemisphere == 'S'
   srid = 32700 + number.to_i
   utm_proj4 = "+proj=utm +zone=#{zone} +south +datum=WGS84 +units=m +no_defs"
 else
   srid = 32600 + number.to_i
   utm_proj4 = "+proj=utm +zone=#{zone} +datum=WGS84 +units=m +no_defs"
 end

 # create both the UTM and lat / long factories (we will project between them)
 utm_factory = RGeo::Cartesian.simple_factory(srid: srid, proj4: utm_proj4)
 wgs84_factory = RGeo::Geographic.spherical_factory(srid: 4326, proj4: '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')

 # create the UTM location
 utm_location = utm_factory.point(easting, northing)

 # perform the UTM -> lat/long cast
 RGeo::Feature.cast(utm_location, :factory => wgs84_factory, :project => true)

Я создаю свои собственные фабрики на основе строк Proj4, которые я вытащил из таблицы spatial_ref_sys.

Я не уверен, что это «правильно», и может быть лучший способ сделать это.

Но я надеюсь, что это кому-то поможет! :)

person benjimix    schedule 30.01.2016
comment
Это было очень полезно!! Спасибо. Мне нужно обернуться вокруг этой фабричной схемы... - person Michael Pell; 06.04.2016

Другой подход к этому:

EPSG_4326 = RGeo::CoordSys::Proj4.new("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
EPSG_3857 = RGeo::CoordSys::Proj4.new("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")

RGeo::CoordSys::Proj4.transform(EPSG_3857, geom, EPSG_4326, RGeo::Geographic.spherical_factory)

Выдает новый RGeo::Geographic::SphericalPointImpl с соответствующими координатами.

person Michael Pell    schedule 06.04.2016
comment
Хороший! Это намного лаконичнее! - person benjimix; 06.04.2016