Mapnik thất bại thông qua một webstack


8

Tôi đã thừa hưởng một cổng web khá lớn / phức tạp (nội bộ) (chạy theo python 2.6.6), có một số khả năng ánh xạ, sử dụng Mapnik 2.2.0. Dịch vụ web gần đây đã bắt đầu ném 500 lỗi khi nó cố gắng tạo một số bản đồ được hiển thị, với lỗi duy nhất:

$ Premature end of script headers: app.wsgi

Các bản đồ được tạo từ Geojson được truyền dưới dạng một chuỗi (đã được tạo từ một từ điển python); Tôi đã theo dõi nó xuống 1 dòng mã trong một map.py, thêm một lớp vào bản đồ:

data = mapnik.Ogr(file=json, layer='OGRGeoJSON')

Khi tôi nhận xét dòng mã đó (và liên kết m.layers[-1].data = data) thì hình ảnh được hiển thị trên cổng, nhưng rõ ràng không có lớp này. Các json là hợp lệ (tôi đã kiểm tra nó trên http://geojsonlint.com ).


Nỗ lực gỡ lỗi

Sử dụng một tệp json riêng

Tôi muốn xem liệu việc gọi JSON từ một nguồn bên ngoài có sao chép vấn đề này không. Do đó, tôi đã lưu chuỗi json dưới dạng một tệp riêng ( test.json), trong cùng thư mục với map.pyvà sửa đổi lệnh Ogrgọi thành

data = mapnik.Ogr(file='test.json', layer='OGRGeoJSON')

Tôi vẫn nhận được một lỗi 500, nhưng với một thông báo lỗi dài dòng hơn một chút:

datasource = mapnik.Ogr(file='testgeo.json', layer='OGRGeoJSON')
File /usr/lib64/python2.6/site-packages/mapnik/__init__.py, line 536, in Ogr
return CreateDatasource(keywords)
RuntimeError: OGR Plugin: Failed to read GeoJSON data

Kiểm tra Geojson

$ ogrinfo testgeo.json
ERROR 4: GeoJSON Driver doesn't support update.
Had to open data source read-only.
INFO: Open of `testgeo.json'
      using driver `GeoJSON' successful.
1: OGRGeoJSON (3D Polygon)

Vì vậy, json có vẻ hợp lệ


Sử dụng dòng lệnh python

Tôi cũng đã thử chạy python tương tác trong cùng thư mục với map.pytest.json :

$ python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mapnik
>>> mapnik.Ogr(file="testgeo.json", layer="OGRGeoJSON")
<mapnik.Datasource object at 0x7f6243c27398>

Thêm thông tin

$ gdal-config --version
1.9.2

$ ogr2ogr --version
GDAL 1.9.2, released 2012/10/08

Điều này trả về không có lỗi (vì vậy tôi cho rằng điều này có nghĩa là Geojson là hợp lệ, xác nhận thử nghiệm trước đây của tôi về việc chạy Geojson thông qua http://geojsonlint.com ):

$ ogr2ogr testgeo.shp testgeo.json

Phiên bản của hệ điều hành

$ lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.7 (Final)
Release:        6.7
Codename:       Final

3 nỗ lực gỡ lỗi này cho thấy json hợp lệ và cuộc gọi hoạt động, ngoại trừ khi nó chạy qua webstack. Tôi đã kiểm tra quyền và quyền sở hữu của tất cả các tệp và thư mục có liên quan và tất cả chúng đều có vẻ như tôi mong đợi.

Điều gì khác có thể gây ra vấn đề?!


Cập nhật (2 tuần sau khi đặt câu hỏi ban đầu)

Hôm nay tôi đã đi làm và nghĩ rằng tôi sẽ có một vết nứt khác để xem liệu tôi có thể trêu chọc một số thông báo lỗi không (tuần mới, khởi đầu mới). Nhưng, hoàn toàn kỳ lạ, mã dường như không bị lỗi (ít nhất là bây giờ, ít nhất). Tôi đã không thay đổi , và theo như tôi có thể thu thập, không có thay đổi phần cứng nào cho các máy chủ.

Bây giờ điều này trở thành một cuộc điều tra về những gì đã gây ra nó, và liệu tôi có thể làm gì để ngăn chặn nó xảy ra lần nữa không ...


Tôi không phải là nhà phát triển nhưng ngay từ cái nhìn đầu tiên, tôi thấy một số khác biệt trong định nghĩa tổng hợp OGR của dữ liệu json (ví dụ: '' 'thay vì' "'). Ngoài ra, tôi nhớ rằng phần mở rộng tệp được hỗ trợ OGR là" .geojson " thay vì ".json". Hy vọng nó có thể giúp bạn theo một cách nào đó
MickyInTheSky

Thật không may, khi tôi sử dụng một tệp bên ngoài, nó không hoạt động (bất kể phần mở rộng tệp); Đó là khi json được nhúng vào con trăn dưới dạng một chuỗi nó đã ngừng hoạt động
ChrisW

Bạn đã kiểm tra, bạn sử dụng cùng một phiên bản tập lệnh python / mapnik để thực thi mapnik.Ogr trong dòng lệnh và webstack của bạn? Có lẽ có một triển khai khác và một bản cập nhật có thể giúp đỡ?
ulrich 2/2/2016

Có, đó là Mapnik 2.2.0 và Python 2.6.6 trong mọi trường hợp
ChrisW

1
Hệ điều hành này đang được triển khai để làm gì? Một khi tôi có một lỗi kỳ lạ xảy ra, vì quyền. đây là cấu trúc thô: thư mục A> thư mục B (trong đó B là con của A). Sau đó, tôi đã cấp tất cả các quyền cho thư mục B, nhưng không phải A. Vì A không thể truy cập được vào quy trình, mọi thứ khác đều thất bại (tôi đã sử dụng -R làm tùy chọn). Nếu tôi không nhầm, đây là trên RHEL. Kiểm tra kỹ xem, có lẽ, đó là một điều.
George Silva

Câu trả lời:


2

chờ đã, có vẻ như nó đang mong đợi một tập tin hoặc một đối tượng giống như tập tin. Khi bạn nói rằng bạn có một json được nhúng trong python, đó là toàn bộ văn bản json chứ không phải đường dẫn tệp?

a = "/home/george/boundaries.json" # file-path
b = "{
    'type': 'FeatureCollection',
    'crs': {
      'type': 'name',
      'properties': {
        'name': 'EPSG:3857'
      }
    },
    'features': [{
      'type': 'Feature',
      'geometry': {
        'type': 'Point',
        'coordinates': [0, 0]
      }
    }, {
      'type': 'Feature',
      'geometry': {
        'type': 'LineString',
        'coordinates': [[4e6, -2e6], [8e6, 2e6]]
      }
    }]}" # json-content

API Mapnik đang mong đợi một tệp và nó sẽ mở nó ra và phân tích nó.

Kiểm tra tham chiếu: http://mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr

Sao chép từ đó, để hoàn thành:

from mapnik import Ogr, Layer
datasource = Ogr(base='/home/mapnik/data',file='rivers.geojson',layer='OGRGeoJSON') 
lyr = Layer('OGR Layer from GeoJSON file')
lyr.datasource = datasource

Liên kết này dành cho các tài liệu cũ hơn (2.1) nhưng tôi đoán là API không thay đổi.

Tất nhiên, điều này là giả sử, theo nhận xét của bạn, rằng bạn đang sử dụng tùy chọn B, thay vì A.


Xin lỗi, câu hỏi của tôi rõ ràng là không đủ rõ ràng. Ứng dụng ban đầu đang sử dụng chuỗi json được nhúng trong python - điều này đã ngừng hoạt động. Là một phần trong nỗ lực sửa lỗi của tôi, tôi đã trích xuất json để làm cho nó sử dụng một tệp bên ngoài. Điều này chỉ hoạt động khi bạn gọi nó trên dòng lệnh python, nhưng không thông qua webstack
ChrisW

ồ được thôi. trên một bình luận bạn nói rằng nó sẽ luôn hoạt động trên các tệp bên ngoài, bất kể phần mở rộng. đó là lý do tại sao tôi nghĩ rằng bạn đang sử dụng tùy chọn BI hiển thị trong câu trả lời. Bạn có thể làm một ogr2ogr để xem mọi thứ có ổn với json của bạn không? Những phiên bản nào là thư viện cơ bản của bạn?
George Silva

Tôi có nghĩa là khi tôi đang thử nghiệm với các tệp bên ngoài, tôi không tìm thấy bất kỳ sự khác biệt nào giữa việc mở rộng tệp là .jsonhay .geojson; Tôi chưa bao giờ sử dụng ogr2ogr - nhưng có vẻ như nó cần một tệp đầu vào mà tôi không có. Những thư viện nào tôi nên kiểm tra?
ChrisW

GDAL / OGR. hãy thử chuyển đổi tập tin json của bạn thành giả sử, một shapefile, sử dụng ogr2ogr. nếu mọi thứ đều ổn, đó là dấu hiệu cho thấy vấn đề không nằm ở GDAL / OGR, được mapnik sử dụng. tất cả các quyền của tập tin là ok? Điều này đi xuống để gỡ lỗi bây giờ. Tôi đã từng sử dụng mapnik trong máy chủ web để tạo bản đồ và không bao giờ gặp sự cố này.
George Silva
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.