Trình tạo OGR trả về TypeError


9

Tôi đang cố gắng tạo một lớp shapefile dựa trên hình chiếu không gian của một raster đã tồn tại. (Cuối cùng, điều này sẽ được sử dụng trong gdal.Polygonize để lấy hình từ dữ liệu raster của tôi.) Tuy nhiên, tôi gặp phải một lỗi khi cố gắng sử dụng CreatLayer.

  • raster_uri- vị trí của tệp raster mà tôi muốn tạo thành một shapefile. Tôi biết điều này tồn tại.
  • out_uri- Vị trí tôi muốn shapefile mới in.
  • layer_name- Nhập tên lớp chuỗi.
  • tệp_name- Nhập tên trường chuỗi.

Đây là mã mà tôi đang sử dụng.

raster = gdal.Open(raster_uri)
driver = ogr.GetDriverByName("ESRI Shapefile")
ds = driver.CreateDataSource(out_uri)

spat_ref = osr.SpatialReference()
proj = raster.GetProjectionRef()
spat_ref.ImportFromWkt(proj)

layer = ds.CreateLayer(layer_name, spat_ref, ogr.wkbPolygon)

Nó mang lại thông báo lỗi này:

TypeError: in method 'DataSource_CreateLayer', argument 2 of type 'char const *'

Xuất ra loại spat numf xuất hiện vì <class 'osgeo.osr.SpatialReference'>vậy tôi không chắc chắn char char * nó đang phàn nàn về điều gì.

Thật thú vị, nếu tôi cố gắng làm tất cả điều này từ một vỏ python bằng cùng một tệp, lớp sẽ tạo ra tốt. Bất kỳ ý tưởng về những gì có thể là vấn đề?

Câu trả lời:


10

Khi nó bật ra, việc tạo một tên lớp trên shapefile ESRI không thể được thực hiện bằng chuỗi unicode. Kể từ khi quay trở lại hệ thống tệp của mình, tôi đã tự động kéo các tên lớp từ một tập hợp các tên tệp, tôi đã cho phép unicode, nhưng nó không được hỗ trợ với CreatLayer () đó. Vấn đề là (loại cố định) bằng cách làm như sau:

layer_name = layer_name.encode('utf-8')
layer = ds.CreateLayer(layer_name, spat_ref, ogr.wkbPolygon)

Bây giờ nó chạy tốt, mặc dù với một bộ ký tự tiềm năng nhỏ hơn một chút.


Cảm ơn câu trả lời, cuối cùng đã giúp tôi giải quyết vấn đề của mình. Tôi đào sâu hơn và tìm thấy một bài viết liên quan về SO giải thích nó tốt; Tôi sẽ cô đọng những phát hiện của mình trong một câu trả lời để nó cũng có thể giúp đỡ người khác. (spoiler: chỉ truyền vào chuỗi đã giải quyết vấn đề của tôi)
DarkCygnus

0

Tìm hiểu sâu hơn về vấn đề này tôi đã tìm thấy câu trả lời SO này cung cấp giải pháp cho vấn đề tôi đang gặp phải.

Dường như, trong trường hợp của bạn ở đây, bạn layer_namecó chứa một số tự Unicode , không thể chuyển đổi theo cách tầm thường thành 'char const *' và lý do tại sao bạn gặp ngoại lệ.

Đây là lý do tại sao giải pháp được đề xuất trong câu trả lời được chấp nhận hoạt động, vì nó thay đổi mã hóa thành chuỗi byte UTF-8, có thể dễ dàng chuyển đổi thành 'char const *' (trùng hợp, cũng được đề xuất trong một câu trả lời khác trên cùng một SO bài đăng).

Có gì làm việc cho tôi như một sự thay thế là chỉ cần cast của bạn layer_nameđể chuỗi bằng cách thực hiện:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)
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.