USING OCG WEB SERVICES
A. WFS GetFeature
Untuk mendapatkan data aktual, lakukan permintaan GetFeature. (Ingat itu di WMS itu adalah permintaan GetMap.)
version=1.0.0&
request=GetFeature&
typeName=g4wd:st99_d00
Ini mengembalikan seluruh FeatureType sebagai Tanda Geografis yang terbentuk dengan baik dokumen Language (GML). Berita baiknya adalah GML adalah stan-dard. Kabar buruknya adalah sangat bertele-tele. Untungnya kamu bisa tambahkan outputFormat=GML2-GZIP ke akhir permintaan GetFeature Anda agar server gzip output dengan cepat. (outputFormat=GML2 adalah tipe output default.)
xmlns:g4wd="http://mapmap.org/g4wd"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://localhost:8888/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd
http://mapmap.org/g4wd
http://localhost:8888/geoserver/wfs/DescribeFeatureType?typeName=g4wd:st99_d00">
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates xmlns:gml="http://www.opengis.net/gml"
decimal="." cs="," ts=" ">
-179.14734,17.884813 179.77847,71.35256064
</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<g4wd:st99_d00 fid="st99_d00.1">
<g4wd:the_geom>
<gml:MultiPolygon
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:polygonMember>
<gml:Polygon>
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates xmlns:gml="http://www.opengis.net/gml"
decimal="." cs="," ts=" ">
-147.78711088,70.24536349 -147.765104,70.219806 ...
</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:polygonMember>
</gml:MultiPolygon>
</g4wd:the_geom>
<g4wd:AREA>271.254383622068</g4wd:AREA>
<g4wd:PERIMETER>227.171421517178</g4wd:PERIMETER>
<g4wd:ST99_D00_>2</g4wd:ST99_D00_>
<g4wd:ST99_D00_I>1</g4wd:ST99_D00_I>
<g4wd:STATE>02</g4wd:STATE>
<g4wd:NAME>Alaska</g4wd:NAME>
<g4wd:LSAD>01</g4wd:LSAD>
<g4wd:REGION>4</g4wd:REGION>
<g4wd:DIVISION>9</g4wd:DIVISION>
<g4wd:LSAD_TRANS></g4wd:LSAD_TRANS>
</g4wd:st99_d00>
</gml:featureMember>
<gml:featureMember>...</gml:featureMember>
<gml:featureMember>...</gml:featureMember>
...
</wfs:FeatureCollection>
Bunyinya seperti Shakespeare, ini adalah versi singkatnya, tidak kurang, karena apa yang saya tunjukkan di sini hanya salah satu dari 273 catatan. Dan juga memotong longsoran pasangan lat / long digml: elemen koordinat . Old Will tidak akan terlalu senang jika dia pernah melakukannya menemukan tentang kebebasan yang saya ambil dengan GML-nya. Mendorong sejumlah besar data melintasi kabel, bahkan jika itu ada di lokal LAN, dapat menghadirkan tantangan logistik. Format file biner mengambil sebagian kecil dari jejak GML, tetapi mereka tidak menawarkan transparansi teks biasa. Ini diakui sebagai trade-off — ukuran dan kecepatan untuk kesederhanaan. Mari kita lihat cara-cara yang dapat kita potong output GML ini menjadi lebih gigitan-potongan berukuran.
B. Filtering WFS GetFeature Request
Menggunakan kriteria untuk mewarnai negara bagian secara berbeda berdasarkan nilai bidang populasi. Kami tidak memikirkannya diwaktu, tetapi Filter ini adalah spesifikasi OGC yang terdefinisi dengan baik juga. PropertyIsBetween, PropertyIsLessThan, and PropertyIsGreaterThan adalah semua contoh Filter OGC. Melihat kembali pada WFS GetCapabilities dokumen, bagian Filter_Capabilities memberi Anda gambaran yang bagus sintaks Filter.
Kita dapat menggunakan Filter dalam konteks yang sedikit berbeda di sini. Kali ini, kita akan menggabungkan Filter dengan permintaan GetFeature untuk membatasi jumlah GML yang dikirim ke kami. Sebagai contoh, katakanlah kita inginkan untuk melihat hanya poligon negara bagian Colorado. Berikut ini sintaksis Filternya:
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:Literal>Colorado</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
Anda sudah tahu seperti apa tampilan GetFeature. Jika Anda globFilter itu di akhir permintaan GetFeature menggunakan filter=parameter, GML yang Anda dapatkan kembali harus dibatasi pada satu poli-gon:
version=1.0.0&
request=GetFeature&
typeName=g4wd:st99_d00&
filter=<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsEqualTo><ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:Literal>Colorado</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter>
Pertama menunjukkan bahwa memasukkan XML ke dalam QueryString adalah kejahatan terhadap kemanusiaan. Untuk memperburuk keadaan, secara teknis string filter harus URL disandikan (%3Cogc:Filter%3E), yang mengubah benar-benar menjijikkan. Itu suara permintaan HTTP GET yang melampaui kemampuannya. Industri praktik terbaik menyarankan agar Anda membatasi panjang permintaan GET Anda hingga 255 karakter atau kurang. Apakah itu berarti kita kurang beruntung? Kenakan topi pengembang web Anda sejenak — apakah ada HTTP lain metode yang umumnya digunakan untuk pengiriman yang lebih lama, lebih kompleks ke server web? Melihat kembali dokumen WFS GetCapabilities di Capabilities bagian, Anda akan melihat bahwa GetFeature mendukung HTTP GET dan POS. Saya menggunakan GET untuk permintaan sederhana, tetapi terkadang POSTING Anda permintaan ke server WFS adalah satu-satunya cara untuk pergi. Syukurlah, GeoServermembuat permintaan sampel POST hampir semudah menempelkan GET permintaan ke baris alamat browser Anda.
Kotak kombo permintaan memberi Anda banyak sampel menarik. Itu entri yang diakhiri dengan .url adalah HTTP GET. Yang diakhiri dengan .xml adalah HTTP POST. Pilih WMS_getCapabilities.url, dan klik Ubah. Baris URL akan diperbarui sesuai. Klik Kirim, dan Anda akan melihat dokumen yang sudah dikenal kembali. Sekarang pilih WFS_getCapabilities.xml, dan klik Ubah. Kamu tidak hanyadapatkan URL baru, tetapi isi tubuhnya juga. Klik Kirim sekali lagiuntuk melakukan permintaan.
service="WFS"
xmlns="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd"/>
ini membuat saya merindukan keanggunan sederhana HTTP GET. Semua hal skema jahat membuat permintaan ini lebih sesuai lebih baik dari yang seharusnya. Karena kita tidak menggunakan elemen apa pun dari ituruang nama, kita dapat mempersingkatnya sedikit:
Tapi deklarasi namespacesial itu akan datang nanti dengan balas dendam. Ini hanya penangguhan hukuman sementara. Sementara kita masih dalam tahap awal bermain-main dengan POST, itu layak menyebutkan alat baris perintah yang Anda ingin kenal dengan: cURL. cURL hadir standar pada kotak Mac dan Linux. Anda bisa pergi ke situs web cURL untuk mengunduh binari Windows. Permintaan XML untuk WFS akan menjadi rumit dengan tergesa-gesa. Kamu harus terbiasa menyimpan XML ke file teks dan menggunakan cURL untuk mengirimkan POST. Misalnya, simpan GetCapabilities XML ke nama file getcapabilities.xml . Ketik yang berikut di prompt perintah di direktori yang sama dengan file yang baru saja Anda buat. (Abaikan saja jeda baris—semua ini harus berada pada jalur yang sama agar bisa berfungsi.)
--header "Content-Type: text/xml"
--data @getcapabilities.xml
http://localhost:8888/geoserver/wfs
Dokumen GetCapabilities seharusnya muncul di konsol. Jika kamu ingin menyimpan hasil ke file, tambahkan --output somefile.txt ke command. Oke, mari kita kembali ke tugas yang ada. Kami ingin memfilter GetRequest kami. Beginilah tampilan GetRequest dalam XML:
service="WFS"
version="1.0.0"
outputFormat="GML2">
<wfs:Query typeName="g4wd:st99_d00" />
</wfs:GetFeature>
Saya dapat mencocokkan XML ini dengan QueryString di pikiran saya. Sejak kita akan mulai memfilter output, saya suka berpikir tentang hal ini SQL juga. Permintaan yang baru saja kita lakukan akan ditulis dalam SQL sebagai select*from st99_d00;. Pemfilteran pertama yang akan kami lakukan adalah membatasi jumlah bidang yang dikembalikan GML. Dalam SQL saya akan menulis select NAME, AREA, PERIMETER dari st99_d00;.
Menggunakan Filter XML, tampilannya seperti ini:
xmlns:ogc="http://www.opengis.net/ogc"
service="WFS"
version="1.0.0"
outputFormat="GML2">
<wfs:Query typeName="g4wd:st99_d00">
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:PropertyName>AREA</ogc:PropertyName>
<ogc:PropertyName>PERIMETER</ogc:PropertyName>
</wfs:Query>
</wfs:GetFeature>
Perhatikan bahwa kami harus menambahkan namespace OGC untuk menggunakan Elemen PropertyName. Tempel blok XML ini ke area teks tubuh pada layar Permintaan Demo, dan klik Kirim. (Pastikan bahwa Bidang URL mengarah ke layanan WFS.) Atau gunakan cURL. Bagaimanapun juga, GML yang dihasilkan hanya boleh mengandung ketiga elemen yang disebutkan. Melucuti bidang geometri masif (the_geom) mungkin tidak berhasil banyak yang masuk akal dari perspektif pemetaan, tapi itu pasti membuat kueri kami hasilnya lebih mudah dikelola. Sekarang kita telah membatasi bidang, mari kita batasi jumlah catatan kembali juga. Untuk melakukan select NAMA, AREA, PERIMETER dari st99_d00 di manaNAME = 'Colorado';, coba ini:
xmlns:ogc="http://www.opengis.net/ogc"
service="WFS"
version="1.0.0"
outputFormat="GML2">
<wfs:Query typeName="g4wd:st99_d00">
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:PropertyName>AREA</ogc:PropertyName>
<ogc:PropertyName>PERIMETER</ogc:PropertyName>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:Literal>Colorado</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>
GML itu semakin kecil setiap saat, jika Anda melakukan ini di Firefox, renderer XML melakukan pekerjaan yang bagus untuk membuat indentasi segalanya untuk keperluan tampilan. Tetapi jika Anda melakukan View> Source, Anda mungkin akan cukup kecewa. XML dikembalikan sebagai string tunggal tanpajeda baris. (Kalian yang menggunakan cURL mungkin sudah memperhatikan ini.) Alat standar Unix lain, Tidy, 8 akan membantu membuat keluaran sesuai konsumsi manusia. Jika Anda menyimpan output Anda ke file bernama co.xml ,coba yang berikut ini:
Tidak buruk, kan? Kali ini, ketik rapi -xml -i co.xml untuk membuat indent sebagai baik:
No warnings or errors were found.
<?xml version="1.0" encoding="utf-8"?>
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs"
xmlns:g4wd="http://mapmap.org/g4wd"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://localhost:8888/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd
http://mapmap.org/g4wd
http://localhost:8888/geoserver/wfs/DescribeFeatureType?typeName=g4wd:st99_d00">
<gml:boundedBy>
<gml:null>unknown</gml:null>
</gml:boundedBy>
<gml:featureMember>
<g4wd:st99_d00 fid="st99_d00.166">
<g4wd:AREA>28.03919812051</g4wd:AREA>
<g4wd:PERIMETER>22.0191923313779</g4wd:PERIMETER>
<g4wd:NAME>Colorado</g4wd:NAME>
</g4wd:st99_d00>
</gml:featureMember>
</wfs:FeatureCollection>
Untuk menyelesaikan kung fu Unix Anda, Anda selalu bisa menyalurkan hasil cURL langsung ke Tidy:
--header "Content-Type: text/xml"
--data @gf-criteria.xml
http://localhost:8888/geoserver/wfs
| tidy -xml -i
Oke, kembali ke pemfilteran. Dalam contoh terakhir kami, kami akan melakukan kueri spasial. Seringkali Anda hanya ingin hasil kembali dari kotak terikat sewenang-wenang. (Apa, Anda sudah lupa dengan pertanyaan WMS Anda?) Untuk membatasi hasil kamike BBOX tertentu, coba ini:
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
service="WFS"
version="1.0.0"
outputFormat="GML2">
<wfs:Query typeName="g4wd:st99_d00">
<ogc:PropertyName>NAME</ogc:PropertyName>
<ogc:PropertyName>AREA</ogc:PropertyName>
<ogc:PropertyName>PERIMETER</ogc:PropertyName>
<ogc:Filter>
<ogc:BBOX>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml">
<gml:coordinates>-109.31,36.72 -101.87,41.03</gml:coordinates>
</gml:Box>
</ogc:BBOX>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>