Có cách nào để auto_increment cho cột ID trong QGIS


22

Tôi đang tạo một bản đồ hư cấu và vì vậy tôi cần tạo nhiều điểm, đường thẳng và chắc chắn là đa giác. Sau này tôi xuất dữ liệu của mình dưới dạng Geojson. Nhưng trước đó tôi phải đi và cung cấp cho mỗi phần tử một ID duy nhất.

Tôi không cần một sự sắp xếp đặc biệt, như đa giác lớn nhất có ID nhỏ nhất hoặc hơn thế. Tôi chỉ cần tất cả các đa giác với một ID ở cuối, mà không làmbằng tay như tôi phải làm gì bây giờ.

Sẽ thật tuyệt nếu ai đó biết cách làm điều đó.


Bạn đang sử dụng shapefiles? Do ID phải giống nhau sau mỗi lần xuất hoặc bạn có thể điền vào trường ID sau mỗi phiên chỉnh sửa không?
DPSSpatial

Làm thế nào bạn tạo các đa giác từ một tập lệnh, số hóa trong máy tính để bàn của QGIS hoặc sao chép từ một shapefile, v.v.?
Landocalrissian

Vâng, tôi tạo một hình dạng trong QGIS, Lưu dưới dạng Geojson và nó ổn. Xin lỗi có lẽ tôi đã nhận được câu hỏi của bạn một cách sai?
kwoxer

Câu trả lời:


26

Sử dụng máy tính trường là cách để đi:

Không có ID nào được đưa ra

  1. Số hóa mọi tính năng mà không cần nhập bất kỳ Id nào.
  2. Trước khi xuất, hãy cập nhật Id duy nhất với biểu thức, '$ Id' bằng máy tính trường.

Không có ID

Một số ID đã được cung cấp trong

  1. Nếu bạn đã có ID, bạn có thể sử dụng '- $ Id'. Đảm bảo bạn chỉ chọn các Tính năng mới có nghĩa là 'NULL' trong hàng id. Đơn giản chỉ cần làm điều đó bằng cách đặt hàng cột.
  2. Bây giờ làm các bước từ hình ảnh:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Vâng, tuyệt vời. Siêu dễ dàng và làm việc đúng cách. Cảm ơn người đàn ông. Btw: có lẽ bạn biết làm thế nào để làm điều đó trên một số ID hiện có? NẾU tôi làm điều này, tôi nhận được -2 -3 và cứ thế
kwoxer

Tìm thấy một giải pháp và thêm nó vào bài viết của bạn. Cảm ơn một lần nữa.
kwoxer

6

Hallelujah! Hoặc Eureka. Hay bất cứ cái gì. Điều này có thể thực hiện được. Với một shapefile.

  1. Nếu chưa có, hãy thêm một trường để chứa id tính năng, nói "FID", loại Toàn bộ số (số nguyên) .
  2. Mở Thuộc tính lớp (nhấp chuột phải vào lớp và chọn Thuộc tính ... hoặc nhấp đúp vào lớp), nhấp vào tab Thuộc tính biểu mẫu , sau đó bên dưới bỏ chọn Chung có thể chỉnh sửa và trong Mặc định trong trường Loại giá trị mặc địnhmaximum("FID") + 1 .

Bằng cách bỏ chọn Có thể chỉnh sửa , bạn không thể nhập giá trị khác hoặc xóa những gì ở đó. Lưu ý rằng nếu có các giá trị không có ID, các giá trị này sẽ không được cập nhật. Tại một số điểm, tôi sẽ thử nghiệm Áp dụng giá trị mặc định khi cập nhật và sửa đổi công thức của mình để kiểm tra giá trị 0 hoặc NULL để chỉ cập nhật những bản ghi đó khi chúng được chỉnh sửa, không phải bất kỳ bản ghi nào có giá trị lớn hơn 1. (Trước đó gửi nó đã được thảo luận về cách cập nhật trường FID với các giá trị duy nhất, bạn sẽ cần phải làm gì nếu bạn đã thêm trường sau khi đã có các tính năng trong shapefile.)

Lưu ý rằng điều này được lưu với tệp bản đồ hiện tại, không phải là shapefile, vì vậy việc thêm shapefile đó nhiều lần sẽ yêu cầu bạn sao chép phần đó của kiểu lớp sang lớp mới được thêm vào. Để thực hiện việc này, nhấp chuột phải vào lớp, chọn Kiểu> Sao chép Kiểu> Trường và bấm chuột phải vào lớp khác, chọn Kiểu> Dán Kiểu> Tất cả Danh mục Kiểu (hoặc tiếp tục đến Trường ). Bạn cũng có thể sao chép phần đó của kiểu sang bất kỳ lớp nào khác dựa trên shapefile, nhưng trường ID phải có cùng tên với lớp bạn đang sao chép.

Thuộc tính lớp


Lưu ý rằng để điều này hoạt động, ít nhất bạn phải tạo một tính năng và nhập FID của nó sau đó thay đổi biểu mẫu thuộc tính Giá trị mặc định. Nếu không, bạn kết thúc với một FLL NULL.
Techie_Gus

4

Chủ đề này đã được đưa ra ở đây: Tạo Shapefile với khóa chính tăng tự động trong QGIS

Gợi ý của tôi sẽ là:

1) Cơ sở dữ liệu SQLITE / SpatialLite hỗ trợ tự động tăng trên một trường được đặt thành KEY PRIMARY KEY:

Trên một CHERTN, nếu cột ROWID hoặc INTEGER PRIMARY KEY không được cung cấp một giá trị rõ ràng, thì nó sẽ được điền tự động với một số nguyên không sử dụng, thường là một số nhiều hơn ROWID lớn nhất hiện đang sử dụng. Điều này đúng bất kể có sử dụng từ khóa AUTOINCREMENT hay không.

Mỗi lần bạn chỉnh sửa / tạo đa giác, bạn có thể điền vào các thuộc tính của chúng và SQLITE sẽ cung cấp cho nó một giá trị duy nhất tăng dần trong trường bạn đã đặt thành loại KEY INTIMER PRIMARY KEY.

Khi bạn đã sẵn sàng xuất sang GEOJSON, bạn đã sẵn sàng với ID UNIQUE của mình.

2) Nếu sử dụng Shapefiles, hãy tạo trường OBRIID loại INTEGER và sử dụng biểu thức máy tính trường để điền vào trường đó mỗi khi bạn chỉnh sửa / tạo đa giác và cần xuất chúng. Bạn sẽ mất ID gốc mà một đa giác đã từng có, nhưng bạn đây là cách duy nhất để đạt được điều này bằng cách sử dụng .SHP. (Tôi sẽ phải tìm biểu thức tính toán trường).

PostGIS là một nguồn dữ liệu khác mà bạn có thể muốn khám phá, mặc dù có sức nâng lớn hơn SQLITE, bạn có thể tìm thấy giá trị trong một hệ thống như vậy khi bạn tiến về phía trước ...


Cảm ơn vì đã giải thích. Nhưng tôi không nghĩ nó sẽ là giải pháp tốt thay vì tùy chọn auto_increment trực tiếp trong công cụ. Tôi đã có rất nhiều định dạng dữ liệu và không muốn có một công cụ khác. Có lẽ tôi nên viết một addon cho điều đó khi tôi có thời gian ...
kwoxer

Có thể dễ dàng hơn khi từ bỏ .SHP! Ai biết được những dự án mới nào sẽ đưa bạn vào ...
DPSSpatial

4

Tôi muốn thêm vào bài viết của vinayan và đề cập ngắn gọn về chức năng rownum , vì nó rất giống nhau và trong một số trường hợp có thể thuận tiện hơn một chút.

nhập mô tả hình ảnh ở đây

id trả về ID tính năng , nghĩa là nó luôn bắt đầu từ 0 .
rownum trả về số của hàng , có nghĩa là nó bắt đầu từ một .

nhập mô tả hình ảnh ở đây

Vì vậy, về cơ bản, nếu bạn muốn tăng tự động bắt đầu từ 0, hãy chuyển sang $ id và nếu bạn muốn nó bắt đầu từ 1 thì hãy chuyển sang $ rownum .


Đã thử và cũng là một giải pháp tốt. Nhưng với giải pháp này ở đây nếu bạn đã có một số ID và muốn giữ chúng thì chức năng rownum không tốt. Chức năng đó luôn bắt đầu bằng 1. Cách trên là cách thông minh hơn mặc dù khó thiết lập hơn. Vì vậy, cảm ơn bạn đã thay thế nhưng bây giờ chức năng ID là giải pháp ưa thích của tôi =)
kwoxer

2

Bài đăng cũ nhưng đối với bất kỳ ai khác đang tìm kiếm giải pháp nhanh chóng của tôi là tạo một trường có $ ID + 1 và nó sẽ tự động tạo bắt đầu bằng 1!


2

Cập nhật cho QGIS 3

Tôi biết tôi khá muộn với điều này nhưng luôn luôn tốt để đưa ra bất kỳ cập nhật nào:

Trong QGIS 3 hiện có một công cụ gốc có thể được sử dụng để thực hiện công việc chính xác này và nó được gọi là "Thêm trường tự động"

Không cần sử dụng một biểu thức trong máy tính trường hoặc thực hiện bất kỳ mã hóa nào, tuy nhiên những thứ này vẫn rất hữu ích và tốt để biết.

nhập mô tả hình ảnh ở đây


1

Cách dễ nhất để làm điều này có thể là với một kịch bản python hoặc có thể là với máy tính trường. Xin lỗi tôi không có một cái cho bạn, có thể người khác sẽ làm. Trong khi đó, tôi sẽ tìm kiếm một kịch bản python cho nó. Tôi đã thấy rất nhiều về điều này cho ArcGIS, nhưng tôi chắc chắn có một cái gì đó ngoài kia cho QGIS.


Tốt nhất sẽ là nếu thực sự không có gì, một yêu cầu tính năng. Tôi cũng không muốn tập lệnh python bổ sung cho QGIS nếu đó có thể là giải pháp một cú nhấp chuột. Nhưng cảm ơn bạn.
kwoxer

1

Nếu bạn không cần thứ gì đó dễ tiêu hóa, giờ đây có một cách khắc phục dễ dàng: Trong các dự án hiện trường, chọn "Trình tạo UUID" và để trống mọi thứ.

Điều này sẽ tự động tạo một UUID trong trường. Không thân thiện như một số đơn giản (theo $ id hoặc $ rownum), nhưng tạo UUID ngay từ đầu, do đó không có các bước tiếp theo.nhập mô tả hình ảnh ở đây


0

Tôi muốn thêm rằng điều này dường như không hoạt động khi bạn đang sử dụng một lớp cơ sở dữ liệu postgreSQL. $ ID và $ rownum đều trả về 0. PostgreSQL 9.6 QGIS 2.18.12


0

những giải pháp này không còn hiệu quả với tôi trong QGIS 2.01 Dufour. Nhập $idvào một trường mới hoặc hiện có tên 'id' trong trường nhập biểu thức cho tôi một lỗi "Biểu thức không hợp lệ"

Những gì đã làm là gõ hàm $rownumvà sau đó nhấp vào "OK"

nhập mô tả hình ảnh ở đây


0

bạn chỉ có thể xóa colmn (id) đầu tiên và tạo một cái mới "Như trường ảo" nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.