2013-03-18 14 views
5

Pracuję z bazą danych MySQL z wielokątów zapisanych w formacie WKT. Wiele wielokątów w bazie danych ma zduplikowane punkty (np. W poniższym przykładzie punkt -122.323502 47.600959 powtarza się trzy razy).Jak stworzyć RGEO wielokąt w Ruby od WKT gdy wielokąt zawiera błędy

Kiedy próbuje zadzwonić RGEO :: :: Factory.parse_wkt kartezjański() na tych wielokątów, wynik jest zero.

Jak mogę utworzyć obiekty RGEO z tych wielokątów, bez modyfikowania danych wielokąta.

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

"Kartezjański" oznacza współrzędne x/y ("płasko-ziemne", euklidesowe). Mijasz współrzędne geograficzne ("zakrzywiona ziemia", eliptyczne). Używasz niewłaściwej fabryki. –

Odpowiedz

6

Spróbuj tego:

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

Wiem, że jest też 'RGeo :: Geographic.spherical_factory (: srid => 4326)' ale nie wiem wystarczająco dużo o RGeo, aby być na 100% pewnym, że jest różnica. – daybreaker

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

działa na mnie! Używam szyn + mysql

pierwszy próbował utworzyć rekord miejsce w Rails takiego:

@place = Place.new(params) 

Btw, moje miejsce tabeli jest tak:

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

Więc najpierw próbowałem zrobić wszystko w modelu i mam nadzieję, że rgeo automatycznie zmieni wielokąt i latlon z tekstu na geometrię i zaoszczędzi w mysql jak czar. I działało to w Latlon, ponieważ jest to typ Point. Oto co mogę dodać do 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) 

Niestety Polygon typ nie działa.

I znalazłem to na RGEO/reographic/interface.rb

Ta implementacja nie realizuje niektóre z bardziej zaawansowanych

# 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. Więc muszę to zrobić sam. Próbowałem następujące, ale nie działa.

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

Ale zadziałało!

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

Myślę, że ActiveRecord może nie radzić sobie z innymi obiektami typu i wielokątów w tym samym czasie!

Powiązane problemy