2012-10-31 6 views
5

Ho Rails con , activerecord-postgis-adapter e rgeo-geojson in esecuzione.Render come GeoJSON (o selettivamente come WKT/WKB) utilizzando i tipi MIME

Al momento posso utilizzare gli URL "object.json" predefiniti per ottenere una stringa JSON con il formato WKT/WKB. Ecco come si presenta:

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

Ma ora voglio avere un costume MIME-Type, così posso chiamare "object.geojson" per ottenere formato GeoJSON come questo:

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

L'unico modo Ho trovato che impostare il codificatore JSON su GeoJSON era di impostarlo globalmente usando RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson) e RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt). Ma voglio solo impostarlo localmente, è possibile?

ho già aggiunto Mime::Type.register "application/json", :geojson, %w(text/x-json application/jsonrequest)-mime_types.rb e funziona bene: posso utilizzare questo codice in mio controller:

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

spero che qualcuno mi può dire come rendere un oggetto specifico per GeoJSON senza impostare il mondiale Renderer JSON per :geojson. !?

EDIT:

miei oggetti simile a questa in Rails Console:

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

+0

GeoJSON è JSON e il suo tipo di supporto corretto è " application/json ". Forse consideri una visione completamente diversa per i dati di GeoJSON? – sgillies

+0

Grazie per la tua risposta: Ma c'è ancora la domanda: come posso generare JSON con GeoJSON invece di WKT senza (!!) impostando il json_generator globale? –

risposta

9

È possibile utilizzare una fabbrica come questo per una specifica @object

factory = RGeo::GeoJSON::EntityFactory.instance 

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

e codificare it:

RGeo::GeoJSON.encode feature 

Dovrebbe uscita qualcosa di simile:

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

o un insieme di caratteristiche:

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

Dare:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "type": "Feature", 
     # the rest of the feature... 
    }, 
    { 
     "type": "Feature", 
     # another feature... 
    } 
}