Bidik garis ke titik secara otomatis?

19

Saya punya dua vektor shapefile: Satu file adalah titik yang mewakili lubang got dan yang lain adalah file polyline yang mewakili pipa yang menuju ke dan dari lubang got. Saya perlu mengambil garis dalam jarak tertentu ke lubang terdekat.

Apakah ada cara mudah untuk mencapai ini tanpa melakukannya secara manual?

garis -> titik

Memperbarui

Sesuai Alexandre, saya telah mengekspor shapefile ke format spasial. Tidak yakin apa yang harus dilakukan selanjutnya.

masukkan deskripsi gambar di sini

Perbarui # 2 Saya membuat file db baru dan mengimpor shapefile ke db baru menggunakan spatialite-gui, saya menyesuaikan permintaan SQL saya tetapi seperti yang Anda lihat saya mendapatkan kesalahan "tidak ada kolom seperti itu: f.geom"

masukkan deskripsi gambar di sini

GreyHippo
sumber
Dalam tabel spasial Spatialite (layer), geometri fitur disimpan dalam atribut. Nama-nama bisa berbeda. Dalam "pipa" tabel atribut itu disebut Geometri. Saya akan memperbarui jawaban saya dengan asumsi bahwa mh juga sebagai atribut Geometri.
Alexandre Neto
Saya mendapat kesalahan "tidak ada fungsi seperti itu: ST_Snap". Saya menggunakan QGIS 1.8 pada Windows 7 64bit.
GreyHippo
Spatialite apa yang Anda miliki? Anda dapat memeriksanya di QGIS> Bantuan> Tentang
Alexandre Neto
"tidak ada kolom seperti itu: f.geom" - coba dengan f.Geometry
vinayan
Versi Spatialite saya adalah 3.0.1
GreyHippo

Jawaban:

26

Jika Anda bersedia memasukkan data Anda ke Postgis (atau Spatialite ), Anda dapat menggunakan ST_Snap untuk melakukan apa yang Anda inginkan.

Cukup gunakan baris layer \ tabel sebagai input, dan layer poin Anda sebagai referensi, dan atur toleransi. Sesuatu seperti ini:

SELECT
    f.gid as gid,
    ST_Snap(f.Geometry, g.Geometry, 2) as geom
FROM
    pipe as f,
    (SELECT ST_Collect(Geometry) as Geometry
     FROM mh) as g

Hasilnya adalah ini:

masukkan deskripsi gambar di sini

Anda kemudian dapat memperbarui geometri menggunakan pengenal fitur.

Alexandre Neto
sumber
Di mana saya akan meletakkan kode "Pilih ... Dari ..."? Apa yang dimaksud dengan "menggunakan pengidentifikasi fitur"?
GreyHippo
Setelah mengimpor file Anda di database (postgis atau spatialite), Anda bisa menggunakan DB Manager untuk melihat tabel database Anda dan menjalankan query SQL (kode) di SQL Window, dan kemudian memuatnya di kanvas Anda. Katakan jika itu berhasil untuk Anda, maka kami akan melakukan bagian pembaruan.
Alexandre Neto
Alexandre, lihat pembaruan di atas. Saya mengekspor file ke dua file spatiallite.
GreyHippo
Anda harus meletakkan kedua file di Spatialite Database yang sama, cukup seret katakan "pipa" ke database "mh.sqlite". Setelah itu perbarui Kode SQL untuk mengubah "titik" menjadi "mh", dan "baris" menjadi "pipa". Juga sesuaikan "gid" dengan id "pipa" Anda. Setelah itu Anda dapat Menjalankan dan memuat hasilnya.
Alexandre Neto
3

Saya tidak tahu banyak tentang QGIS atau GRASS, tetapi beberapa Googling cepat telah menghasilkan v.clean dalam GRASS harus melakukan triknya.

Lihat pos ini dan yang ini .

Alternatif untuk QGIS dan GRASS:

Jika saya melakukan ini di ArcGIS, saya mungkin akan menyimpan data saya dalam Feature Dataset di File Geodatabase dan membuat Topologi untuk mengidentifikasi area di mana layer titik tidak pada titik akhir dari garis. Anda kemudian dapat memperbaiki kesalahan menggunakan Inspektur Kesalahan .

Tapi, mungkin solusi tercepat dan termudah adalah di FME. Anda dapat mencoba menggunakan Alat Kakap atau yang lebih baik, Alat AnchoredSnapper . Jika Anda menggunakan AnchoredSnapper, pastikan tipe gertakan Anda adalah Gertakan Titik Akhir. Tentu saja, Anda akan memerlukan lisensi untuk FME. Tetapi Anda dapat mengunduh uji coba 14 hari jika tidak memilikinya.

Fezter
sumber
Saya melihat v.clean tetapi hanya menggunakan satu layer, saya perlu membandingkan satu layer dengan yang lain. Juga, saya lebih mencari opsi QGIS / opensource.
GreyHippo
1
@GreyHippo, GRASS adalah opensource
artwork21
1
Saya tahu GRASS adalah opensource tetapi opsi Anda yang lain tidak.
GreyHippo
-1

Cara manual

Qgis -> Pengaturan -> Pilihan gertakan (dan saya tidak yakin tetapi mungkin perlu ekstensi CadTools) dan mengaktifkan pengeditan topologis.

Cara otomatis

v.clean yang ada di alat GRASS di kotak alat SEXTANTE di QGIS. Jika Anda memiliki PostGIS 2.0 maka ST_Snap dan ST_SnapToGrid () (Dan tidak ada alasan mengapa Anda tidak dapat menggunakannya, itu adalah alat spasial yang sangat bagus)

Cara komersial

Alat FME dan MRF (ekstensi komersial, saya punya versi evaluasi. Sangat bagus).

Saya juga tertarik dengan manajemen pipa air / selokan dengan alat sumber terbuka, apakah Anda punya petunjuk?

simplexio
sumber
Saya pikir itulah yang dimaksud GreyHippo dengan "melakukannya secara manual". Hanya dengan menggunakan opsi Gertakan, Anda harus memindahkan setiap simpul yang menggantung dengan tangan untuk mengaktifkan gertakan. Atau apakah saya melewatkan sesuatu?
Jake
tidak. saya buta.
simplexio
Simplexio, saya TIDAK ingin melakukannya secara manual. Saya berharap untuk plugin atau proses yang tidak saya ketahui.
GreyHippo
Saya tidak berpikir Anda bisa menggunakan GRASS v.clean pada dua lapisan?
GreyHippo
1
jika saya ingat dengan benar itu bisa memperbaiki garis yang terlalu pendek. Anda lihat, masalah yang Anda miliki bukanlah bahwa lubang pembuangan Anda tidak ada di tempat yang tepat, tetapi jaringan saluran pembuangan Anda tidak benar secara topologi. Dan itu hanya membutuhkan lapisan pipa. Setiap sistem jaringan utilitas yang saya lihat mengasumsikan bahwa ada lubang got di setiap persimpangan saluran pembuangan. Offcourse ini mengasumsikan bahwa Anda ingin memiliki topologi yang benar.
simplexio