Lưu trữ tính năng GeoJSONCollection cho PostgreSQL với PostGIS?


21

Tôi mới đến GeoJSON. Tôi có một bộ sưu tập các tính năng GeoJSON như được hiển thị và muốn lưu trữ nó trong bảng postgres (testtable). Bảng postgres của tôi có một cột hình học và cột hình học.

{
    "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
                        ]
                    ]
                ]
            }
        }
    ]
}

Tôi muốn chèn dữ liệu GeoJSON vào bảng kiểm tra.

Làm thế nào để tôi đi về nó?

Tôi đang sử dụng phiên bản postgres 9.3.5 với phiên bản postgis 2.1.3


Tôi đã được chuyển đến các câu hỏi đã hỏi trước đó để trả lời cách lưu trữ một tính năng, ví dụ như một điểm hoặc đa giác. Câu hỏi của tôi hỏi làm thế nào để lưu nhiều tính năng trong tệp GeoJSON. Theo nhiều tính năng, tôi có nghĩa là một hỗn hợp các loại tính năng điểm, đường và đa giác trong một tệp.



Xin chào Ricardo, tôi đã thấy câu hỏi đó nhưng nó không giải quyết được vấn đề của tôi. Tôi muốn lưu một danh sách các tính năng, không chỉ là một loại tính năng. Xin hãy xem bộ sưu tập các tính năng GeoJSON của tôi trong câu hỏi của tôi.
Jay

@Jay Vì vậy, bây giờ câu hỏi của bạn là "Làm cách nào để chia bộ sưu tập Geojson thành các tính năng duy nhất hoặc bạn cần thêm thông tin (có thể lưu trữ thông tin rằng những hình học đó thuộc về một bộ sưu tập nào đó?)
Jakub Kania

1
Cảm ơn bạn @John đã trả lời của bạn. Vì tôi chưa quen với GIS và GeoJSON, tôi muốn có một số gợi ý với vấn đề của mình. Bối cảnh của câu hỏi: Một người dùng vẽ các tính năng trên bản đồ và tôi chụp bộ sưu tập các tính năng được vẽ. Tôi muốn lưu bộ sưu tập này trong một DB với một id duy nhất. Sau đó, dữ liệu đã lưu có thể được tìm nạp cho id được cung cấp. Các testable trong postgres có 2 cột. cột gid là một loại nối tiếp, để giữ id và cột geom là loại hình học.
Jay

1
@Jay Có, bạn có thể lưu trữ JSON nhưng sau đó nó sẽ không phải là hình học để bạn có thể dễ dàng truy vấn người hàng xóm gần nhất, v.v.
Jakub Kania

Câu trả lời:


26

Giả sử bạn có ít nhất PostgreQuery phiên bản 9.3, bạn có thể sử dụng một vài hàm và toán tử JSON để trích xuất các phần có liên quan của đặc tả GeoJSON theo yêu cầu của ST_GeomFromGeoJSON để tạo hình học.

Hãy thử làm như sau, nơi bạn có thể thay thế JSON ở phần trên cùng:

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;

Tìm ba hình học. Các geomcột có các đối tượng hình học, và gidlà số tính năng. Các ST_AsTextchức năng hiển thị các WKT tương đương của mỗi hình học. Tôi cũng đã bao gồm các propertiesthuộc tính hoặc có thể được xác định cho mỗi hình dạng, như được hiển thị trong đặc tả.

 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)

Bạn nên chỉ định SRID cho hình học, sử dụng ST_SetSRID.

Hoặc nếu bạn chỉ cần một GEOMETRYCOLLMENT không đồng nhất, bạn có thể làm cho nó nhỏ gọn như thế này:

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)))

Xem thêm Tạo các bộ sưu tập tính năng GeoJSON với các hàm JSON và PostGIS từ Tạp chí PostLres OnLine, điều ngược lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.