Визуализация как GeoJSON (или выборочно как WKT/WKB) с использованием MIME-типов

у меня есть рельсы с PostGIS, activerecord-postgis-adapter и rgeo-geojson работает.

на данный момент я могу использовать объект по умолчанию.JSON " URLs, чтобы получить строку JSON с форматом WKT/WKB. Выглядит это так:

{"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-encoder в 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 ) to mime_types.rb и он прекрасно работает: я могу использовать этот код в мой контроллер:

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

я надеюсь, что кто-то может сказать мне, как отобразить какой-то конкретный объект в GeoJSON без установки глобального JSON renderer :geojson. !?

EDIT:

мои объекты выглядят так в консоли Rails:

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

1 ответов


вы можете использовать такую фабрику для конкретного @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...
    }
}