MapnikがWebStackで失敗する


8

Mapnik 2.2.0を使用して、いくつかのマッピング機能を備えた(Python 2.6.6で実行される)かなり大きく複雑な(内部)Webポータルを継承しました。最近、Webサービスは、表示されるマップのいくつかを作成しようとすると500エラーをスローし始めましたが、唯一のエラーがあります。

$ Premature end of script headers: app.wsgi

マップは、(Pythonディクショナリから作成された)文字列として渡されるgeojsonから生成されます。私はそれをの1行のコードまで追跡しましたmap.py。これにより、マップにレイヤーが追加されます。

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

そのコード行(および関連するm.layers[-1].data = data)をコメント化すると、ポータルに画像が表示されますが、明らかにこのレイヤーはありません。jsonは有効です(http://geojsonlint.comで確認しました)。


デバッグ作業

別のjsonファイルを使用する

外部ソースからJSONを呼び出すと問題が再現されるかどうかを確認したいと思いました。したがって、json文字列を別のファイル(test.json)としてmap.py、と同じディレクトリに保存し、次のOgr呼び出しを変更しました

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

それでも500エラーが発生しますが、少し冗長なエラーメッセージが表示されます。

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

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)

だからjsonは有効なようです


Pythonコマンドラインを使用する

私はまた、対話形式でのpythonを実行しようとしているのと同じディレクトリにある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>

詳細情報

$ gdal-config --version
1.9.2

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

これはエラーなしで返されます(つまり、これはgeojsonが有効であることを意味し、http://geojsonlint.comを介してgeojsonを実行する以前のテストを確認します):

$ ogr2ogr testgeo.shp testgeo.json

OSバージョン

$ 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つのデバッグ作業は、json 有効であり、webstackを介して実行される場合を除いて、呼び出し機能することを示しています。私は関連するすべてのファイルとディレクトリのアクセス許可と所有権を確認しましたが、それらはすべて期待どおりのようです。

他に何が問題を引き起こしている可能性がありますか?!


更新(元の質問をしてから2週間)

私は今日仕事に取り掛かり、エラーメッセージ(新しい週、最初からやり直す)をいじくることができるかどうかを確認するためにもう一度クラックがあると思いました。しかし、まったく奇妙なことに、コードは(今のところ、少なくとも)失敗しているようには見えません。私はも変更していません。収集できる限り、サーバーのハードウェアの変更はありません。

これ原因の調査になり、再発を防ぐために私ができることは何かあるか...


私は開発者ではありませんが、一見すると、jsonデータのOGRシンタックス定義にいくつかの違いがあります(たとえば、「」ではなく「」)。さらに、OGRでサポートされているファイル拡張子は「.geojson」であることを覚えています「.json」の代わりにそれが何らかの形で役立つことを願っています
MickyInTheSky

私は外部ファイルを使用する場合残念ながら、それはありません(ファイルの拡張子に関係なく)仕事を。それは、jsonが文字列としてpythonに埋め込まれたときであり、動作を停止しました
ChrisW

チェックしましたか?同じバージョンのpython / mapnikスクリプトを使用して、コマンドラインとwebstackでmapnik.Ogrを実行しますか?多分別の実装があり、アップデートが役立つでしょうか?
ulrich 2016

はい、すべてのケースでMapnik 2.2.0とPython 2.6.6です
ChrisW

1
これが展開されているOSは何ですか?パーミッションのために、私は奇妙なバグが起こっていました。これは大まかな構造でした。フォルダーA>フォルダーB(BはAの子です)。次に、私はフォルダBにすべての権限を与えましたが、Aには与えませんでした。Aはプロセスにアクセスできないため、他のすべては失敗しました(オプションとして-Rを使用しました)。私が間違っていなければ、これはRHELに関するものでした。おそらく、それが問題であることを再確認してください。
George Silva、

回答:


2

待って、それはそれがファイルまたはファイルのようなオブジェクトを期待しているように見えます。あなたがPythonに埋め込まれたjsonを持っていると言うとき、それはファイルパスではなくjsonテキスト全体ですか?

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

Mapnik APIはファイルを想定しており、それを開いてそれ自体を解析します。

リファレンスを確認してください:http : //mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr

完了のためにそこからコピー:

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

このリンクは古いドキュメント(2.1)用ですが、私の推測ではAPIは変更されていません。

もちろん、これは、コメントでは、AではなくオプションBを使用していることを前提としています。


申し訳ありませんが、私の質問は明らかに十分に明確ではありません。元のアプリケーション pythonに埋め込まれたjson文字列を使用しています-これは機能しなくなりました。デバッグ作業の一環として、jsonを抽出して外部ファイルを使用するようにしました。これは、pythonコマンドラインで呼び出す場合にのみ機能しますが、webstack経由では機能しません
ChrisW

大丈夫。コメントで、拡張子に関係なく、常に外部ファイルで機能すると述べました。そのため、回答で示されたBIオプションを使用していると思いました。ogr2ogrを実行して、jsonに問題がないかどうかを確認できますか?基になるライブラリはどのバージョンですか?
ジョージシルバ

私は外部ファイルでテストしていたとき、私は、ファイルの拡張子があったかどうかの間に違いを見つけることができませんでしたことを意味し.jsonたり.geojson。私はogr2ogrを使用したことがありません-しかし、それは私が持っていない入力ファイルを必要とするようです。どのライブラリをチェックする必要がありますか?
ChrisW 2016

GDAL / OGR。ogr2ogrを使用して、jsonファイルを変換してシェープファイルとしましょう。問題がなければ、mapnikで使用されているGDAL / OGRに問題がないことを示しています。ファイルの権限はすべて大丈夫ですか?これは今やデバッグに帰着します。私はかつてウェブサーバーでmapnikを使用して地図を生成しましたが、この問題は一度もありませんでした。
ジョージシルバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.