Saya mencoba membuat titik (layer baru) pada jarak tertentu di sepanjang jalan (layer yang ada) di QGIS. Membuat poin Reguler setiap meter di tingkat county menggunakan ArcGIS Desktop? memberikan solusi untuk ArcGIS. Bagaimana cara mencapai ini di QGIS? Menambahkan poin ke layer vektor titik menggunakan QGIS? menjelaskan cara membuat poin tetapi tidak melakukan apa pun tentang jarak.
(Saya menerapkan solusi yang diusulkan dengan ukuran panjang yang berbeda karena saya tidak tahu konversi). Solusi Nathans bekerja sampai batas tertentu, saya dapat ...
. Di sini, proyeksi titik-titik berjarak sama ini berbeda dari garis aslinya.
Dengan saran @ underdark, saya mengerti
di mana poin tampaknya tidak sama. Saya kira ada beberapa masalah proyeksi dengan keduanya yang tidak saya mengerti.
import locate
saluran lebih dari sekali. Panggil saja sekali maka Anda bisa meneleponlocate.pointsAlongLine(30)
sebanyak yang Anda butuhkanJawaban:
Catatan: Sekarang ada plugin QGIS
QChainage
. Ia melakukan semua ini dan lebih banyak lagi. Kode di bawah ini kedaluwarsa dengan QGIS 2.0 dan di atasnya.Berikut adalah beberapa kode Python yang dapat Anda tempelkan dalam file dan gunakan di dalam QGIS:
QGIS memang memiliki metode di dalamnya API untuk melakukan referensi liner namun saya tidak dapat membuatnya berfungsi dengan benar, tetapi saya akan menghubungi pembuat kode dan melihat apakah saya melakukan sesuatu yang salah.
Untuk saat ini Anda memerlukan pustaka Python yang indah , yang harus Anda instal karena berguna untuk digunakan. Ini juga memiliki dokumentasi yang bagus di http://toblerity.github.com/shapely/manual.html
Ini adalah bagian yang saya gunakan dalam contoh berikut http://toblerity.github.com/shapely/manual.html#interoperation .
Sebagian besar kode berikut adalah kode boilerplate QGIS hanya membuat fitur, lapisan, mengkonversi dari wkb dan wkt dan kembali. Bit inti adalah
point = line.interpolate(currentdistance)
yang mengembalikan titik pada jarak di sepanjang garis. Kami hanya membungkus ini dalam satu lingkaran sampai kami kehabisan garis.Salin dan tempel kode di atas ke dalam file, saya panggil loc.py saya, dalam
~./qgis/python
direktori (karena berada di jalur Python) dan lakukan saja ini di konsol Python di dalam QGIS.Itu akan membuat layer titik baru dengan titik pada setiap 30 meter di sepanjang garis yang dipilih, seperti:
Catatan: Kode ini cukup kasar dan mungkin perlu dibersihkan.
EDIT: Build dev QGIS terbaru sekarang dapat melakukan ini secara asli.
Ubah loop sementara
createPointsAt
ke:dan Anda dapat menghapus
sumber
locate
dan menggunakannya tapi tetap saja saya tidak mendapatkan poin yang sama. Juga, saya orang baru di Python jadi saya tidak mengerti di mana harus menjalankan kode (1) python di direktori qgis atau (2) di C: \ Python27 \?C:\Users\{you user name}\.qgis\python
kemudian restart QGIS jika terbuka, dan pergi ke `Plugins-> Python Console. Load a line layer, select a line a call
import loc` danlocate.pointsAlongLine(30)
Anda bisa menggunakan alat plugin QGIS GRASS v.to.points untuk membuat poin sepanjang garis secara berkala
sumber
CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
Jika Anda ingin merencanakan rantai dengan interval tetap di sepanjang garis jalan, Anda bisa menggunakan plug-in 'Profil dari garis' untuk melakukan ini. Anda memerlukan DEM di bawah lapisan garis jalan, tetapi prosedurnya cepat dan sangat sederhana. Nick.
sumber
Waspadalah bahwa model data Shapely (Python) / GEOS (C ++) didefinisikan dalam sebuah bidang. Jadi, jika titik Anda terdiri dari posisi GPS (lintang, bujur) menggunakan
shapely.geometry.LineString.interpolate(distance)
metode ini akan menampilkan posisi GPS pada jarak euclidean di sepanjang yang diberikanLineString
.Shapely's
interpolate()
didasarkan padageos::linearref::LengthIndexedLine
kelas GEOS menggunakanextractPoint
metode ini.Seharusnya interpolasi spasi sama di bidang lintang-bujur cukup untuk aplikasi mengingat jarak yang relatif kecil. Secara umum, bagaimanapun, kita harus mempertimbangkan jarak pada bola untuk aplikasi GIS (sebagaimana didefinisikan dalam WGS84 ).
Saya bisa memikirkan dua solusi menggunakan modul Shapely:
LineString
properti adalah semua poin yang diberikan dan kurva interpolasi linier di sepanjang mereka. Mungkin Anda dapat menulis anggota yang mengakses kurva interpolasi dan menerapkan garis integral berikut menggantikan jarak euclidean. Saya suka pendekatan ini karena menggunakan kurva kontinu piece-wise titik yang diinginkan dapat diperoleh dengan menghitung persimpangan lingkaran yang berdekatan di sepanjang kurva dengan jari-jarir = radian_measure(arc_length) = arc_length / R
, di mana R sama dengan jari-jari Bumi pada posisi yang diberikan.Untuk mencapai ini saya ingin merujuk pada pertanyaan StackOverflow berikut dan jawaban ini khususnya:
sumber
Sextante memiliki alat yang mungkin cocok untuk Anda. Sextante dapat diunduh dari repositori plugin Qgis.
Cari:
"Tools for Line Layers"
"Lines to equispaced points"
sumber