ชั้นเวกเตอร์การอ้างอิงทางภูมิศาสตร์พร้อมจุดควบคุมโดยใช้ QGIS?


29

ฉันมีเลเยอร์เวกเตอร์ที่ไม่มีการอ้างอิงทางภูมิศาสตร์ที่ฉันจำเป็นต้องมีการอ้างอิงทางภูมิศาสตร์ ด้วยเลเยอร์แรสเตอร์งานง่ายและตรงไปตรงมา แต่ฉันไม่รู้ว่าฉันควรทำอย่างไรกับเลเยอร์เวกเตอร์ของฉัน ฉันมีจุดควบคุมบางจุดที่มีพิกัดที่รู้จักซึ่งควรเป็นพื้นฐานในการแปลงสภาพ สมมุติว่าฉันรู้จุดที่มี id-s ของ 1, 2 และ 3 ควรมีพิกัดของ x1, y1; x2, y2; x3, y3 อาจมีการหมุนและการแปลงสเกลนอกเหนือจากการเลื่อนแบบง่าย

ความคิดใด ๆ


คุณลองปลั๊กอิน qgsAffine แล้วหรือยัง คำถามที่คล้ายกันที่นี่: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner

ปลั๊กอิน Affine อาจทำการเปลี่ยนแปลง แต่คุณจำเป็นต้องรู้พารามิเตอร์การแปลงเพื่อใช้งาน คุณสามารถโพสต์พิกัดเวกเตอร์และพิกัดโลกแห่งความจริงที่สอดคล้องกันสำหรับสามคะแนนของคุณได้หรือไม่? N.
nhopton

คุณสามารถแปลง shapefile เป็น tiff โดยใช้ gdal_rasterize, georeference tiff แล้วแยกพารามิเตอร์จากไฟล์ world หรือไม่?
klewis

คำตอบ:


10

ในการอ้างอิงทางภูมิศาสตร์เลเยอร์เวกเตอร์ลองใช้ปลั๊กอิน qgsAffine

มีข้อมูลเพิ่มเติมที่จะหา qgsaffine ในเมนูได้ที่ไหน?


3
ขอบคุณสำหรับคำตอบ ฉันเดาว่าฉันต้องใช้ qgsAffine แล้วและหาพารามิเตอร์ transofrmation ด้วยตนเอง ฉันแค่หวังว่าจะมีวิธีที่จะทำให้กระบวนการนั้นเป็นไปโดยอัตโนมัติ บางทีฉันอาจลองเขียนรหัส Python เพื่อทำเช่นนั้น
AHaav

1
เมื่อพิจารณาถึงเรื่องนี้คุณอาจพบว่า GRASS v.transform (อยู่ในชุดเครื่องมือ Sextante) นั้นใช้งานได้ง่ายกว่าปลั๊กอิน qgsAffine N.
nhopton

1
ด้วยรูปลักษณ์ของมัน v.transform จะทำเงินก้อนให้คุณเช่นกันดูgrass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton

8

เนื่องจากข้อเท็จจริงที่ว่าคุณมีจุดควบคุมคุณควรจะสามารถใช้การแปลง Affine เพื่อเปลี่ยนข้อมูลเวกเตอร์ของคุณ ลองดูสูตรนี้ กระบวนการนี้เป็นกระบวนการสองส่วน:

  1. ใช้จุดควบคุมของคุณเพื่อกำหนดค่าสัมประสิทธิ์ของฟังก์ชันเลียนแบบของคุณที่ต้องการ
  2. รับค่าสัมประสิทธิ์และนำไปใช้กับ ST_Affine () เป็น postgis

หากคุณใส่จุดควบคุมลงในไฟล์ CSV (old_x, old_y, new_x, new_y) คุณสามารถวาง cut'n เพื่อวางคำสั่ง R จากลิงก์เพื่อแก้ปัญหาส่วนสัมประสิทธิ์


7

ฉันแนะนำปลั๊กอิน Vector Bender สำหรับ QGIS ฉันพยายามและใช้งานได้ดีและเป็นมิตรกับผู้ใช้ ขึ้นอยู่กับจำนวนคะแนนที่คุณกำหนดคุณสามารถทำได้:

  • การแปล: การแปลจากจุดเริ่มต้นไปยังจุดสิ้นสุด (1 คู่)
  • เครื่องแบบ: แปลปรับและหมุน (2 คู่)
  • ดัด: ความผิดปกติเพิ่มเติม (3 คู่หรือมากกว่า)

คุณพบวิดีโอสั้น ๆที่นี่และฉันแนะนำให้คุณอ่าน Vector Bender ช่วยเมื่อคุณติดตั้งปลั๊กอิน


ฉันเห็นด้วยปลั๊กอินของVector Vectorใช้งานง่ายและรวดเร็ว อย่างไรก็ตามฉันไม่สามารถจัดการกับกระจกเงา / พลิกเวกเตอร์ได้ สำหรับการดำเนินการนี้ฉันใช้ปลั๊กอินการแปลง Affine (QGIS v2.18)
jurajb

5

ด้วยการเปิดตัว GDAL 1.10 สิ่งนี้เป็นไปได้

มันทำโดยทำการแปลงขั้นพื้นฐานใน ogr2ogr และจัดหาจุดควบคุมในแท็ก -gcp http://www.gdal.org/ogr2ogr.html

สำหรับคำแนะนำโปรดดูที่: http://gisforthought.com/georeferencing-vector-data-using-qgis-and-ogr2ogr/


2

ฉันแค่ต้องทำอย่างนั้นและลงเอยด้วยการทำสิ่งนี้:

  1. ทำให้ shapefile ซ้ำอีกครั้ง
  2. การกำหนดตำแหน่งเชิงภาพแรสเตอร์โดยใช้ปลั๊กอิน Georeferencer
  3. บันทึก GCP เป็นgcps.pointsไฟล์
  4. คำนวณการแปลงเลียนแบบโดยใช้ไฟล์นี้
  5. ใช้การแปลง affine กับ Shapefile โดยใช้ qgsAffine

สคริปต์ต่อไปนี้คำนวณเมทริกการแปลงเลียนแบบโดยใช้ GCP ที่บันทึกไว้:

# Computes an affine transform based on QGis GCPs
# Usage: gcp_affine.py gcps.points

import csv
import sys
import numpy as np
from skimage.transform import AffineTransform

u = list(csv.DictReader(open(sys.argv[1], "rb")))
source = [(d["pixelX"], d["pixelY"]) for d in u]
dest = [(d["mapX"], d["mapY"]) for d in u]
source = [map(float, s) for s in source]
dest = [map(float, s) for s in dest]
source = np.array(source)
dest = np.array(dest)
aft = AffineTransform()
aft.estimate(source, dest)
np.set_printoptions(suppress=True)
print aft._matrix


2

จากความคิดเห็นของฉันเกี่ยวกับคำตอบของ Rayner GRASS v.transform ซึ่งสามารถเรียกใช้จากกล่องเครื่องมือ Sextante สามารถใช้ในการคำนวณพารามิเตอร์การแปลงและนำไปใช้กับเลเยอร์เวกเตอร์เพื่อทำการแปลงเลียนแบบ แฟ้มข้อความที่มีจุดควบคุมจะต้องอยู่ในรูปแบบที่แสดงที่นี่

มันใช้งานง่ายและทำงานได้ดี


บางทีฉันอายุมากขึ้น แต่ก็สงสัยว่าคนจำได้ว่าผู้ใช้ ShapeWarp addon ใน Arcview 3.0 มันใช้งานง่ายมาก ฉันพบเครื่องมืออื่น ๆ เหล่านี้ (v.transform / affine) ยุ่งยากกว่าเดิมมาก ไม่มีใครพยายามสร้างความสะดวกในการใช้ ShapeWarp บน QGIS อีกครั้งหรือไม่
Sharad

1

คำตอบหลายข้อที่ให้ไว้ในที่นี้ไม่ใช่ตัวเลือกสำหรับ QGIS 3 อีกต่อไปและ / หรืออนุญาตให้ทำการแปลงเชิงเส้นของไฟล์เวคเตอร์ที่อ้างอิงทางภูมิศาสตร์เท่านั้น นี่อาจตอบคำถามของ OP แต่คนอื่น ๆ ที่ดูโพสต์นี้อาจต้องการตัวเลือกการแปลงอื่นสำหรับไฟล์เวคเตอร์อ้างอิง

ปัญหาเกี่ยวกับวิธีแก้ไขปัญหาบางอย่างสำหรับไฟล์เวกเตอร์การอ้างอิงทางภูมิศาสตร์:

  • ปลั๊กอิน qgsAffine อนุญาตให้ทำการแปลงเชิงเส้นเท่านั้น ซึ่งหมายความว่าสามารถปรับขนาดหมุนและย้ายไฟล์เวกเตอร์ได้ แต่ไม่สามารถโค้งงอหรือบิดเวกเตอร์ไฟล์ได้ Georeferencer สำหรับไฟล์แรสเตอร์มีตัวเลือกเพิ่มเติมและอนุญาตให้มีการเปลี่ยนแปลงที่หลากหลายรวมถึงพหุนามลำดับที่สองและแผ่นบางแบบโค้ง นอกจากนี้ยังไม่ปรากฏว่าปลั๊กอิน qgsAffine ยังคงมีอยู่ใน QGIS 3

  • โมดูล GRASS v.transform คล้ายกับปลั๊กอิน qgsAffine และอนุญาตสำหรับการแปลงเชิงเส้นเท่านั้น

  • ปลั๊กอิน Vector Bender ดูเหมือนจะเป็นตัวเลือกที่ดี แต่ยังไม่ได้รับการย้ายไปยัง QGIS 3 อย่างสมบูรณ์ดังนั้นจึงยังไม่มีตัวเลือกในขณะนี้ ดูเหมือนว่ามันจะไม่ได้รับการบำรุงรักษาอีกต่อไป

ใช้ ogr2ogr ตามที่แนะนำในโพสต์ของ HeikkiVesanto เป็นตัวเลือกที่ดี อนุญาตให้ใช้ GCPs (จุดควบคุมภาคพื้นดิน) และระบุประเภทการแปลงที่คุณต้องการ ฉันไม่พบคำแนะนำเกี่ยวกับวิธีการทำเช่นนี้ดังนั้นฉันได้รวมคำแนะนำไว้ด้านล่าง:

  1. สร้างชุดคู่ GCP โดยมีจุดหนึ่งเป็นตำแหน่งดั้งเดิมในไฟล์เวกเตอร์ที่ไม่ได้รับการยืนยันและอีกจุดหนึ่งเป็นตำแหน่งที่ต้องการในพื้นที่ทำงานที่อ้างอิงทางภูมิศาสตร์ของคุณ

  2. มีหลายวิธีในการสร้าง GCP ฉันใช้ปลั๊กอิน Georeferencer GDAL ใน QGIS สามารถใช้งานได้ภายใต้เมนูแบบเลื่อนลง Raster หลังจากติดตั้งโดยใช้โปรแกรมจัดการปลั๊กอิน ใช้งานได้กับไฟล์แรสเตอร์เท่านั้นดังนั้นคุณต้องแปลงไฟล์เวคเตอร์เป็นไฟล์แรสเตอร์ก่อน สิ่งนี้เป็นไปได้ด้วย "กล่องเครื่องมือการประมวลผล: GDAL: การแปลงแบบเวกเตอร์: Rasterize (เวกเตอร์เป็นเชิงภาพ)" ตั้งค่าความละเอียดเป็นตัวเลขที่ยังคงให้คุณเห็นคุณสมบัติของไฟล์เวคเตอร์

  3. Georeferencer มีอินเทอร์เฟซที่ดีซึ่งทำให้คุณสามารถเพิ่มคะแนน GCP ได้มากมาย คุณสามารถทดสอบการเปลี่ยนแปลงต่าง ๆ และดูว่าแบบไหนดีที่สุด และคุณสามารถดูว่าคะแนน GCP ใด ๆ ของคุณมีแนวโน้มที่จะผิดพลาดหรือไม่โดยดูจากส่วนที่เหลือ เมื่อคุณเพิ่มคะแนน GCP ทั้งหมดของคุณแล้วและตรวจสอบว่าคุณชอบผลลัพธ์คุณสามารถส่งออกไฟล์ GCP จาก Georeferencer เพื่อใช้สำหรับการอ้างอิงทางภูมิศาสตร์ไฟล์เวกเตอร์ต้นฉบับ

  4. ไฟล์ GCP จะต้องมีการเปลี่ยนแปลงให้อยู่ในรูปแบบต่อไปนี้ คุณสามารถเพิ่มคะแนน GCP ได้มากเท่าที่คุณต้องการแต่ละจุดจะดำเนินการด้วย -gcp และคั่นด้วยช่องว่าง ฉันทำสิ่งนี้ด้วยคะแนน 800+ GCP และใช้งานได้ดี

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. มีหลายวิธีที่สามารถเปลี่ยนคะแนน GCP เป็นรูปแบบที่ถูกต้องได้ ฉันนำเข้าพวกเขาไปยัง Excel เป็นไฟล์ csv และสร้างคอลัมน์เพื่อส่งออกรูปแบบที่เหมาะสมสำหรับแต่ละจุด จากนั้นฉันวางคอลัมน์นั้นลงใน TextEdit และแทนที่บรรทัดที่ลงท้ายด้วยช่องว่าง

  2. ไฟล์เวกเตอร์ที่คุณต้องการระบุตำแหน่งควรนำเข้าสู่เวิร์กสเปซของคุณโดยใช้ SRS เดียวกับที่คุณต้องการสำหรับไฟล์อ้างอิงทางภูมิศาสตร์สุดท้ายซึ่งควรเป็น SRS เดียวกับเวิร์กสเปซของคุณ อาจเป็นวิธีที่ไกลจากจุดที่ควรใช้หาก แต่เดิมใช้ SRS อื่น แต่การแปลงจะย้ายไปยังตำแหน่งที่ถูกต้อง

  3. เข้าถึง ogr2ogr ผ่าน "กล่องเครื่องมือประมวลผล: GDAL: การแปลงเวกเตอร์: แปลงรูปแบบ" สิ่งนี้อนุญาตให้คุณเลือกไฟล์เวคเตอร์ที่คุณต้องการระบุตำแหน่งและไฟล์เอาต์พุตของคุณ ในฟิลด์ "ตัวเลือกการสร้างเพิ่มเติม" ให้เพิ่มคำสั่งเพื่อระบุประเภทการแปลงที่คุณต้องการจากนั้นให้สอดคล้องกับคะแนน GCP ทั้งหมดของคุณ

  4. คำสั่งสำหรับการแปลงรูปแบบต่าง ๆ ได้แก่ :

    • "- สั่ง 1" สำหรับเชิงเส้น
    • "-order 2" สำหรับพหุนามลำดับที่สอง
    • "-order 3" สำหรับพหุนามลำดับที่สาม
    • "-tps" สำหรับ Thin Plate Spline
  5. ตัวอย่างเช่นรหัสที่เพิ่มลงในฟิลด์ "ตัวเลือกการสร้างเพิ่มเติม" อาจมีลักษณะดังนี้:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.