当一个多边形存在错误时,如何在Ruby中从WKT创建RGeo多边形

9
我正在使用存储在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

"Cartesian" 意味着 x/y(“平面地球”,欧几里得)坐标系。您正在传入地理坐标(“曲面地球”,椭圆形)。您正在使用错误的工厂。 - boulder_ruby
2个回答

10

试试这个:

RGeo::Geos.factory(:srid => 4326).parse_wkt(wkt_string)

1
我知道还有RGeo::Geographic.spherical_factory(:srid => 4326),但我对RGeo的了解不足以百分之百确定是否有区别。 - daybreaker

1
polygon = RGeo::Geographic.spherical_factory.parse_wkt(params[:polygon])

works for me!我正在使用rails + mysql
首先,我尝试像这样在Rails中创建地点记录:
@place = Place.new(params)

顺便说一下,我的表格是这样的:

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

首先,我尝试在模型中完成所有操作,并希望rgeo自动将文本转换为几何多边形和经纬度,并像魔法一样保存在mysql中。对于经纬度,它确实起作用,因为它是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)

很遗憾,Polygon 类型不起作用。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接