Как создать полигон RGeo в Ruby из WKT, когда полигон имеет ошибки

Я работаю с базой данных MySQL с полигонами, хранящимися в формате WKT. Многие полигоны в базе данных имеют повторяющиеся точки (например, в приведенном ниже примере точка -122,323502 47,600959 повторяется три раза).

При попытке вызвать RGeo::Cartesian::Factory.parse_wkt() для этих полигонов, результат равен нулю.

Как я могу создать объекты RGeo из этих многоугольников, не изменяя данные многоугольника.

poly = "MULTIPOLYGON(((-122.362163 47.618641,-122.344621 47.592555,-122.332017 47.592458,-122.32748 47.59241,-122.326109 47.592652,-122.324738 47.592895,-122.323147 47.593478,-122.321412 47.59411,-122.320826 47.594984,-122.320669 47.596296,-122.321149 47.598627,-122.323502 47.600959,-122.323502 47.600959,-122.323502 47.600959,-122.324071 47.601688,-122.320757 47.601688,-122.32073 47.604262,-122.320767 47.607663,-122.320746 47.609703,-122.320723 47.611938,-122.320714 47.612812,-122.320772 47.614075,-122.320799 47.618495,-122.362163 47.618641)))"

parsed_poly = RGeo::Cartesian::Factory.new().parse_wkt(poly)

=>nil

2 ответа

Попробуй это:

RGeo::Geos.factory(:srid => 4326).parse_wkt(wkt_string)
polygon = RGeo::Geographic.spherical_factory.parse_wkt(params[:polygon])

работает для меня! Я использую рельсы + MySQL

Сначала я попытался создать запись места в Rails следующим образом:

@place = Place.new(params)

Кстати, мое место таблицы выглядит так:

`polygon` polygon DEFAULT NULL,
`latlon` point DEFAULT NULL,

Итак, сначала я попытался сделать все в Model, и надеюсь, что rgeo автоматически изменит полигон и латлон из текста в геометрию и сохранит в mysql как шарм. И это сработало на latlon, так как это Point Type. Вот что я добавляю на place.rb

self.rgeo_factory_generator = RGeo::Geos.method(:factory)
set_rgeo_factory_for_column(:latlon, RGeo::Geographic.spherical_factory)
set_rgeo_factory_for_column(:polygon, RGeo::Geographic.spherical_factory)

К сожалению, тип полигона не работает.

И я нашел это на rgeo / reographic / interface.rb

Эта реализация не реализует некоторые из более сложных геометрических операций. Особенно:

  • Реляционные операторы, такие как Feature::Geometry#intersects? не реализованы для большинства типов.
  • Реляционные конструкторы, такие как Feature::Geometry#union не реализованы для большинства типов.
  • Вычисления буфера, выпуклой оболочки и огибающей не реализованы для большинства типов. Границы доступны за исключением GeometryCollection,
  • Расчет длины возможен, а области нет. Расстояния доступны только между точками.
  • Оценка равенства и простоты применяется для некоторых, но не для всех типов.
  • Утверждения для полигонов и мультиполигонов не выполняются.

ХОРОШО. Поэтому мне нужно сделать это самому. Я попробовал следующее, но не работает.

polygon = RGeo::Geographic.spherical_factory.parse_wkt(params[:polygon])
params[:polygon] = polygon
@place = Place.new(place_params)
@place.save

Но это сработало!

polygon = RGeo::Geographic.spherical_factory.parse_wkt(params[:polygon])
@place.polygon = polygon
@place.save

Я думаю, что, возможно, ActiveRecord не может работать одновременно с объектами другого типа и полигона!

Другие вопросы по тегам