OpenlayerとPythonの間の相互作用


9

私はこのようなOpenLayersをウェブサイト持っている1ユーザーにポリゴンを描画する機能を提供し、その後にGeoJSONファイルを作成します。このGeoJSONをPythonスクリプトで処理したいと思います。Pythonスクリプトは、最終的にWebサイトに返され、情報ボックスとして表示される文字列を返します。

このプロジェクトを達成するには、どのようなフレームワーク/アプリ/ステップを検討する必要がありますか?

回答:


5

サーバー: サーバー側にフレームワークが必要です。適切なpythonオプションがあります:Django、Flask、Bottle、webpy。そのフレームワークは(ajax)リクエストを受け取り、GeoJsonを処理して文字列を返します。
情報がフレームワークに入力されると、「pythonic」になり、好みのツールを使用して、GeoJSONを読み取り、操作できます。これは、たとえばShapelyまたはOsgeo OGR Pythonバインディングなどです。Djangoを選択すると、ジオメトリヘルパー(GeoDjango)がすでに付属しています。

クライアント: クライアント側では、リクエストを作成し、回答を受け取り、情報ボックスを簡単に表示するための何かが必要です。そのためには、ExtJSJquery(UI)DojoKendoUIなどのフレームワーク/ツールを使用できます。

個人的に私はDjango + ExtJSの組み合わせを使用して、この種のことを実現しています。これは重い負荷の組み合わせです。つまり、必要以上に多くのリソースを持っています。しかし、とても使いやすく、文書化されているので、他のことを始めることはお勧めしません。両方(Django、Extjs)の基本的なチュートリアルを実行すると、質問に記載されているタスクを実行するのに十分な情報が得られます。後で他のオプションを試すことができます。

ところで、Extjsがオープンソースプロジェクトでのみ無料の場合は、それを考慮に入れてください。

Btw2、サーバーでPythonフレームワークを実行するには、wsgiを備えたWebサーバーが必要です。私のオプションはNginx + uwsgiです。djangoのドキュメントのデプロイセクションをご覧ください。


6

Flaskに関するPabloの提案(http://flask.pocoo.org/)はまさにその通りです。言及されていない他の要件がない限り、Djangoはやりすぎです。

jQuery.postを使用してGeoJSON文字列をFlaskアプリに送信し、json.loadsを使用してデコードします。Shapely(https://pypi.python.org/pypi/Shapely)は、OGRのPythonバインディングよりもはるかに簡単に使用でき、GeoJSONのシリアル化専用の2つの関数があるため、GeoJSONジオメトリの操作に使用できます。ジオメトリを「クリーン」にしたいとします。

import json
from shapely.geometry import mapping, shape

# 'data' is a GeoJSON string.
geom = shape(json.loads(data))

# The 0 buffer cleaning trick.
cleaned = geom.buffer(0.0)

return json.dumps(mapping(cleaned))

jQuery.postの成功コールバックでは、返されたGeoJSONを取得し、メッセージを表示したり、機能を再描画したり、何でも好きなように実行します。


あなたの推薦をありがとう。私のpythonスクリプトはすでにOGRのPythonバインディングを使用しています。したがって、私はクライアント側でjQueryを調べ、サーバー側で推奨されるようにFlaskを調べると思います。OGRのPythonバインディングを使用して、Pythonスクリプト内にGeoJSON文字列を処理します(GeoJSONドライバーがあります)。
ustroetz 2013

Pythonの組み込みのより良いjsonモジュールの代わりにOGRのGeoJSONドライバーを使用することは良い考えではありません。
sgillies 2013

さて、OGRでGeoJSON文字列を処理したいと思います。だから私はそれが理にかなっていると思います。しかし、私がそれに到達したら、私は見るでしょう。
ustroetz 2013

1

クライアント側でのジオメトリ表現の場合、OpenLayersは、指定されたフォーマットと投影でデータを読み書きする機能を備えています。これは、ここで説明するように、OpenLayers.Formatクラスを介して実行できます。このようなベクター操作には、GeoJSONフォーマットをお勧めします。

あなたの例のリンクでは、ジオメトリが読み込まれ、アプリは機能/ベクトルを考慮する必要があります

サーバー側では、Pabloが示唆したように、Python用のdjangoフレームワークのバインディングがいくつかあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.