2013-03-18 13 views
5

Ich arbeite mit einer MySQL-Datenbank mit Polygonen im WKT-Format gespeichert. Viele Polygone in der Datenbank haben doppelte Punkte (z. B. im folgenden Beispiel wird der Punkt -122.323502 47.600959 dreimal wiederholt).Wie RGeo Polygon in Ruby von WKT zu erstellen, wenn das Polygon Fehler hat

Beim Versuch, RGeo :: Cartesian :: Factory.parse_wkt() für diese Polygone aufzurufen, ist das Ergebnis null.

Wie kann ich RGeo-Objekte aus diesen Polygonen erstellen, ohne die Polygondaten zu ändern.

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

"Kartesisch" bedeutet x/y ("flache Erde", euklidische) Koordinaten. Du gibst geografische Koordinaten ("curved-earth", elliptisch) ein. Du verwendest die falsche Fabrik. –

Antwort

6

Versuchen Sie folgendes:

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

Ich weiß, es gibt auch 'RGeo :: Geographic.spherical_factory (: srid => 4326)' aber ich weiß nicht genug über RGeo, um 100% sicher zu sein, dass es einen Unterschied gibt. – daybreaker

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

Werke für mich! Ich bin mit Schienen + mysql

Zuerst habe ich versucht, den Platz Rekord in Rails wie diese zu erstellen:

@place = Place.new(params) 

Btw, ist mein Platz Tabelle wie folgt aus:

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

Also zuerst habe ich versucht, alles in Model zu tun und hoffe, dass rgeo Polygon und Latlon automatisch von Text zu Geometrie ändert und in mysql wie ein Zauber speichert. Und es hat bei Latlon funktioniert, wie es ein Point Typ ist. Hier ist, was ich

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) 

Leider place.rb hinzufügen Polygon Typ funktioniert nicht.

Und ich fand dies auf RGEO/reographic/interface.rb

Diese Implementierung nicht implementiert einige der fortgeschritteneren

# geometric operations. In particular: 
    # 
    # * Relational operators such as Feature::Geometry#intersects? are 
    # not implemented for most types. 
    # * Relational constructors such as Feature::Geometry#union are 
    # not implemented for most types. 
    # * Buffer, convex hull, and envelope calculations are not 
    # implemented for most types. Boundaries are available except for 
    # GeometryCollection. 
    # * Length calculations are available, but areas are not. Distances 
    # are available only between points. 
    # * Equality and simplicity evaluation are implemented for some but 
    # not all types. 
    # * Assertions for polygons and multipolygons are not implemented. 

OK. Also muss ich es selbst machen. Ich habe folgendes versucht, aber nicht gearbeitet.

polygon = RGeo::Geographic.spherical_factory.parse_wkt(params[:polygon]) 
params[:polygon] = polygon 
@place = Place.new(place_params) 
@place.save 

Aber das hat funktioniert!

Ich denke vielleicht ActiveRecord kann nicht gleichzeitig mit anderen Typ und Polygon-Objekt umgehen!