2013-03-18 46 views
5

Tôi đang làm việc với cơ sở dữ liệu MySQL với đa giác được lưu trữ ở định dạng WKT. Nhiều đa giác trong cơ sở dữ liệu có các điểm trùng lặp (ví dụ: trong ví dụ bên dưới, điểm -122.323502 47.600959 được lặp lại ba lần).Cách tạo đa giác RGeo trong Ruby từ WKT khi đa giác có lỗi

Khi cố gắng gọi RGeo :: Cartesian :: Factory.parse_wkt() trên các đa giác này, kết quả là không.

Làm cách nào để tạo đối tượng RGeo từ các đa giác này mà không sửa đổi dữ liệu đa giác.

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

"Descartes" có nghĩa là tọa độ x/y ("phẳng đất", euclide). Bạn đang đi qua các tọa độ địa lý ("cong-earth", elliptical). Bạn đang sử dụng sai nhà máy. –

Trả lời

6

Hãy thử điều này:

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

Tôi biết cũng có 'RGeo :: Geographic.spherical_factory (: srid => 4326)' nhưng tôi không biết đủ về RGeo để chắc chắn 100% có sự khác biệt. – daybreaker

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

công trình đối với tôi! Tôi đang sử dụng đường ray + mysql

Đầu tiên tôi đã cố gắng để tạo ra các kỷ lục diễn ra trong Rails như thế này:

@place = Place.new(params) 

Btw, bảng vị trí của tôi là như thế này:

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

Vì vậy, lần đầu tiên tôi đã cố gắng để làm tất cả mọi thứ trong mô hình và hy vọng rgeo sẽ tự động thay đổi đa giác và latlon từ văn bản sang hình học và lưu trong mysql như một sự quyến rũ. Và nó đã làm việc tại latlon vì nó là một Điểm Loại. Dưới đây là những gì tôi thêm vào 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) 

Thật không may, Polygon loại không hoạt động.

Và tôi thấy điều này trên rgeo/reographic/interface.rb

thực hiện này không thực hiện một số tiên tiến hơn

# 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. Vì vậy, tôi cần phải tự mình làm. Tôi đã thử những điều sau nhưng không hoạt động.

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

Nhưng điều này đã hiệu quả!

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

Tôi nghĩ có thể ActiveRecord không thể xử lý cả đối tượng loại và đa giác cùng một lúc!