QGIS kullanarak bir milyondan fazla noktayı eşleme


9

ABD'de meta veri içermeyen bir milyondan fazla lat / lon puanı olan bir CSV eşlemeye çalışıyorum. Bu kadar çok veriyi eşleştirmeye çalışmadım ve hangi adımları atmam gerektiğini bilmek istemedim. QGIS için çok fazla veri olduğunu biliyorum, bu yüzden 100.000 satır CSV'ye bölmeyi denedim, ancak ne yapacağımı bilmediğim birçok dosya aldım. Sayım bloğuyla puan toplamak en iyi olabilir düşünüyorum ama Javascript (hiç Python kullanmadım) veya komut satırı araçları kullanarak bunu yapmanın en iyi yolunu bilmiyorum? Herhangi bir öneri?


2
PostGIS kullanarak CSV'yi veritabanına kolayca yükleyebilir, ardından lat / lon sütunlarını geometriye dönüştürebilirsiniz ve işiniz biter! Sonra PostGIS'de istediğiniz tüm özetleme / toplama sayım blokları ile yapabilirsiniz ... Çim ile ne yapmak istiyorsunuz?
DPSSpatial

2
Merhaba, GIS stackexchange'e hoş geldiniz. QGIS ile güzel arayüz oluşturan mekansal olarak etkinleştirilmiş bir veritabanı motoru olan PostgreSQL / PostGIS'e göz atmanızı tavsiye ederim. Verileriniz bir veritabanına yüklendikten sonra, örneğin nüfus sayım sistemlerine katılmak ve bunlarda kümeleme yapmak nispeten önemsiz olacaktır.
raphael

Sanırım Raphael'in yorumu şimdiye kadarki en iyi 'cevap'. PostGIS'e yüklendikten ve QGIS-PostGIS arayüz araçları çok iyi olduktan sonra 1 milyon puanla çalışmak önemsizdir.
Alexander

@MapBaker ve @raphael teşekkürler! Postgis'i böyle kullanmayı düşünmemiştim. CSV'yi QGUS'a aktardım. Bunu PostGIS'e dönüştürmek için yine de var mı?
user63623

@raphael, 1 milyondan fazla kayıt olduğunda PostGIS'te X, Y'yi geometriye dönüştürmenin iyi bir yolunu biliyor musunuz? Bu bir ST_MakePoint yöntemi kullanarak çoğaltmaya çalıştım, ancak bellek bomba - ST_GeomFromText varolan X ve Y sütunlarını kullanabilir?
DPSSpatial

Yanıtlar:


9

QGIS tarafından yerel olarak desteklendiği için PostgreSQL / PostGIS kullanmanızı tavsiye ederim, diğer uzamsal verilerle (sayım yolları gibi) birleştirmek için bazı kullanışlı yerleşik işlevlere sahiptir ve bir veritabanı kullanımı, büyük veri kümeleriyle ilgili bellek sorunlarını sınırlamalıdır. Önerilen adım grubum aşağıdadır. SQL komutlarını yürütmek için PGAdmin veya QGIS kullanabilirsiniz , birincisi sorgularda daha bilgilendirici hatalar verir, ikincisi sorguların sonuçlarını bir harita üzerinde katman olarak yüklemenize izin verir. İkincisine erişmek için Database > DB Manager > DB Managerikinci düğmeye gidin ve tıklayın.

  1. Hızlı yükleyiciler de dahil olmak üzere PostGIS kurulumuna başlayın
  2. QGIS SQL Penceresindeki veya PGAdmin'in SQL Penceresindeki CREATE TABLEkomutu ( örnek ) kullanarak veritabanınızda bir tablo oluşturun
  3. Csv'nizi bir COPY sql komutu veya PGAdmin'in yerleşik içe aktarma işleviyle içe aktarın ve PGAdmin'deki tablonuza sağ tıklayıp Import...(bu sonuncu hassas olabilir, bu nedenle daha büyük veri kümeleri için COPY'yi öneriyorum).
  4. PGAdmin veya QGIS SQL penceresinde aşağıdaki SQL'i çalıştırarak tablonuza bir geometri sütunu ekleyin.

    ALTER TABLE some_table ADD COLUMN geom geometry(Point,4326);
    
  5. Gibi bir şey kullanarak nokta geometrileri oluşturun

    UPDATE yourtable SET geom = ST_SetSRID(ST_MakePoint( x, y), 4326);
    
  6. Şuna SELECTbenzer bir ifade kullanarak bir veri alt kümesi görüntülemeLIMIT 50000

  7. Veya nüfus sayımı verilerine benzer bir şeyle katılın

    SEL. C.gid, c.geom
    Nüfus sayımı c
    INNER ST_Within'de verilerinize KATILIN (yourdata.geom, c.geom)

İşlev referansları:
ST_Within
ST_MakePoint
ST_SetSRID


Yanıtınız için teşekkürler. Adım 3 denedim ama QGIS tablo düzenleyemiyorum. Eklenti kullanmadan sütun eklemenin başka bir yolu var mı?
user63623

@ user63623 Yanıtımı, sorununuzu ele alacak ek bir adım içerecek şekilde güncelledim.
raphael

teşekkürler Ben 1 ve 2 arasında bir adım eksik olduğunu düşünüyorum. QGIS içine csv katmanı içe aktardığınızda bir veritabanı oluşturmak için bir shp dosyası olarak kaydetmek gerekir. Sağ? Yine de denediğimde donuyor. Ayrıca PGAdmin kullanmayı denedim ama içe aktarma işlevini bulamıyorum.
user63623

PGAdmin'de, önce böyle bir sql sorgusu kullanarak tablonuzu OLUŞTURMAK gerekir: stackoverflow.com/questions/9826833/create-table-in-postgresql , csv'deki tüm sütunlarınız doğru bir şekilde tanımlanmıştır. Ardından sekme adına sağ tıklayabilir> Import...İçe Aktarma sihirbazına erişebilir veya postgresql.org/docs/current/static/sql-copy.html COPY komutunu kullanarak cevabı güncelleyeceğim
raphael

3

Kısa süre önce bir CSV'den içe aktarılan 1,4 milyon puanlık bir veri kümesiyle çalıştım. CSV'deki alakasız alanları sildiğimden emin oldum. Bazı süreçlerin yürütülmesi biraz zaman alsa da, benim için iyi çalıştı. (QGIS 2.12, 64 bit Windows 7, 8 Gb RAM)


2

Sahte kodda bir R adayı fwiw:

library(rgdal) ## for spatial export
library(readr) ## for fast file read

x <- read_csv("file.csv") 
names(x)  ## some as yet unknown columns

coordinates(x) <- c("x", "y")  ## your coordinate names may be different

writeOGR(x, ".", layer = "filepoints", driver = "MapInfo File")

Bu, QGIS ile okuyabileceğiniz çalışma dizininde bir filepoints.tab dosyası verecektir. Veya bir filepoints.shp dosyası veya ihtiyacınız olan formatı oluşturmak için "ESRI Şekil Dosyası" nı seçin. QGIS, GDAL'yi rgdal'ın yaptığı gibi kullanır, bu nedenle çok fazla çakışma vardır. Benzer Python mekanizmaları vardır.

Herhangi bir meta veriniz olmadığından, proj4string (x) <- CRS ("+ proj = bir şey + vb") ayarlamak için koordinatlar (x) atadıktan sonra bir kümeniz olabilir, ancak yalnızca verilerinizi tahmin edebiliriz.

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.