Bir GeoJSON poligonu PostGIS masasına nasıl yerleştirilir?


33

GeoJSON'dan PostGIS masama bir çokgen eklemem gerekiyor. SQL sorgusu böyle gözükür.

INSERT INTO tablename (name, polygon)
VALUES (
    'Name',
    ST_GeomFromGeoJSON(
        '{
            "type": "Polygon",
            "coordinates": [
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

Ne yazık ki hata mesajı alıyorum.

ERROR:  Geometry SRID (0) does not match column SRID (3857)

GeoJSON zaten doğru referans sisteminde. Ancak bu belirtilmemiş. GeoIDon'da SRID'yi nasıl belirleyebilirim? GeoJSON'un neye benzemesi gerekiyor?

Güncelleme: Ben yarattığı geometri sararken ST_GeomFromGeoJSONile ST_SetSRID(..., 3857)başka bir hata atar. Benim görüşüme göre, geometri Z boyutunda gibi görünmüyor.

ERROR:  Geometry has Z dimension but column does not

Tablonun srid: 4326 olduğunu belirtmeniz gerektiğini düşünüyorum, tablonuzun srid: 3857 olduğunu görünüyor ama geojson'unuz uzun / enlemde (yani srid: 4326 veya WGS84) var
Gery

3857'yi kullanmak istiyorum. GeoJSON'un o zaman nasıl görünmesi gerekiyor?
danijar

Yanıtlar:


32

PostGIS'in kaynak koduna göz atarak SRID'leri nasıl ayrıştırdığını öğrendim. GeoJSON'da SRID'yi belirtmenin doğru yolu:

GeoJSON özelliği, bir poligonun koordinatlarının bir dizi satır dizisi olduğunu söylüyor. Bu yüzden onları ek parantez ile sarmak zorunda kaldım.

{
    "type":"Polygon",
    "coordinates":
    [
        [
            [-91.23046875,45.460130637921],
            [-79.8046875,49.837982453085],
            [-69.08203125,43.452918893555],
            [-88.2421875,32.694865977875],
            [-91.23046875,45.460130637921]
        ]
    ],
    "crs":{"type":"name","properties":{"name":"EPSG:3857"}}
}

16

JSON'unuzla ilgili birkaç sorun var.

  1. İlk olarak, koordinatların bir dizi dizisi olması gerekir.
  2. İkincisi, koordinatlara bakıldığında, değerler bir Coğrafi koordinat sisteminde Latlong gibi görünüyor, muhtemelen EPSG: 4326. O zaman EPSG: 3857'ye dönüştürülmeli.

Bu iki şeyi düzelttikten sonra, aşağıdaki SQL Query'yi kullanarak satırı ekleyebilirsiniz:

INSERT INTO "Parcels"("Name", the_geom)
    VALUES ('Corrected_Shape', 
    ST_TRANSFORM(ST_GeomFromGeoJSON('{
    "type":"Polygon",
    "coordinates":[[
        [-91.23046875,45.460130637921],
        [-79.8046875,49.837982453085],
        [-69.08203125,43.452918893555],
        [-88.2421875,32.694865977875],
        [-91.23046875,45.460130637921]
    ]],
    "crs":{"type":"name","properties":{"name":"EPSG:4326"}}
}'),3857));

Bu işe yaramazsa, (yani hala Z diemsnion ile ilgili hatayı alıyorsanız), lütfen soruyu PostGis sürümüyle ve tablonuzun Beyanı ile güncelleyin.


Sizce neden koordinatların EPSG: 3857'de olmadığını düşünüyorsunuz?
danijar

3
Çünkü EPSG birimleri: 3857 (sözde) metredir ve menşei Atlantik Okyanusundadır. Metre ile 6 ondalık hassasiyetiniz olmazdı ve bu veriler Atlantik Okyanusunda Afrika kıyılarına yakın bir yerde olacaktı.
Devdatta Tengshe

Koordinatlar haritadaki girişten alınmıştır ve çok fazla ondalık işareti vardır. Test için Afrika’ya yakın Atlantik Okyanusu’nda bir alan çizdim. Ama senin sayende koordinatları bütün metrelere yuvarlamak için haritayı geliştirebilirim.
danijar

@ danijar: O zaman her şey yolunda. Bu koordinatlar EPSG: 4326'da olsaydı, o zaman ABD'nin doğu eyaletlerinde yatıyordu.
Devdatta Tengshe

5

geojson'unuzun UTM değerlerine sahip olması gerekir, bunu Proj veya diğer çevrimiçi araçlarla dönüştürebilirsiniz, ancak bunu masanıza eklemeden önce kolayca ve doğrudan postgis ile yapabilirsiniz, şunu deneyin (denenmemiş):

SELECT ST_AsText(ST_Transform(ST_GeomFromGeoJSON
    (
        {
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }
    ),4326),3857));

Öyleyse SRID'i 4326'dan 3857'ye mi dönüştürmek istiyorsunuz? Sonra doğrudan ST_Transform'u (ST_SetSRID (..., 4326), 3857) deneyebilirim, değil mi? Bu ekstra dönüşüm adımı neden gerekli olsun?
danijar

Sanırım ne sorduğunuzu test etmelisiniz, muhtemelen önerdiğiniz şey, ihtiyacınız olan tek adımdır, deneyin ve sahip olduklarınızı gönderin
Gery

Ben de öyle buluyorum. ERROR: transform: couldn't project point (9.25253e-302 6.08985e+159 1.18576e-322): latitude or longitude exceeded limits (-14)
danijar

3
INSERT INTO tablename (name, polygon)
VALUES
(
    'Name',
    ST_GeomFromGeoJSON
    (
        '{
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

eksik "'"


4
Bu cevaba daha fazla bağlam ekleyebilir ve OP'nin sorusunu nasıl cevapladığını ve mevcut cevaplardan farklı olduğunu
açıklayabilir misiniz

Gerçekten, JSON gelmez söz konusu bir dize değildir ve cevapları en az birinde bir dize değil, bir dize olmak zorunda. Bu cevap açıkça ortaya çıkabilir, ancak herkes için mutlaka açık olması gerekmez, bu yüzden bazı kredileri hak eder.
Forbesmyester
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.