2012-10-31 8 views
5

Mam uruchamiane Railsy z , activerecord-postgis-adapter i rgeo-geojson.Renderuj jako GeoJSON (lub wybiórczo jako WKT/WKB) przy użyciu typów MIME

W tej chwili mogę użyć domyślnych adresów URL "object.json", aby uzyskać łańcuch JSON z formatem WKT/WKB. Wygląda to tak:

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

Ale teraz chcę mieć niestandardowego typu MIME, więc mogę nazwać „object.geojson”, aby uzyskać formatu GeoJSON tak:

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

Jedynym sposobem Zauważyłem, że ustawiłem koder JSON na GeoJSON, aby ustawić go globalnie przy użyciu RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson) i RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt). Ale chcę tylko ustawić to lokalnie, czy to możliwe?

ja już dodane Mime::Type.register "application/json", :geojson, %w(text/x-json application/jsonrequest) do mime_types.rb i działa prawidłowo: Mogę wykorzystać ten kod w moim kontrolera:

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

Mam nadzieję, że ktoś może mi powiedzieć jak to czynią niektóre konkretnego obiektu do GeoJSON bez ustawienia globalne Rendering JSON do :geojson. !?

EDIT:

moich przedmiotów wyglądać w Rails konsoli:

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

+0

GeoJSON jest JSON i jego właściwa typ nośnika jest " application/json. " Być może rozważyć zupełnie inny widok danych GeoJSON? – sgillies

+0

Dziękuję za odpowiedź: Ale wciąż pozostaje pytanie: Jak wygenerować JSON z GeoJSON zamiast WKT bez (!!) ustawienia globalnego json_generator? –

Odpowiedz

9

Można użyć fabryki tak zadaniu @object

factory = RGeo::GeoJSON::EntityFactory.instance 

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

i kodować to:

RGeo::GeoJSON.encode feature 

To powinien wypisać coś takiego:

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

Albo zbiór cech:

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

Dawanie:

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