#ruby-on-rails #postgresql #gis #postgis #latitude-longitude
Вопрос:
У меня есть простая таблица базы данных PostGIS, которая выглядит следующим образом:
create_table :blocked_search_regions do |t|
# use PostGIS
t.line_string :path, geographic: true
t.string :name
t.timestamps null: false
end
# PostGIS index
add_index :blocked_search_regions, :path, using: :gist
Я могу создать BlockedSearchRegion
, запустив что-то вроде:
linestring = "LINESTRING (48.0 -122.1, 47.74 -90.0, 47.52 -90.0, 47.35 -90.0)"
bsr = BlockedSearchRegion.create!(name: 'new region', path: linestring)
Насколько я понимаю, аргументы LINESTRING-это просто LAT LON. Кажется, это в основном работает… за исключением случаев, когда температура превышает -90 градусов. Координата -122.1
(или что-либо ниже -90 градусов) будет автоматически преобразована в -90.0
при BlockedSearchRegion
сохранении:
=> #<BlockedSearchRegion:
path: #<RGeo::Geographic::SphericalLineStringImpl:0x2b004c8535c8 "LINESTRING (48.0 -90.0, 47.74 -90.0, 47.52 -90.0, 47.35 -90.0)">,
name: "new region",
created_at: Thu, 03 Jun 2021 16:12:54 UTC 00:00,
updated_at: Thu, 03 Jun 2021 16:12:54 UTC 00:00>
Как мне ввести lat/lon за пределами 90 градусов?
У меня такое чувство, что это как-то связано с geographic: true
флагом на моей колонке таблицы.
Ответ №1:
В PostGIS порядок координат-сначала долгота, затем широта. Ваши координаты поменялись местами и, следовательно, недействительны.
Кстати, то, что происходит с координатами за пределами границ, сильно различается и может варьироваться от игнорирования проблемы, ограничения правильными границами, обхода земного шара, возвращения с полюса и т. Д
Комментарии:
1. Один из способов сохранить их прямыми (в любом случае, это хорошо сработало для меня). Долгота измеряется с Востока на Запад и соответствует координате x в декартовой плоскости. Широта измеряется к северу/югу от экватора и соответствует координате y в декартовой плоскости.