我正在使用以WKT格式存储的多边形的MySQL数据库。数据库中的许多多边形具有重复点(例如,在下面的示例中,点-122.323502 47.600959重复三次)。
当试图在这些多边形上调用RGeo :: Cartesian :: Factory.parse_wkt()时,结果为nil。
如何在不修改多边形数据的情况下从这些多边形创建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
答案 0 :(得分:7)
试试这个:
RGeo::Geos.factory(:srid => 4326).parse_wkt(wkt_string)
答案 1 :(得分:1)
polygon = RGeo::Geographic.spherical_factory.parse_wkt(params[:polygon])
适合我!我正在使用rails + mysql
首先,我尝试在Rails中创建地方记录,如下所示:
@place = Place.new(params)
是的,我的位置表是这样的:
`polygon` polygon DEFAULT NULL,
`latlon` point DEFAULT NULL,
所以首先我尝试在模型中做所有事情并希望rgeo会自动将多边形和latlon从文本更改为几何并保存在mysql中,就像魅力一样。它确实在latlon工作,因为它是 Point 类型。这是我添加到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可能无法同时处理其他类型和多边形对象!