7

我正在使用以 WKT 格式存储多边形的 MySQL 数据库。数据库中的许多多边形都有重复的点(例如,在下面的示例中,点 -122.323502 47.600959 重复了 3 次)。

当尝试在这些多边形上调用 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
4

2 回答 2

8

尝试这个:

RGeo::Geos.factory(:srid => 4326).parse_wkt(wkt_string)
于 2013-08-31T06:23:49.403 回答
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 会自动将多边形和纬度从文本更改为几何图形,并像魅力一样保存在 mysql 中。它确实在 latlon 工作,因为它是一个类型。这是我添加到 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 不能同时处理其他类型和多边形对象!

于 2017-02-10T01:43:36.370 回答