2012-10-31 6 views
5

, activerecord-postgis-adapter ve rgeo-geojson çalışırken Raylarım var.MIME Türleri'ni kullanarak GeoJSON (veya WKT/WKB olarak seçmeli olarak) oluşturma

Şu anda WKT/WKB biçiminde bir JSON dizesi almak için varsayılan "object.json" URL'lerini kullanabilirim.

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

Ama şimdi bir özel MIME Type sahip olmak istiyorum, bu yüzden böyle GeoJSON biçimini elde etmek için "object.geojson" diyebilirsin: Şuna benzer

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

tek yol JSON-encoder'ı GeoJSON'a ayarlamak için onu global olarak RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson) ve RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt) kullanarak ayarlamak olduğunu buldum. Ama sadece yerel olarak ayarlamak istiyorum, bu mümkün mü?

Zaten mime_types.rb için Mime::Type.register "application/json", :geojson, %w(text/x-json application/jsonrequest) eklendi ve iyi çalışıyor: benim denetleyicisi bu kodu kullanabilirsiniz:

Birinin küresel ayarlamadan GeoJSON bazı özel nesneyi işlemek için nasıl bana söyleyebilir umut
respond_to do |format| 
    format.json { render json: @object } 
    format.geojson { render text: "test" } 
end 

JSON işleyicisi :geojson. !?

DÜZENLEME:

Benim nesneler Raylar Konsolu şuna benzer:

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

+0

GeoJSON JSON ve onun uygun ortam türü "dir uygulama/json." Belki de GeoJSON verileri için tamamen farklı bir görünüm düşünün? – sgillies

+0

Cevabınız için teşekkür ederiz: Ama hala soru şu: Global json_generator'ı ayarlamadan (!!) WKT yerine GeoJSON ile JSON nasıl oluşturabilirim? –

cevap

9

Belirli bir @object

factory = RGeo::GeoJSON::EntityFactory.instance 

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

Ve kodlamak için böyle bir fabrika kullanabilirsiniz bu:

RGeo::GeoJSON.encode feature 

Gelmeli böyle bir çıktı üretir:

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

Veya olanak tanıyan bir dizi:

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

Verilmesi:

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