Hattı belirli sayıda parçaya nasıl bölerim?


11

Bir nokta katmanının yardımıyla bir çizgiyi bölmeyi içeren birçok soru gördüm.

Bir çizgiyi uzunluğunun kesirlerine bölmek istiyorum.

Örneğin, bir 400metre uzunluğum var, her biri 100 metre uzunluğunda dört satıra bölmek istiyorum.

Çim modülü var v.split, ama qgis araç kutusundan başlattığımda bir hata mesajı alıyorum:

*"TypeError: object of type 'NoneType' has no len()"*

Bu yüzden, bu bir çözüm olursa işe yarayıp yaramayacağımı bilmiyorum.


Lütfen açıklığa kavuşturun: Uzunluğa, yani hiç 100 metreye veya belirli sayıda parçaya bölünmek mi istiyorsunuz?
underdark

Belirli sayıda parçaya. Joseph, aşağıda iyi bir çözüm sağlamıştır.
Gilles

Yanıtlar:


10

V.split.length ÇİMLER gelen fonksiyon tam olarak bölerek bir nokta tabakasının ihtiyaç duymadan kullanıcı tarafından tanımlanan eşit parçaya içine hattını istediğini yapmalıdır. İşte düz bir çizginin basit bir örneği (düz olmayan ve çoklu çizgiler üzerinde de çalışır):

Basit çizgi

$lengthİfadede kullanarak uzunluğunu hesaplamak için bir sütun ekledim :

Çizgi özelliği

GRASS'tan v.split.length işlevini İşleme Araç Kutusu aracılığıyla kullanarak, çizgiyi toplam 4 parça yapması gereken 25m'lik bölümlere ayırmayı seçtim:

v.split.length işlevi

Daha sonra çıktı katmanının Uzunluk sütununu güncelledim ve uzunluğu yeniden hesaplamak için yukarıdakiyle aynı komutu kullandım:

Özellik sonucu

Hatayı neden aldığınızdan emin değilsiniz, satır katmanınızı kişilerin test etmesi için paylaşabilir misiniz?


Merhaba, Cevabınız için teşekkürler. Çalışıyor. Yine de, parça sayısını ölçülen uzunluktan hesaplamak zorunda olduğum için, çizgiyi uzunluğun kesirlerine bölmüyor, ancak iyi bir çözüm. Teşekkür ederim.
Gilles

2
"Maksimum segment uzunluğu" 25 olarak ayarlanırsa, neden 5 segmenti (25 çıktıdan 4'ü ve takım çıktısı eşit uzunluktaysa 1,86 veya 5'ten biri 20,372'den) 25'ten (25.465) daha uzun 4 segment elde ettiniz?
JR

1
@JR - Bu 5 yıl önce sormak iyi bir soru :). Buna bir cevabım yok, belki de eski bir QGIS sürümü olacağını düşünerek araçta bir hataydı. Ayrıca, CBS öğrenmenin ilk günlerinde olduğu gibi, metre cinsinden doğru mesafeleri ölçerken başka bir CRS kullanmalıydım!
Joseph

1
@Joseph, sanırım bugün PyQGIS'i seçeceksin, değil mi? =)
Taras

1
@Taras - Daha eğimli olurum, evet :)
Joseph

2

QGIS 2.18 ve QGIS 3.4 üzerinde test edilmiştir

Diyelim ki bir çoklu çizgi katmanı var "lines".

giriş

Ben bir "Sanal Katman" kullanarak önerebilirsiniz Layer > Add Layer > Add/Edit Virtual Layer...


Birkaç durum olabilir:


Durum 1. Çizgiyi eşit segmentlere ayırma, temel olarak kullanıcı tarafından tanımlanan eşit uzunluk.

Aşağıdaki Sorgu ile, sonuca ulaşmak mümkündür. Segment uzunluğunu artırmak / azaltmak için lütfen 1000 AS step_lengthgirişi ayarlayın -- configurations.

-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step_length/conf.length_line
FROM generate_sections, conf
WHERE sec + conf.step_length/conf.length_line <= 1
),

-- configurations
conf AS (
SELECT
0.0 AS start,
1.0 AS step,
1000 AS step_length,
ST_Length(l.geometry) AS length_line
FROM lines AS l
)

-- query
SELECT gs.id AS id,
        ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
        ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
GROUP BY gs.id

Çıktı Sanal Katman aşağıdaki gibi görünecektir

OUTPUT_1

Not: Eğer 'delta' (son kısa segmenti örneğin) dahil edilmemelidir, sonra insertWHERE sec_length >= step_lengthiçinde-- query, aşağıya bakınız

-- query
SELECT gs.id AS id,
        ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
        ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
WHERE seg_length >= step_length
GROUP BY gs.id

Durum 2. Çizgiyi belirli sayıda parçaya bölme

Aşağıdaki Sorgu ile, sonuca ulaşmak mümkündür. Segment sayısını artırmak / azaltmak için lütfen 8 AS sectionsgirişi ayarlayın -- configurations.

-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step
FROM generate_sections, conf
WHERE sec + conf.step < conf.sections
),

-- configurations
conf AS (
SELECT
8 AS sections,
0.0 AS start,
1.0 AS step
)

-- query
SELECT gs.id AS id,
    ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections) AS geom,
    ROUND(ST_Length(ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections)),2) AS seg_length
FROM generate_sections AS gs, lines AS l, conf
WHERE start + step < sections
GROUP BY gs.id

Çıktı Sanal Katman aşağıdaki gibi görünecektir

output_2

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.