Как создать полигон 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 не может работать одновременно с объектами другого типа и полигона!