Làm cách nào để chỉ định các trường để xuất từ ​​QGIS?


9

Tôi đang sử dụng QGIS 2.0.1 và được kết nối với cơ sở dữ liệu MS SQL Server được kích hoạt không gian (không phải ESRI). Tôi có thể kết nối với lớp và tải nó vào TOC của tôi tốt. Tôi đã ẩn một số lĩnh vực không quan trọng vì mục đích hiển thị.

Bây giờ tôi muốn xuất dữ liệu đó sang loại dữ liệu khác (chúng tôi sẽ sử dụng shapefile cho ví dụ này). Khi tôi nhấp chuột phải vào lớp, chọn "Lưu dưới dạng" và xác định tệp đầu ra, tôi gặp lỗi sau:

Xuất thành tập tin vector không thành công. Lỗi: loại không được hỗ trợ cho trường GlobalID

Lưu ý 1 : Nếu tôi chọn "Bỏ qua việc tạo thuộc tính" trong hộp thoại, shapefile được tạo không có lỗi.

Lưu ý 2 : ArcGIS không gặp phải vấn đề này, nó chỉ chuyển đổi trường GUID thành loại "TEXT".

Nhìn vào bảng, một trong những trường mà tôi đã ẩn là một GUID loại SQL < uniqueidentifier >, rất có thể là thủ phạm. Trong một nỗ lực để giải quyết điều này, tôi đã làm cho trường "ẩn". Tôi đã có thể giả định rằng vì trường bị ẩn, QGIS sẽ không cố xuất trường này, nhưng hóa ra không phải vậy.

Bạn có thể xác định các lĩnh vực bạn muốn xuất từ ​​QGIS không?

Có thể cho QGIS chỉ xuất các trường "Hiển thị" không? Hoặc có một cách khác để làm điều này từ QGIS (có thể xác định các trường thông qua truy vấn ogr2ogr)? Điều này có vẻ như là một thiếu sót của QGIS nếu tôi không thể xác định trường nào sẽ xuất.

CẬP NHẬT: Tôi đã thực hiện một thử nghiệm bằng cách sử dụng một shapefile mẫu để xem liệu tôi có thể giới hạn các trường đầu ra không. Dòng lệnh ogr2ogr sau đây đã hoạt động và loại bỏ tất cả các trường ngoại trừ "name":

ogr2ogr -f "ESRI Shapefile" test.shp city.shp -sql "select name from city"

nhưng sử dụng QGIS và thêm:

-sql "select name from city"

đến phần "lớp" của hộp thoại "Lưu dưới dạng" không dẫn đến một shapefile chỉ với một trường duy nhất. Vì vậy, tôi không thực sự thấy làm thế nào tôi có thể thao tác đầu ra tệp để chỉ hiển thị một vài trường được chọn. Bất kỳ trợ giúp được đánh giá cao.


Nếu ogr2ogr có thể làm điều đó, thì QGIS có thể, bởi vì đó chính xác là công cụ đang chạy trong nền. Thật không may, tôi không có db SQL Server để kiểm tra ...
underdark

Đúng. Vì vậy, tôi đã thử thêm -sql "select <fields> from <table>"(không bao gồm trường GlobalID từ <trường>) vào phần "Lớp" của hộp thoại "Lưu dưới dạng", nhưng vẫn xuất hiện lỗi tương tự. Tôi đã sử dụng sai khối mã này, hay đây là một lỗi?
RyanKDalton

câu trả lời này gợi ý -chọn thay vì -sql gis.stackexchange.com/questions/30691/ mẹo ... Tôi nghĩ rằng nó đi vào phần nguồn dữ liệu, không phải vào lớp.
underdark

Không có may mắn cho tôi với một trong những gợi ý của bạn, tôi cũng đã thử nhiều kết hợp của cả hai tùy chọn -select & -sql trong cả hai trường "Lớp" và "Nguồn dữ liệu" của "tùy chọn tạo OGR" :( Chắc chắn, tôi không thể cái đầu tiên có nhu cầu xuất một tập hợp con các trường ...
RyanKDalton

có thể đáng để kiểm tra với các nhà phát triển. có thể là một lỗi
underdark

Câu trả lời:


1

Nếu nó hoạt động cho bạn trong dòng lệnh với ogr2ogr, tôi nghĩ đó là giải pháp tốt nhất để sử dụng nó. Bạn có thể viết một tập tin bat đơn giản để tạo một shapefile từ cơ sở dữ liệu MSSQL của bạn. Rõ ràng là bạn không thể chỉnh sửa dữ liệu và lưu lại máy chủ theo cách đó.

QGIS có các hộp đầu vào Nguồn dữ liệu và Lớp, nhưng chúng chỉ dành cho các tham số -dsco và -lco của ogr2ogr. Trình điều khiển shapefile OGR không có DSC hoặc lco hữu ích cho nhu cầu của bạn:

http://www.gdal.org/ogr2ogr.html

http://www.gdal.org/ogr/drv_shapefile.html

Ngoài ra, có thể viết một plugin python yêu cầu dữ liệu từ máy chủ bằng lệnh SQL SELECT theo nhu cầu của bạn. Điều này thậm chí sẽ cho phép chỉnh sửa dữ liệu.


Cho đến nay điều này có vẻ như là ý tưởng khả thi nhất. Có cách nào để gọi trực tiếp dòng lệnh ogr2ogr từ giao diện người dùng QGIS để cuộn cú pháp ogr2ogr của riêng bạn không?
RyanKDalton

Không trực tiếp. Nhưng bạn có thể chiếm quyền điều khiển thiết bị đầu cuối của gdalwarp để nhập lệnh ogr2ogr của bạn vào đó. Bạn nhận được một lỗi rằng lớp không được tạo, nhưng dù sao nó cũng nằm trong hệ thống tệp. Không chắc chắn điều gì xảy ra nếu tập tin đã tồn tại, do đó, add -overwrite cũng tốt hơn. Và tốt hơn là sử dụng tên đường dẫn đầy đủ cho các tập tin.
AndreJ

Ngoài ra, bạn đã bao giờ thử sử dụng tệp ảo GDAL VRT làm trung gian hòa giải giữa MSSQL và QGIS chưa?
AndreJ

Tôi không có, nhưng không phải là GDAL để làm việc với các raster? Tôi đang làm việc với một lớp vectơ điểm. Mặc dù vậy, tôi thích ý tưởng về một "bảng ảo". Không phải QGIS 2 có lớp trong bộ nhớ mà chúng ta có thể ghi vào?
RyanKDalton

1
Ngoài ra còn có trình điều khiển ogrvrt GDAL: gdal.org/ogr/drv_vrt.html . Nhưng tôi nghĩ điều này tốt hơn nên đặt vào một câu hỏi khác.
AndreJ

0

Tôi sẽ đề nghị bạn kiểm tra bảng thuộc tính cho lớp trong TOC và nếu trường GlobalID tồn tại. Chuyển sang chế độ chỉnh sửa, xóa cột tạo ra sự cố trong khi xuất và đóng cửa sổ. Sau đó lưu dưới dạng shapefile hoặc bất kỳ định dạng đầu ra nào bạn muốn. Tôi hi vọng cái này giúp được.


1
Tôi không chắc chắn nếu xóa trường trong bảng SQL Server là một lựa chọn tốt. Nó vẫn có thể được máy chủ cần.
AndreJ

Tôi nghĩ rằng việc xóa một cột thuộc tính khỏi Lớp QGIS TOC lưu cấu trúc được cập nhật trong bộ đệm QGIS và cho phép bạn xuất tệp ở định dạng khác. khi bạn kết thúc xuất, đừng lưu các thay đổi vào lớp (những gì bạn đã xóa)
Farhat Abbas
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.