使用MIME类型呈现为GeoJSON(或选择性地呈现为WKT / WKB)

时间:2012-10-31 10:26:14

标签: ruby-on-rails geojson wkt

我的Rails已PostGISactiverecord-postgis-adapterrgeo-geojson正在运行。

目前我可以使用默认的“object.json”网址来获取WKT / WKB格式的JSON字符串。它看起来像这样:

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

但是现在我想要一个自定义MIME类型,所以我可以调用“object.geojson”来获得这样的GeoJSON格式:

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

我发现将JSON编码器设置为GeoJSON的唯一方法是使用RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson)RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt)全局设置它。 但我只是想在本地设置,这可能吗?

我已将Mime::Type.register "application/json", :geojson, %w( text/x-json application/jsonrequest )添加到mime_types.rb并且工作正常:我可以在我的控制器中使用此代码:

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

我希望有人可以告诉我如何在不将全局JSON渲染器设置为:geojson的情况下将一些特定对象渲染到GeoJSON。 !?

修改

我的对象在Rails控制台中看起来像这样:

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

1 个答案:

答案 0 :(得分:11)

您可以将此类工厂用于特定的@object

factory = RGeo::GeoJSON::EntityFactory.instance

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

编码:

RGeo::GeoJSON.encode feature

应输出如下内容:

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

或一系列功能:

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

,并提供:

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