当多边形有错误时,如何在WKT中创建Ruby中的RGeo多边形

时间:2013-03-18 21:51:22

标签: mysql ruby gis polygon rgeo

我正在使用以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

2 个答案:

答案 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可能无法同时处理其他类型和多边形对象!