2012-10-31 2 views
5

Ich habe Rails mit , activerecord-postgis-adapter und rgeo-geojson läuft.Rendern als GeoJSON (oder wahlweise als WKT/WKB) mit MIME-Typen

Im Moment kann ich Standard-URLs "object.json" verwenden, um eine JSON-Zeichenfolge mit WKT/WKB-Format zu erhalten. Es sieht wie folgt aus:

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

Aber jetzt möchte ich einen benutzerdefinierten MIME-Typ haben, so kann ich „object.geojson“ nennen GeoJSON Format wie folgt zu erhalten:

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

Der einzige Weg, Ich stellte fest, dass der JSON-Encoder auf GeoJSON gesetzt wurde, um ihn global unter Verwendung von RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson) und RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt) zu setzen. Aber ich möchte es nur lokal setzen, ist das möglich?

Ich habe bereits Mime::Type.register "application/json", :geojson, %w(text/x-json application/jsonrequest)-mime_types.rb und es funktioniert gut: Ich habe diesen Code in meinem Controller verwenden kann:

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

Ich hoffe jemand kann mir sagen, wie man etwas bestimmtes Objekt GeoJSON zu machen, ohne die globale Einstellung JSON-Renderer zu :geojson. !?

EDIT:

Meine Objekte wie folgt aussehen in Rails-Konsole:

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

+0

GeoJSON ist JSON und seine richtige Medientyp " Anwendung/JSON. " Vielleicht eine völlig andere Sicht auf die GeoJSON-Daten? – sgillies

+0

Danke für deine Antwort: Aber es stellt sich immer noch die Frage: Wie kann ich JSON mit GeoJSON statt WKT generieren, ohne (!!) den globalen json_generator zu setzen? –

Antwort

9

Sie eine Fabrik, wie dies für eine bestimmte @object

factory = RGeo::GeoJSON::EntityFactory.instance 

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

Und kodieren können es:

RGeo::GeoJSON.encode feature 

Es sollte Ausgabe etwas wie folgt aus:

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

Oder eine Sammlung von Funktionen:

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

Giving:

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