2012-10-31 23 views
5

Tôi có Rails với , activerecord-postgis-adapterrgeo-geojson đang chạy.Hiển thị dưới dạng GeoJSON (hoặc có chọn lọc là WKT/WKB) bằng MIME-Types

Hiện tại tôi có thể sử dụng URL "object.json" mặc định để nhận chuỗi JSON có định dạng WKT/WKB. Nó trông giống như thế này:

{"description":null,"id":1,"position":"POINT (10.0 47.0)"} 

Nhưng bây giờ tôi muốn có một tùy chỉnh MIME-Type, vì vậy tôi có thể gọi là "object.geojson" để có được định dạng GeoJSON như thế này:

{"description":null,"id":1,"position":{"type":"Point","coordinates": [10.0, 47.0]}} 

Cách duy nhất Tôi tìm thấy để đặt bộ mã hóa JSON thành GeoJSON là đặt nó trên toàn cầu bằng cách sử dụng RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson)RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt). Nhưng tôi chỉ muốn đặt nó cục bộ, điều này có khả thi không?

tôi đã thêm Mime::Type.register "application/json", :geojson, %w(text/x-json application/jsonrequest)-mime_types.rb và nó hoạt động tốt: Tôi có thể sử dụng mã này trong bộ điều khiển của tôi:

respond_to do |format| 
    format.json { render json: @object } 
    format.geojson { render text: "test" } 
end 

Tôi hy vọng ai đó có thể cho tôi biết làm thế nào để làm cho một số đối tượng cụ thể để GeoJSON mà không cần thiết lập toàn cầu Trình kết xuất JSON đến :geojson. !?

EDIT:

Đối tượng của tôi trông như thế này trong Rails Console:

#<Anchor id: 1, description: nil, position: #<RGeo::Geos::CAPIPointImpl:0x3fc93970aac0 "POINT (10.0 47.0)">>

+0

GeoJSON là JSON và loại phương tiện truyền thông thích hợp của nó là " ứng dụng/json. " Có lẽ xem xét một cái nhìn hoàn toàn khác cho dữ liệu GeoJSON? – sgillies

+0

Cảm ơn câu trả lời của bạn: Nhưng vẫn còn câu hỏi: Làm thế nào tôi có thể tạo JSON với GeoJSON thay vì WKT mà không (!!) thiết lập json_generator toàn cầu? –

Trả lời

9

Bạn có thể sử dụng một nhà máy như thế này cho một cụ thể @object

factory = RGeo::GeoJSON::EntityFactory.instance 

feature = factory.feature(@object.position, nil, { desc: @object.description}) 

Và mã hóa nó:

RGeo::GeoJSON.encode feature 

Nó nên đầu ra một cái gì đó như thế này:

{ 
    "type" => "Feature", 
    "geometry" => { 
    "type" => "Point", 
    "coordinates"=>[1.0, 1.0] 
    }, 
    "properties" => { 
    "description" => "something" 
    } 
} 

Hoặc một tập hợp các tính năng:

RGeo::GeoJSON.encode factory.feature_collection(features) 

Giving:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "type": "Feature", 
     # the rest of the feature... 
    }, 
    { 
     "type": "Feature", 
     # another feature... 
    } 
} 
Các vấn đề liên quan