GeoJSON FeatureCollection uygulamasını PostGIS ile PostgreSQL'e depolamak?


21

GeoJSON'da yeniyim. Gösterildiği gibi bir GeoJSON özellikleri koleksiyonum var ve postgres tablosunda (test edilebilir) saklamak istiyorum. Postgres masamda seri kimliği ve geometri sütunu var.

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    2565453.1826721914,
                    -3835048.659760314
                ]
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "LineString",
                "coordinates": [
                    [
                        2727584.7219710173,
                        -3713449.1942418693
                    ],
                    [
                        2732476.691781269,
                        -3992291.473426192
                    ]
                ]
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            2442627.9025405287,
                            -3705499.954308534
                        ],
                        [
                            2425506.008204649,
                            -3886502.837287831
                        ],
                        [
                            2425506.008204649,
                            -3886502.837287831
                        ],
                        [
                            2555143.2081763083,
                            -3910962.686339088
                        ],
                        [
                            2442627.9025405287,
                            -3705499.954308534
                        ]
                    ]
                ]
            }
        }
    ]
}

GeoJSON verilerini test tablosuna eklemek istiyorum.

Bu konuda nasıl giderim?

Postgres versiyon 9.3.5'i postgis versiyon 2.1.3 ile kullanıyorum


Bir noktayı veya poligonu tek bir özelliğin nasıl saklanacağını cevaplayan daha önce sorulan sorulara yönlendirildim. Sorumu GeoJSON dosyasına nasıl birden fazla özellik kaydedeceğinizi sorar. Birden çok özellik ile tek bir dosyada nokta, çizgi ve çokgen özellik türlerinin karışımını kastediyorum.



Merhaba Ricardo, Bu soruyu gördüm ama sorunumu çözmüyor. Tek bir özellik türü değil, bir özellik listesi kaydetmek istiyorum. Lütfen benim sorumla GeoJSON özellikleri koleksiyonuma bir göz atın.
Jay

@Jay Öyleyse şimdi sorunuz şu: "Bir geojson koleksiyonunu tek özelliklere nasıl bölerim ya da daha fazla bilgi eklemeniz gerekir (belki de bu geometrilerin bir koleksiyona ait olduğu bilgiyi depolayabilirim?)
Jakub Kania

1
Cevabınız için @John teşekkür ederiz. CBS ve GeoJSON'da yeni olduğum için sorunumla ilgili bazı öneriler istiyorum. Sorunun arka planı: Bir kullanıcı özellikleri bir harita üzerinde çizer ve çizilen özelliklerin koleksiyonunu yakalarım. Bu koleksiyonu benzersiz bir kimliğe sahip bir DB'ye kaydetmek istiyorum. Daha sonra, sağlanan bir kimlik için kaydedilen veriler alınabilir. Postgres testlerinde test edilebilir 2 sütun vardır. Bir seri türü olan gid sütun, kimliği tutmak için, ve geometri türündeki geom sütun.
Jay

1
@Jay Evet, JSON'u saklayabilirsiniz ancak o zaman bir geometri olmayacak, böylece en yakın komşuyu kolayca sorgulayabileceksiniz.
Jakub Kania

Yanıtlar:


26

Eğer en az PostgreSQL sürümü 9.3 varsayarsak, birkaç kullanabilirsiniz JSON fonksiyonları ve operatörler ilgili bölümlerini ayıklamak GeoJSON şartname gereği ST_GeomFromGeoJSON geometrileri oluşturun.

JSON'u üst kısımda değiştirebileceğiniz aşağıdakileri deneyin:

WITH data AS (SELECT '{ "type": "FeatureCollection",
    "features": [
      { "type": "Feature",
        "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
        "properties": {"prop0": "value0"}
        },
      { "type": "Feature",
        "geometry": {
          "type": "LineString",
          "coordinates": [
            [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
            ]
          },
        "properties": {
          "prop0": "value0",
          "prop1": 0.0
          }
        },
      { "type": "Feature",
         "geometry": {
           "type": "Polygon",
           "coordinates": [
             [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
               [100.0, 1.0], [100.0, 0.0] ]
             ]
         },
         "properties": {
           "prop0": "value0",
           "prop1": {"this": "that"}
           }
         }
       ]
     }'::json AS fc)

SELECT
  row_number() OVER () AS gid,
  ST_AsText(ST_GeomFromGeoJSON(feat->>'geometry')) AS geom,
  feat->'properties' AS properties
FROM (
  SELECT json_array_elements(fc->'features') AS feat
  FROM data
) AS f;

Üç geometri bulur. geomKolon geometrisi nesne vardır ve gidözelliği sayısıdır. ST_AsTextFonksiyon gösterir WKT her geometri eşdeğeri. Ayrıca dahil ettik propertiesolarak tarifnamede gösterilmiştir, ya da her bir geometri için tanımlanabilir özellikleri.

 gid |                   geom                   |              properties
-----+------------------------------------------+--------------------------------------
   1 | POINT(102 0.5)                           | {"prop0": "value0"}
   2 | LINESTRING(102 0,103 1,104 0,105 1)      | {                                   +
     |                                          |           "prop0": "value0",        +
     |                                          |           "prop1": 0.0              +
     |                                          |           }
   3 | POLYGON((100 0,101 0,101 1,100 1,100 0)) | {                                   +
     |                                          |            "prop0": "value0",       +
     |                                          |            "prop1": {"this": "that"}+
     |                                          |            }
(3 rows)

ST_SetSRID kullanarak, geometri için bir SRID atamanız gerekir.

Ya da sadece tek bir heterojen GEOMETRYCOLLECTION ihtiyacınız varsa, bunu şu şekilde kompakt hale getirebilirsiniz:

SELECT ST_AsText(ST_Collect(ST_GeomFromGeoJSON(feat->>'geometry')))
FROM (
  SELECT json_array_elements('{ ... put JSON here ... }'::json->'features') AS feat
) AS f;

GEOMETRYCOLLECTION(POINT(2565453.18267219 -3835048.65976031),LINESTRING(2727584.72197102 -3713449.19424187,2732476.69178127 -3992291.47342619),POLYGON((2442627.90254053 -3705499.95430853,2425506.00820465 -3886502.83728783,2555143.20817631 -3910962.68633909,2442627.90254053 -3705499.95430853)))

Ayrıca bkz: JSON ve PostGIS işlevleriyle GeoJSON Özellik Koleksiyonları Oluşturma , tam tersini yapan Postgres OnLine Journal'dan.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.