Büyük GeoJson dosyalarını PostGIS'e yüklemek için ogr2ogr alternatifleri


24

PostGIS veritabanına yüklemek istediğim 7GB'lık bir GeoJson dosyasına sahibim. Ogr2ogr kullanmayı denedim, ancak başarısız oldu çünkü dosya ogr2ogr'un belleğe yükleyebilmesi ve daha sonra işlemesi için çok büyük.

Bu geojson dosyasını PostGIS'e yüklemek için başka alternatifler var mı?

Anladığım ogr2ogr hatası:

HATA 2: CPLMalloc (): -611145182 bayt ayıran bellek yetersiz. Bu uygulama, Çalışma Zamanı'ndan alışılmadık bir şekilde sonlandırmasını istedi. Daha fazla bilgi için lütfen uygulamanın destek ekibine başvurun.


1
"-Gt" seçeneğini denediniz mi? Varsayılan olarak işlem başına 200 özelliği gruplandırır.
Pablo,

-Gt seçeneğinin farkında değildim ve daha önce denemedim. -Gt seçeneğini kullanarak yeniden çalıştırmayı denedim, ancak maalesef aynı hatayla karşılaştım. Ayrıca aranabilir seçeneklerin sayısını sınırlandırmak için -WHERE seçeneğini de kullanmaya çalıştım, ancak bu ikisinin de yardımı olmadı.
RyanDalton

GDAL / OGR 2.3.0'da büyük GeoJSON dosyalarının okunmasını geliştirdi ve bu da bellek yükünü büyük ölçüde azaltıyor.
AndrewHarvey

Yanıtlar:


10

Gönderdiğiniz örnek dosyayı notepad ++ gibi bir düzenleyici kullanarak el ile bölmenin mümkün olabileceğini gösteriyor

1) Her öbek için bir başlık oluşturun:

{"type":"FeatureCollection","features":[

2) Başlıktan sonra birçok özellik yerleştirin:

{"geometry": {"type": "Point", "coordinates": [-103.422819, 20.686477]}, "type": "Feature", "id": "SG_3TspYXmaZcMIB8GxzXcayF_20.686477_-103.422819@1308163237", "properties": {"website": "http://www.buongiorno.com", "city": "M\u00e9xico D.F. ", "name": "Buongiorno", "tags": ["mobile", "vas", "community", "social-networking", "connected-devices", "android", "tablets", "smartphones"], "country": "MX", "classifiers": [{"category": "Professional", "type": "Services", "subcategory": "Computer Services"}], "href": "http://api.simplegeo.com/1.0/features/SG_3TspYXmaZcMIB8GxzXcayF_20.686477_-103.422819@1308163237.json", "address": "Le\u00f3n Tolstoi #18 PH Col. Anzures", "owner": "simplegeo", "postcode": "11590"}},

3) Yığını:

]}

EDIT - İşte dosyayı tanımlanmış büyüklükte parçalara ayıracak python kodudur (özelliklerin sayısıyla):

import sys

class JsonFile(object):
    def __init__(self,file):
        self.file = open(file, 'r') 
    def split(self,csize):
        header=self.file.readline()
        number=0
        while True:
            output=open("chunk %s.geojson" %(number),'w')
            output.write(header)
            number+=1
            feature=self.file.readline()
            if feature==']}':
                break
            else:
                for i in range(csize):
                    output.write(feature)
                    feature=self.file.readline()
                    if feature==']}':
                        output.write("]}")
                        output.close()
                        sys.exit("Done!")
                output.write("]}")
                output.close()

if __name__=="__main__":
    myfile = JsonFile('places_mx.geojson')
    myfile.split(2000) #size of the chunks.

19

Maalesef JSON, XML'e benzer şekilde akış işlemesi için çok uygundur, bu nedenle hemen hemen tüm uygulamalar tüm veri kümesinin belleğe yüklenmesini gerektirir. Bu durumda küçük setler için uygun olsa da, veri setini daha küçük ve yönetilebilir parçalara bölmekten başka bir seçenek yoktur.

Pablo'nun çözümünü geliştirmek için, dosyayı gerçekten bir düzenleyiciye açıp yüklemenizi ve el ile bölmenizi gerektirmeyen ancak tüm işlemi mümkün olduğunca otomatikleştirmeye çalışan bir tane var.

Json dosyasını bir Unix ana bilgisayarına (linux, osx) kopyalayın veya Windows'ta cygwin araçlarını yükleyin. Sonra bir kabuk açın ve dosyadaki ilk ve son satırı kaldırmak için vim kullanın:

$ vim places.json

tip dd , daha sonra ilk satır kaldırmak için SHIFT-G , dosyanın sonuna hareket tip dd son satır kaldırmak için yeniden. Şimdi değişiklikleri yazın : wq . Bu en fazla sadece birkaç dakika sürer.

Şimdi dosyayı daha kolay yönetilebilir parçalara bölmek için unix'in tam gücünden yararlanacağız. Kabuk türünde:

$ split -l 10000 places.json places-chunks-

Git bir bira al. Bu, dosyayı her biri 10000 satır içeren daha küçük dosyalara böler. Ogr2gr'nin yönetebilmesi için yeterince küçük tuttuğunuz sürece, satır sayısını artırabilirsiniz .

Şimdi her bir dosyaya baş ve kuyruk takacağız:

$ echo '{"type":"FeatureCollection","features":[' > head
$ echo ']}' > tail
$ for f in places-chunks-* ; do cat head $f tail > $f.json && rm -f $f ; done

Git bir yılan al. İlk iki komut, sadece doğru içeriğe sahip bir üstbilgi ve altbilgi dosyası oluşturur (sadece gerçekten kolaylık sağlamak için). ).

Bu noktada umarım birçok yer-topaklarını - *. Json dosyalarını ogr2ogr ile işlemden geçirebilirsiniz:

$ for f in places-chunks-*.json ; do ogr2ogr -your-options-here $f ; done

1
Bu yöntemle, "chunks" dosyasının bir özellik bloğunun sonunda ayrıldığından emin olmak zorunda değil miyiz? Üstbilgi ve altbilgi bilgilerini eklemek için Python'daki verileri önceden işlediğimden, verileri kesmek için bir sayaç ekleyebilmeliyim. Bundan sonra bir şans vereceğim. Önerin için teşekkürler.
RyanDalton

Sağladığınız örnek verinin satır başına bir özelliği vardı, bu yüzden split -l ile gittim . Gerçek verilerle durum böyle değilse, korkarım işe yaramayacak.
unicoletti

Evet, elbette haklısın, her bir özelliğin ayrı bir satırda olması. Bunu başından beri düşünmedim.
RyanDalton

Dosyayı açmadan satırları kaldırmak için. İlk satırı sed -i "1d" places.json kaldır : İlk 4 satırı sed -i "1,4d" places.json kaldır : Son 4 satırı kaldır: head -n -4 places.json > places2.json
egofer

2

Verilerinizi FME Desktop ile yüklemek mümkündür. Bu çok kolay.


Böyle büyük bir dosyayı işleyecek mi?
RyanDalton

Örneğin, dönüştürme işleminden önce dosyayı birçok dosyaya bölün. hjsplit.org PostGIS'e ithalat için haber dosyalarını FME Desktop’a aktarın.

1
muhtemelen, ve dosent ise desteklemek için bağırma :)
simplexio 6:13

2

Python'da geojson dosyanızı çok daha küçük bir form dosyası biçimine ya da hepsini bellekte olmadan doğrudan SQL'e dönüştürecek tembel bir okuyucu ve yazar yazmak oldukça kolay olmalıdır. Dönüştürüldüğünde, yerel PostGIS araçları büyük veri kümelerini içe aktarabilir. OGR'daki geojson desteği nispeten yenidir ve büyük dosyaların işlenmesi için herhangi bir bayrak yoktur.

Bir şekilde, dosyanızın yönetilebilir bir bölümünü paylaşabiliyorsanız, size yardımcı olabilirim.


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.