มีวิธี auto_increment สำหรับคอลัมน์ ID ใน QGIS หรือไม่


22

ฉันกำลังสร้างแผนที่ที่สมมติขึ้นดังนั้นฉันจึงต้องสร้างจุดเส้นและรูปหลายเหลี่ยมจำนวนมาก หลังจากนั้นฉันส่งออกข้อมูลเป็น geojson แต่ก่อนหน้านั้นฉันต้องทำอย่างนั้นและให้ ID ทุกองค์ประกอบมีเอกลักษณ์

ฉันไม่ต้องการการจัดเรียงพิเศษเช่นรูปหลายเหลี่ยมที่ใหญ่ที่สุดจะได้ ID ที่เล็กที่สุด ฉันเพียงแค่ต้องการทุกรูปหลายเหลี่ยม กับIDที่สิ้นสุดโดยไม่ต้อง ทำมันด้วยตัวเองเหมือนที่ผมต้องทำตอนนี้

คงจะดีมากถ้ามีคนรู้วิธีที่จะทำ


คุณกำลังใช้รูปร่างหรือไม่ ID ต้องเหมือนกันทุกครั้งหลังจากการส่งออกหรือคุณสามารถเติมฟิลด์ ID หลังจากการแก้ไขทุกครั้งได้หรือไม่
DPSSpatial

คุณสร้างรูปหลายเหลี่ยมจากสคริปต์แปลงเป็นข้อมูลดิจิทัลในเดสก์ท็อป QGIS หรือคัดลอกจากรูปร่างไฟล์ ฯลฯ ได้อย่างไร
landocalrissian

ฉันสร้างรูปร่างใน QGIS, บันทึกเป็น Geojson และใช้ได้ ขออภัยฉันได้รับคำถามของคุณในทางที่ผิด?
kwoxer

คำตอบ:


26

การใช้เครื่องคำนวณภาคสนามเป็นวิธีที่จะดำเนินการ:

ไม่มีการระบุ ID

  1. แปลงเป็นรูปแบบทุกคุณสมบัติโดยไม่ต้องป้อนรหัสใด ๆ
  2. ก่อนที่จะส่งออกให้อัปเดตรหัสเฉพาะด้วยนิพจน์ '$ Id' โดยใช้เครื่องคำนวณภาคสนาม

ไม่ได้รับ ID

บาง ID ได้รับมาแล้ว

  1. หากคุณมี ID อยู่แล้วคุณสามารถใช้ '- $ Id' ตรวจสอบให้แน่ใจว่าคุณเพียงแค่เลือกฟีเจอร์ใหม่สิ่งที่มีความหมายว่า 'NULL' ในแถว id ทำได้โดยการสั่งซื้อคอลัมน์
  2. ตอนนี้ทำตามขั้นตอนจากภาพ:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


ใช่น่ากลัว ง่ายสุด ๆ และทำงานอย่างถูกต้อง ขอบคุณชาย Btw: บางทีคุณอาจรู้วิธีการทำเช่นนั้นกับบาง ID ที่มีอยู่แล้ว? ถ้าฉันทำเช่นนี้ฉันจะได้รับ -2 -3 และต่อไป
kwoxer

พบวิธีแก้ไขและเพิ่มลงในโพสต์ของคุณ ขอบคุณอีกครั้ง.
kwoxer

6

Hallelujah! หรือยูเรก้า หรืออะไรก็ตาม สิ่งนี้สามารถทำได้ ด้วย Shapefile

  1. ถ้าไม่มีแล้วหนึ่งเพิ่มเขตข้อมูลจะมีรหัสคุณลักษณะพูดว่า "FID" ประเภทจำนวนทั้งหมด (จำนวนเต็ม)
  2. เปิดคุณสมบัติชั้น (คลิกขวาบนชั้นและเลือกProperties ...หรือดับเบิลคลิกที่เลเยอร์) คลิกที่แอตทริบิวต์แบบแท็บแล้วภายใต้ทั่วไปยกเลิกการเลือกที่สามารถแก้ไขได้และอยู่ภายใต้ค่าเริ่มต้นในฟิลด์ค่าเริ่มต้นmaximum("FID") + 1ประเภท

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

โปรดทราบว่าสิ่งนี้ถูกบันทึกไว้ด้วยไฟล์แผนที่ปัจจุบันไม่ใช่ shapefile ดังนั้นการเพิ่ม Shapefile หลายครั้งคุณจะต้องคัดลอกส่วนของสไตล์เลเยอร์นั้นไปยังเลเยอร์ที่เพิ่งเพิ่มเข้าไปใหม่ โดยคลิกขวาที่เลเยอร์เลือกสไตล์> คัดลอกสไตล์> ฟิลด์และคลิกขวาที่เลเยอร์อื่นเลือกสไตล์> วางสไตล์> หมวดหมู่สไตล์ทั้งหมด (หรือไปที่ฟิลด์ ) คุณยังสามารถคัดลอกส่วนของสไตล์นั้นไปยังเลเยอร์อื่น ๆ ที่ขึ้นอยู่กับรูปร่างไฟล์ได้ แต่ฟิลด์ ID ต้องมีชื่อเดียวกับเลเยอร์ที่คุณกำลังคัดลอกมา

คุณสมบัติเลเยอร์


โปรดทราบว่าเพื่อให้สิ่งนี้ใช้งานได้คุณจะต้องสร้างสถานที่และพิมพ์ FID อย่างน้อยหนึ่งรายการจากนั้นเปลี่ยนรูปแบบแอตทริบิวต์ค่าเริ่มต้น มิฉะนั้นคุณจะจบลงด้วย NULL FID
Techie_Gus

5

ฉันต้องการที่จะเพิ่มไปยังโพสต์ของ vinayan และพูดถึงฟังก์ชั่นrownumสั้น ๆเพราะมันคล้ายกันมากและในบางกรณีอาจสะดวกกว่าเล็กน้อย

ป้อนคำอธิบายรูปภาพที่นี่

idส่งคืน Feature IDซึ่งหมายความว่าจะเริ่มต้นที่ศูนย์เสมอ
rownumส่งกลับจำนวนของแถวหมายความว่ามันเริ่มต้นที่หนึ่ง

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นโดยทั่วไปถ้าคุณต้องการเพิ่มโดยอัตโนมัติจะเริ่มต้นที่ 0 ไปสำหรับ$ IDและถ้าคุณต้องการที่จะเริ่มต้นวันที่ 1 ไปแล้วสำหรับ$ rownum


พยายามและเป็นทางออกที่ดีอย่างแน่นอน แต่ด้วยวิธีนี้ถ้าคุณมี ID อยู่แล้วและต้องการให้พวกเขาฟังก์ชั่น rownum ไม่ดี ฟังก์ชั่นนั้นมักจะเริ่มต้นด้วย 1 วิธีที่กล่าวมาข้างต้นนับเป็นวิธีที่ฉลาดกว่าแม้ว่าจะตั้งค่าได้ยาก ดังนั้นขอบคุณสำหรับทางเลือก แต่สำหรับตอนนี้ฟังก์ชั่น ID เป็นวิธีที่ต้องการของฉัน =)
kwoxer

4

หัวข้อนี้เกิดขึ้นที่นี่: สร้าง Shapefile ด้วยคีย์หลักที่เพิ่มขึ้นอัตโนมัติใน QGIS

คำแนะนำของฉันจะเป็น:

1) ฐานข้อมูล SQLITE / SpatialLite รองรับการเพิ่มขึ้นอัตโนมัติในฟิลด์ที่กำหนดเป็น INTEGER Primary KEY:

บน INSERT หากคอลัมน์ ROWID หรือ INTEGER KEY KEY ไม่ได้รับค่าอย่างชัดเจนมันจะถูกเติมโดยอัตโนมัติด้วยจำนวนเต็มที่ไม่ได้ใช้ซึ่งโดยปกติจะเป็นหนึ่งใน ROWID ที่ใหญ่ที่สุดที่ใช้งานอยู่ สิ่งนี้เป็นจริงไม่ว่าจะใช้คำหลัก AUTOINCREMENT หรือไม่

แต่ละครั้งที่คุณแก้ไข / สร้างรูปหลายเหลี่ยมคุณสามารถกรอกแอตทริบิวต์ของพวกเขาและ SQLITE จะให้ค่าที่ไม่ซ้ำกันที่เพิ่มขึ้นในฟิลด์ที่คุณตั้งค่าเป็น INTEGER Primary KEY type

เมื่อคุณพร้อมที่จะส่งออกไปยัง GEOJSON คุณก็พร้อมด้วย UNIQUE ID ของคุณ

2) หากใช้ Shapefiles ให้สร้างฟิลด์ OBJECTID เป็นประเภท INTEGER และใช้นิพจน์เครื่องคิดเลขเพื่อเติมข้อมูลในฟิลด์นั้นทุกครั้งที่คุณแก้ไข / สร้างรูปหลายเหลี่ยมและต้องการส่งออก คุณจะสูญเสีย ID ดั้งเดิมที่เป็นรูปหลายเหลี่ยมที่ครั้งหนึ่งเคยมีมา แต่คุณเป็นวิธีเดียวที่จะบรรลุผลนี้โดยใช้. HP (ฉันจะต้องค้นหานิพจน์เครื่องคำนวณภาคสนาม)

PostGIS เป็นแหล่งข้อมูลอื่นที่คุณอาจต้องการสำรวจแม้ว่าจะมีลิฟท์หนักกว่า SQLITE มากกว่าคุณอาจพบคุณค่าในระบบเช่นนี้เมื่อคุณก้าวไปข้างหน้า ...


ขอบคุณที่อธิบาย แต่ฉันไม่คิดว่ามันจะเป็นทางออกที่ดีแทนที่จะเป็นตัวเลือก auto_increment ในเครื่องมือโดยตรง ฉันมีรูปแบบข้อมูลจำนวนมากอยู่แล้วและไม่ต้องการเครื่องมืออื่นอีก บางทีฉันควรจะเขียน
แอดออ

มันอาจจะง่ายกว่าที่จะละทิ้ง. HP! ใครจะรู้ว่ากิจการใหม่จะนำคุณไปสู่ใคร ...
DPSSpatial

2

โพสต์เก่า แต่สำหรับคนอื่น ๆ ที่กำลังมองหาวิธีการแก้ปัญหาที่รวดเร็วของฉันคือการสร้างฟิลด์ที่มี $ ID + 1 และมันจะสร้างโดยอัตโนมัติโดยเริ่มจาก 1!


2

อัพเดทสำหรับ QGIS 3

ฉันรู้ว่าฉันมาสายค่อนข้างนี้ แต่ก็ดีเสมอที่จะให้การอัปเดตใด ๆ :

ใน QGIS 3 ขณะนี้มีเครื่องมือเนทีฟซึ่งสามารถใช้ในการทำงานที่แน่นอนและเรียกว่า "เพิ่มฟิลด์ autoincremental"

ไม่จำเป็นต้องใช้นิพจน์ในเครื่องคิดเลขภาคสนามหรือทำการเข้ารหัสใด ๆ แต่อย่างไรก็ตามสิ่งเหล่านี้ยังคงมีประโยชน์และน่ารู้

ป้อนคำอธิบายรูปภาพที่นี่


1

วิธีที่ง่ายที่สุดในการทำเช่นนี้อาจเป็นสคริปต์ไพ ธ อนหรืออาจเป็นไปได้กับเครื่องคำนวณภาคสนาม ขออภัยฉันไม่มีสำหรับคุณบางทีคนอื่นจะ ในระหว่างนี้ฉันจะค้นหาสคริปต์ไพ ธ อน ฉันเห็นสิ่งนี้มากมายสำหรับ ArcGIS แต่ฉันแน่ใจว่ามีบางสิ่งที่นั่นสำหรับ QGIS


จะดีที่สุดถ้าไม่มีอะไรจริงๆคำขอคุณสมบัติ ฉันไม่ต้องการสคริปต์ python เพิ่มเติมให้กับ QGIS ด้วยหากอาจเป็นวิธีการแก้ปัญหาแบบคลิกเดียว แต่ขอบคุณ.
kwoxer

1

หากคุณไม่ต้องการสิ่งที่ย่อยได้อย่างมนุษย์ปุถุชนตอนนี้มีวิธีแก้ไขที่ง่าย ๆ : ในส่วนของฟิลด์เลือก "ตัวสร้าง UUID" และปล่อยให้ทุกอย่างว่างเปล่า

สิ่งนี้จะสร้าง UUID ในฟิลด์โดยอัตโนมัติ ไม่เป็นมิตรกับตัวเลขอย่างง่าย (ตาม $ id หรือ $ rownum) แต่สร้าง UUID ตั้งแต่เริ่มต้นดังนั้นจึงไม่มีขั้นตอนต่อเนื่องป้อนคำอธิบายรูปภาพที่นี่


0

ฉันต้องการเพิ่มว่าดูเหมือนจะไม่ทำงานเมื่อคุณใช้เลเยอร์ฐานข้อมูล postgreSQL $ ID และ $ rownum ทั้งหมดส่งคืน 0 PostgreSQL 9.6 QGIS 2.18.12


0

โซลูชันเหล่านี้ใช้ไม่ได้กับ QGIS 2.01 Dufour อีกต่อไป การพิมพ์$idบนฟิลด์ใหม่หรือที่มีอยู่ชื่อ 'id' ในฟิลด์อินพุตนิพจน์ทำให้ฉันมีข้อผิดพลาด "นิพจน์ไม่ถูกต้อง"

สิ่งที่ทำงานคือการพิมพ์ฟังก์ชั่น$rownumแล้วคลิก "ตกลง"

ป้อนคำอธิบายรูปภาพที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.