Berinteraksi antara Openlayers dan Python


9

Saya memiliki website openlayers seperti ini salah satu yang memberikan pengguna kemampuan untuk menarik poligon dan kemudian menciptakan sebuah file GeoJSON. Saya ingin memproses GeoJSON ini dengan skrip python. Skrip python mengembalikan pada akhirnya sebuah string yang harus dikembalikan ke situs web dan ditampilkan sebagai kotak info.

Kerangka kerja / aplikasi / langkah apa yang harus saya perhatikan untuk menyelesaikan proyek ini?

Jawaban:


5

Server: Anda memerlukan kerangka kerja di sisi server, ada opsi python yang bagus: Django, Flask, Bottle, webpy. Kerangka kerja itu akan menerima (ajax) proses permintaan GeoJson dan mengembalikan string.
Setelah informasi masuk kerangka Anda sekarang "pythonic" dan dapat menggunakan alat preferensi Anda untuk membaca dan bekerja dengan GeoJSON, yang bisa misalnya Shapely atau OSGeo OGR Python binding . Jika Anda memilih Django, itu sudah datang dengan pembantu geometri itu - GeoDjango .

Klien: Di sisi klien, Anda perlu sesuatu untuk membuat langkah-langkah membuat permintaan, menerima jawaban dan menunjukkan kotak info lebih mudah. Untuk itu Anda bisa menggunakan frameworks / tools seperti ExtJS , Jquery (UI) , Dojo , KendoUI

Secara pribadi saya menggunakan kombinasi Django + ExtJS untuk menyelesaikan hal semacam ini. Ini kombinasi beban yang berat, maksud saya, ia memiliki sumber daya yang jauh lebih banyak daripada yang Anda butuhkan. Tetapi sangat mudah digunakan dan didokumentasikan dengan sangat baik sehingga saya tidak akan merekomendasikan hal lain untuk memulai. Setelah melakukan tutorial dasar keduanya (Django, Extjs) Anda memiliki informasi yang cukup untuk menyelesaikan tugas yang dinyatakan pada pertanyaan. Nanti Anda bisa mencoba opsi lain.

Btw, Extjs jika gratis hanya untuk proyek sumber terbuka, memperhitungkannya.

Btw2, untuk menjalankan kerangka python di server Anda akan memerlukan server web dengan wsgi. Pilihan saya adalah Nginx + uwsgi. Lihatlah bagian penyebaran dokumentasi Django.


6

Saran Pablo tentang Flask ( http://flask.pocoo.org/ ) tepat. Kecuali Anda punya persyaratan lain yang tidak disebutkan, Django berlebihan.

Gunakan jQuery.post untuk mengirim string GeoJSON Anda ke aplikasi Flask Anda, tempat Anda mendekode menggunakan json.loads. Shapely ( https://pypi.python.org/pypi/Shapely ) jauh lebih mudah digunakan daripada binding Python OGR dan memiliki 2 fungsi yang didedikasikan untuk membuat serial GeoJSON, jadi gunakan itu untuk beroperasi pada geometri GeoJSON Anda. Katakanlah Anda hanya ingin "membersihkan" geometri:

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))

Di panggilan balik sukses jQuery.post, Anda mendapatkan GeoJSON yang dikembalikan dan melakukan apa pun yang Anda inginkan: tampilkan pesan, gambar ulang fitur, apa pun.


Terima kasih atas rekomendasi Anda. Skrip python saya sudah menggunakan binding Python OGR. Jadi saya pikir saya akan melihat jQuery di sisi Klien dan Flask, seperti yang Anda sarankan, di sisi Server. Saya akan menggunakan binding Python OGR untuk menangani string GeoJSON di dalam skrip python saya (ia memiliki driver GeoJSON).
ustroetz

Menggunakan driver GeoJSON dari OGR alih-alih modul json built-in dan lebih baik bukanlah ide yang baik.
sgillies

Yah saya ingin memproses string GeoJSON dengan OGR. Jadi saya pikir itu masuk akal. Tapi saya akan melihat begitu saya sampai di sana.
ustroetz

1

Untuk representasi geometri di sisi klien , OpenLayers memiliki kemampuan untuk membaca / menulis data dalam format & proyeksi yang ditunjuk yang dapat dilakukan melalui kelas OpenLayers.Format seperti dijelaskan di sini. Saya menyarankan format GeoJSON untuk operasi vektor seperti ini.

Di tautan contoh Anda, geometri dibaca, aplikasi Anda harus mempertimbangkan fitur / vektor

Untuk Sisi Server, Seperti yang disarankan Pablo , ada beberapa binding untuk framework Django untuk python.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.