Lagi

Pustaka Java untuk membaca geojson dari MySQL


Saya mencari cara untuk mengambilmysqlgeometridata sebagaigeojsondari database baik menggunakan aJawaperpustakaan atau untuk mengkonversiwktkegeojsonmenggunakan baikJawaataujavascript.

Saat ini saya melakukan banyak manipulasi string dan pencocokan ekspresi reguler untuk mencapai ini. Saya menggunakanAPI Javascript Google Maps V3sebagai solusi pemetaan.

Pengaturan saya sangat sederhana, saya menggunakanServlet Jawauntuk memuat halaman JSP dan menerima permintaan AJAX. Saya menulis dan membaca data dari kolom tipegeometrimenggunakan sebuahmysqlbasis data menggunakanInnoDBsebagai mesin pemetaan saya. Saya menggunakankonektor mysqluntuk memasukkan/meminta data daribasis datamenggunakanJawa.Saya menggunakanDatalapisan padaAPI Javascript Google Maps v3untuk membuat data sebagaigeojson.

Terima kasih sebelumnya atas bantuan Anda.


FYI, dukungan GeoJSON adalah salah satu fitur baru di MySQL 5.7.5, yang menurut saya akan segera dirilis. Lihat http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-5.html untuk informasi lebih lanjut.


Menjawab pertanyaan saya sendiri:

Ini mem-parsing pernyataan individual, bukan beberapa pernyataan seperti yang ditemukan dalam skema. Jadi pisahkan skema pada ''. Itu juga tidak menyukai karakter '', jadi ini harus dihilangkan. Kode untuk mendapatkan nama kolom untuk tabel tertentu:

Anda mungkin ingin mempertimbangkan untuk menggunakan kode dari proyek Druid Alibaba. Meskipun dirancang sebagai perpustakaan penyatuan koneksi yang canggih, proyek ini mendukung parser dan AST yang sangat canggih untuk ANSI SQL dan dialek non-ANSI seperti MySQL, Oracle, SQL Server, dll. Proyek ini open source dan memiliki Versi Lisensi Apache yang sangat liberal. 2.0.

Titik masuk utama ke bagian perpustakaan ini adalah SQLUtils.java. Anda dapat menggunakan nilai yang dikembalikan dari SQLUtils.parseStatements untuk mengakses model pernyataan yang diketik:

Mengapa tidak menggunakan DatabaseMetaData untuk mengetahui tabel dan kolom? Ini menganggap bahwa skema yang diekspresikan dalam SQL telah dijalankan terhadap database yang Anda sambungkan, tetapi itu bukan asumsi yang sulit untuk dipenuhi.

MySQL mungkin dapat dengan mudah mengimpor data jika Anda memiliki data dalam format CSV. Saya akan menggali lebih dalam alat MySQL sebelum saya menulis kode Java untuk melakukan hal seperti itu. Jika itu tidak berhasil, saya akan menemukan alat ETL untuk membantu saya. Menulis Java akan menjadi solusi terakhir saya.


Jackson deserialize GeoJson Point di Spring Boot

Saya memiliki model @Entity yang memiliki properti tipe com.vividsolutions.jts.geom.Point . Ketika saya mencoba merender model ini dalam @RestController, saya mendapatkan pengecualian rekursi.

Entitasnya terlihat seperti ini (disingkat untuk singkatnya):

Setelah beberapa penelitian, saya menemukan bahwa ini karena Jackson tidak dapat membatalkan deserialize GeoJson secara default. Menambahkan perpustakaan ini akan menyelesaikan masalah: https://github.com/bedatadriven/jackson-datatype-jts .

Saya sekarang tidak yakin bagaimana cara memasukkan modul ini ke dalam objek mapper di boot musim semi. Sesuai dokumentasi saat boot, saya mencoba menambahkannya ke @Configuration dengan dua cara berikut:

Keduanya tidak menghapus pengecualian. Maaf jika ini duplikat, tetapi yang dapat saya temukan SO hanyalah menyesuaikan ObjectMapper yang menurut pemahaman saya tentang dokumentasi bukanlah "cara booting musim semi".

Sebagai solusinya, saya @JsonIgnore pada Point dan memiliki pengambil dan penyetel khusus untuk objek terkoordinasi yang tidak ada. tapi itu bukan cara saya ingin menyimpannya.


Pustaka Java untuk membaca geojson dari MySQL - Sistem Informasi Geografis

Sebuah aplikasi yang menggunakan dan mendemonstrasikan fungsionalitas di Perpustakaan Seluler GeoPackage.

Android - Aplikasi Android yang dapat dibuat dan diinstal dari Android Studio atau langsung dari APK.

iOS - Aplikasi iOS yang dapat dibuat dan diinstal dari Xcode.

SDK Bersertifikat OGC yang menyediakan kemampuan untuk mengelola file GeoPackage yang menyediakan dukungan baca, tulis, impor, ekspor, bagikan, dan buka. Buka file GeoPackage menyediakan akses baca dan tulis ke fitur dan ubin.

Java – Pustaka Java yang menyediakan fungsionalitas GeoPackage dan alat baris perintah. Mengandalkan Core Java.

Android - SDK Android yang menyediakan fungsionalitas dan utilitas GeoPackage untuk aplikasi Android. Mengandalkan Core Java.

Android Map - Android Map SDK yang menyediakan implementasi pustaka Google Map selain fungsionalitas dasar GeoPackage Android yang diwarisi.

iOS - SDK iOS yang menyediakan fungsionalitas dan utilitas GeoPackage untuk aplikasi iOS.

JS - Pustaka JavaScript yang menyediakan fungsionalitas dan utilitas GeoPackage untuk node dan aplikasi web.

Core Java - Pustaka non-mandiri yang menyediakan fungsionalitas inti GeoPackage ke pustaka Java dan Android.

Ekstensi NGA - Ekstensi NGA ke spesifikasi GeoPackage seperti yang didefinisikan oleh mekanisme ekstensi OGC GeoPackage dan ditentukan menggunakan templat ekstensi.

SQLite Exec - Utilitas perintah yang mengeksekusi pernyataan SQL pada database SQLite, termasuk GeoPackages.

Pustaka berdasarkan standar Akses Fitur Sederhana OGC (bukan khusus GeoPackage).

Fitur Sederhana Java - Pustaka dasar objek geometri dan utilitas.

Fitur Sederhana Java Biner Terkenal - Perpustakaan untuk menulis dan membaca Geometri Fitur Sederhana ke dan dari Biner Terkenal.

Fitur Sederhana Teks Terkenal Java - Perpustakaan untuk menulis dan membaca Geometri Fitur Sederhana ke dan dari Teks Terkenal.

Fitur Sederhana GeoJSON Java - Pustaka untuk menulis dan membaca Geometri Fitur Sederhana ke dan dari GeoJSON.

Simple Features Projection Java - Pustaka untuk melakukan konversi proyeksi antara Geometri Fitur Sederhana.

Fitur Sederhana iOS - Pustaka dasar objek geometri dan utilitas.

Fitur Sederhana iOS Biner Terkenal - Perpustakaan untuk menulis dan membaca Geometri Fitur Sederhana ke dan dari Biner Terkenal.

Fitur Sederhana Teks Terkenal iOS - Perpustakaan untuk menulis dan membaca Geometri Fitur Sederhana ke dan dari Teks Terkenal.

Fitur Sederhana GeoJSON iOS - Perpustakaan untuk menulis dan membaca Geometri Fitur Sederhana ke dan dari GeoJSON.

Proyeksi Fitur Sederhana iOS - Pustaka untuk melakukan konversi proyeksi antara Geometri Fitur Sederhana.

Pustaka untuk melakukan konversi proyeksi antar koordinat (bukan khusus GeoPackage).

Sistem Referensi Koordinat

Pustaka untuk membaca dan menulis file Format File Gambar Tagged (bukan khusus GeoPackage).

Java - Pustaka Java yang menyediakan fungsionalitas Format File Gambar Tagged.

iOS - Pustaka iOS yang menyediakan fungsionalitas Format File Gambar Tagged.

Pustaka berdasarkan Spesifikasi API OGC (bukan khusus GeoPackage).

Fitur JSON Java - Pustaka Java untuk menulis dan membaca OGC API - Fitur ke dan dari JSON.

Fitur JSON iOS - Perpustakaan iOS untuk menulis dan membaca OGC API - Fitur ke dan dari JSON.


Seharusnya rs.getString , karena getString digunakan dengan VARCHAR , TEXT , kita dapat menganggap Json seperti tipe String, sehingga Anda bisa mendapatkan hasilnya, menggunakan getString .

Contoh Sederhana

Periksa kembali dengan MySQL 5.7 dan PostgreSQL 9.4 :

MySQL 5.7 SQL

Jika ada yang masih mencari, saya mencobanya dengan Mysql 5.7, tetapi metode yang disarankan di atas tidak menangani data non-ascii dengan cukup baik, banyak karakter Asia, dll). Mereka akhirnya ditampilkan sebagai kacau.

Solusinya adalah membaca byte mentah menggunakan getBinaryStream. Kode ditunjukkan di bawah ini:

Di atas dapat dienkapsulasi dalam fungsi dari JSON dan digunakan secara luas. misalnya

Jika JDBC bukan persyaratan yang sulit, versi jOOQ terbaru menerapkan cara out-of-the-box untuk memetakan nilai SQL JSON ke tipe Java arbitrer menggunakan pustaka pemetaan JSON populer Jackson atau gson (mana pun yang dapat ditemukan di classpath Anda) . Anda kemudian dapat menulis:

Dengan asumsi JSON_COLUMN Anda berisi data formulir:

Ini juga berfungsi dengan semua fungsi SQL/JSON yang didukung secara asli, untuk membuat dokumen JSON seperti itu dengan cepat.


Pustaka Java untuk membaca geojson dari MySQL - Sistem Informasi Geografis

Konversi Kml ke format GeoJSON

Aplikasi ini KmlToGeojson, mengonversi file Kml dan Kmz menjadi representasi GeoJSON.

Kml digunakan di Google Earth untuk menampilkan berbagai elemen geografis, seperti gambar, tanda tempat, bentuk poligon, dan sebagainya.

Demikian pula GeoJSON adalah format untuk pengkodean berbagai struktur data geografis.

Aplikasi scala ini menggunakan library scalakml dan library play-geojson untuk mengonversi Kml ke format GeoJSON.

Saat ini pemetaan berikut dilaksanakan.

"Properti" Fitur GeoJSON dihasilkan dari elemen Kml berikut:

Atribut "id" Kml diubah menjadi "id" Fitur GeoJSON.

Segala sesuatu yang lain diabaikan.

Hanya sistem referensi koordinat WGS84 yang didukung dan semua garis bujur dan lintang dalam derajat desimal.

Instalasi dan pengemasan

Cara termudah untuk mengkompilasi dan mengemas aplikasi dari sumber adalah dengan menggunakan SBT. Untuk mengemas aplikasi dan semua dependensinya ke dalam satu jenis file jar:

Ini akan menghasilkan "kmltogeojson-1.2.jar" di direktori "./target/scala-2.13".

Untuk kenyamanan kmltogeojson-1.2.jar file ada di direktori "distrib" siap digunakan.

Setelah Anda memiliki file jar, cukup ketik pada prompt:

di mana "kml_file.kml" adalah file Kml yang ingin Anda konversi, dan "geojson_file.geojson" adalah file tujuan dengan hasil format GeoJSON. Jika "geojson_file.geojson" tidak ada, output diarahkan ke konsol.

Anda juga dapat menggunakan perpustakaan ini dalam kode skala Anda. Pertama tambahkan dependensi berikut ke file build.sbt Anda:

NS KmlConverter.scala memiliki satu metode generik untukGeoJson() yang mengambil salah satu objek Kml yang diimplementasikan. Lihat juga "TestGeoJson".

Tergantung pada perpustakaan scala scalakml, dan pada perpustakaan scala play-geojson.


Jalur JSON

Jalur JSON menargetkan nilai dan dapat digunakan untuk mengekstrak atau memodifikasi bagian dari dokumen JSON. Fungsi JSON_EXTRACT() mendemonstrasikan ini dengan mengekstrak satu atau lebih nilai:

Semua definisi jalur dimulai dengan $ diikuti oleh pemilih lain:

  • periode diikuti dengan nama, seperti $.website
  • [N] di mana N adalah posisi dalam array berindeks nol
  • wildcard .[*] mengevaluasi semua anggota objek
  • wildcard [*] mengevaluasi semua anggota array
  • wildcard awalan**akhiran mengevaluasi ke semua jalur yang dimulai dengan awalan bernama dan diakhiri dengan akhiran bernama

Contoh berikut merujuk ke dokumen JSON berikut:

  • $.a mengembalikan 1
  • $.c kembali [3, 4]
  • $.c[1] mengembalikan 4
  • $.d.e mengembalikan 5
  • $**.e mengembalikan [5]

Menetapkan batas waktu untuk transaksi di MySQL/InnoDB

Ini muncul dari pertanyaan terkait ini, di mana saya ingin tahu bagaimana memaksa dua transaksi terjadi secara berurutan dalam kasus sepele (di mana keduanya beroperasi hanya pada satu baris). Saya mendapat jawaban—gunakan SELECT . UNTUK UPDATE sebagai baris pertama dari kedua transaksi—tetapi ini menyebabkan masalah: Jika transaksi pertama tidak pernah dilakukan atau dibatalkan, maka transaksi kedua akan diblokir tanpa batas waktu. Variabel innodb_lock_wait_timeout menetapkan jumlah detik setelah klien mencoba melakukan transaksi kedua akan diberi tahu "Maaf, coba lagi". tetapi sejauh yang saya tahu, mereka akan mencoba lagi sampai server berikutnya reboot. Jadi:

  1. Tentunya harus ada cara untuk memaksa ROLLBACK jika suatu transaksi berlangsung selamanya? Haruskah saya menggunakan daemon untuk menghentikan transaksi tersebut, dan jika demikian, seperti apa tampilan daemon tersebut?
  2. Jika koneksi dimatikan oleh wait_timeout atau interactive_timeout di tengah transaksi, apakah transaksi dibatalkan? Apakah ada cara untuk menguji ini dari konsol?

Klarifikasi: innodb_lock_wait_timeout menetapkan jumlah detik transaksi akan menunggu kunci dilepaskan sebelum menyerah apa yang saya inginkan adalah cara memaksa kunci untuk dilepaskan.

Perbarui 1: Berikut adalah contoh sederhana yang menunjukkan mengapa innodb_lock_wait_timeout tidak cukup untuk memastikan bahwa transaksi kedua tidak diblokir oleh yang pertama:

Dengan pengaturan default innodb_lock_wait_timeout = 50 , transaksi ini selesai tanpa kesalahan setelah 55 detik. Dan jika Anda menambahkan UPDATE sebelum baris SLEEP, maka lakukan transaksi kedua dari klien lain yang mencoba SELECT . UNTUK MEMPERBARUI baris yang sama, transaksi kedua yang time out, bukan transaksi yang tertidur.

Apa yang saya cari adalah cara untuk mengakhiri tidur nyenyak transaksi ini.

Perbarui 2: Menanggapi kekhawatiran hobodave tentang seberapa realistis contoh di atas, inilah skenario alternatif: DBA terhubung ke server langsung dan berjalan

di mana baris kedua mengunci baris tempat aplikasi sering menulis. Kemudian DBA terputus dan berjalan pergi, lupa untuk mengakhiri transaksi. Aplikasi terhenti hingga baris dibuka kuncinya. Saya ingin meminimalkan waktu aplikasi macet akibat kesalahan ini.


Ke baca JSON dari file, kita akan menggunakan file JSON yang kita buat pada contoh sebelumnya.

  1. Pertama-tama, kita akan membuat instance JSONParser untuk mengurai file JSON.
  2. Gunakan FileReader untuk membaca file JSON dan meneruskannya ke parser.
  3. Mulailah membaca objek JSON satu per satu, berdasarkan jenisnya yaitu JSONArray dan JSONObject .

Bagikan ini:

Tentang Lokesh Gupta

Seorang pria keluarga dengan menyenangkan mencintai alam. Suka komputer, pemrograman, dan memecahkan masalah sehari-hari. Temukan saya di Facebook dan Twitter.

Umpan Balik, Diskusi, dan Komentar

Saya telah mengikuti persis seperti yang Anda sebutkan di artikel. tapi mendapatkan kesalahan. berikut cuplikan kodenya

berikut adalah log kesalahan:

Pengecualian di utas “main” java.lang.StackOverflowError
di java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:748)
di java.base/java.lang.StringBuffer.append(StringBuffer.java:424)
di org.json.simple.JSONValue.escape(JSONValue.java:266)
di org.json.simple.JSONObject.toJSONString(JSONObject.java:116)
di org.json.simple.JSONObject.toJSONString(JSONObject.java:101)
di org.json.simple.JSONObject.toJSONString(JSONObject.java:108)
…..
dan daftar panjang kesalahan serupa

Harus membuat beberapa perubahan untuk dikompilasi, yaitu:

alih-alih langsung casting seperti yang ditunjukkan pada contoh di sini

Saya mengikuti contoh di atas tetapi JSON menulis ke file tidak memiliki lekukan. Apakah saya melakukan sesuatu yang salah?

Halo,
Bagaimana saya bisa memperbarui hanya satu nilai entitas dalam file json?
Sebagai contoh,
Saya memiliki file json dengan semua data di dalamnya dan
Saya harus mengubah “namadepan”: “lokesh”
ke beberapa nilai lain yang disimpan dalam string.
Bagaimana saya bisa menulis nilai ini ke file json saya menggunakan Java
Tolong bantu.
Terima kasih

Hai, bagaimana saya melakukannya dengan file json 500GB (wikidata)?

Bagaimana Anda bisa mengurai objek FileReader? Apa itu objek FileReader?
Sebagai perbandingan, saya ingin membaca file JSON, lalu membuatnya menjadi string, lalu saya tahu cara mengatasinya, tetapi metode parse saya tidak akan menggunakan FileReader.


Kemudian, misalnya, Anda dapat menulis pemicu Anda sendiri dengan memanggil sys_exec seperti ini:

Hasilnya berisi kode keluar dari program eksternal

Ada fungsi berguna lainnya di perpustakaan ini:

  • sys_eval : menjalankan perintah arbitrer, dan mengembalikan outputnya.
  • sys_get : mendapatkan nilai variabel lingkungan
  • sys_set : membuat variabel lingkungan, atau memperbarui nilai variabel lingkungan yang ada
  • sys_exec : menjalankan perintah arbitrer, dan mengembalikan kode keluarnya

Berhati-hatilah dalam memutuskan apakah Anda memerlukan fungsi ini. UDF tersedia untuk semua pengguna basis data - Anda tidak dapat memberikan hak istimewa EXECUTE untuk mereka. Karena commandstring yang diteruskan ke sys_exec dapat melakukan hampir semua hal, mengekspos fungsi pose yang sangat nyata bahaya keamanan.