Mengkonversi ArcGIS Server JSON ke GeoJSON?


47

Saya membuat peta web menggunakan Leaflet , dan saya ingin dapat mengambil lapisan fitur dari ArcServer kami. Saya telah berhasil mengambil kelas fitur sebagai JSON, tetapi objek JSON Esri tidak mengikuti standar GeoJSON sehingga tidak dapat ditampilkan.

Adakah yang tahu tentang skrip konversi atau alat yang menangani ini?

Jika tidak, saya berencana membuat skrip untuk mengkonversi objek JSON ArcServer ke GeoJSON.


Saya kesulitan mendapatkan ogr2ogr untuk memakan ESRI json yang berasal dari permintaan fitur MapServer. (Contoh @ SasaIvetic menggunakan permintaan FeatureServer, dan hasil MapServer yang saya perlu konsumsi pasti tidak dapat dipertukarkan.) Bagaimanapun, situs ini benar-benar melakukan trik: http://ogre.adc4gis.com/
elrobis

Jawaban:


40

OGR:

ogr2ogr -f GeoJSON test.json "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Hydrography/Watershed173811/FeatureServer/0/query?where=objectid+%3D+objectid&outfields=*&f=json" OGRGeoJSON

Perintah itu akan membaca hasil kueri langsung dari URL. Anda juga dapat menyediakannya dengan file teks yang berisi JSON Anda atau Anda dapat langsung memasok JSON yang disandikan pada baris perintah. Anda tentu saja dapat menggunakan binding ORG Python untuk mengotomatiskannya dalam skrip jika perlu, atau perpustakaan untuk melakukannya dalam kode.

Bagi mereka yang menyukai layanan web, lihat Ogre klien web ogr2ogr yang dapat mengkonversi json ke geojson ke dan kembali, serta geojson ke shapefile.

Referensi: http://www.gdal.org/drv_geojson.html


Saya mengunduh FWTools. Ketika saya menjalankan perintah itu, saya mendapatkan kesalahan 'Tidak dapat membuka sumber data' URL saya di sini 'dengan driver berikut. -> ESRI Shapefile -> File MapInfo -> UK .NTF -> SDTS -> TIGER -> DGN -> VRT -> REC -> Memori -> BNA -> CSV -> NAS -> GML -> GPX -> GPX - > KML -> GeoJSON -> Interlis 1 -> Interlis 2 -> GMT -> SQLite -> ODBC -> PGGi -> OGDI -> PostgreSQL -> MySQL -> XPlane -> AVCBin -> AVCE00 -> DXF -> Geoconcept - - > GeoRSS -> GPSTrackMaker -> VFK Saya tidak melihat sesuatu seperti 'ESRI JSON' dalam daftar driver.
Tanner

1
@Tanner: FWTools hadir dengan OGR v1.7 di mana dukungan GeoJSON ditambahkan dengan v1.8.0. Saya menjalankan GDAL / OGR 1.9dev di sini, meskipun tidak melalui FWTools. Saya pikir saya mendapatkannya dari gisinternals.com/sdk
Sasa Ivetic

Terima kasih. Saya dapat ini bekerja di baris perintah. Saya masih berusaha membuatnya bekerja di Javascript saya - tips apa pun akan dihargai.
Tanner

@ Tanner, bagaimana Anda bisa melewati kesalahan itu? Ini bukan masalah versi untuk saya, tetapi saya mendapatkan kesalahan yang sama pada mesin windows saya
kflaw

@ kflaw Maaf, tapi saya tidak ingat persis. Saya pikir saya baru saja menggunakan ogr2ogr pada baris perintah, dan tidak perlu atau menggunakan FWTools.
Tanner

7

Anda juga dapat melihat geojson-utils Esri di Github yang "berisi utilitas [javascript] untuk mengubah GeoJSON ke format json geografis lainnya dan sebaliknya. Saat ini hanya GeoJSON ke Esri JSON yang telah dikembangkan. Juga, perhatikan bahwa hanya geometri dalam sistem koordinat WGS84 didukung. "


2
Pembaruan 12/2017: geojson-utilssudah usang. Lihat arcgis-to-geojson-utils atau terraformer
GavinR

5

ESRI JSON ke GeoJSON (untuk OpenLayers) * Kemungkinan akan dimodifikasi untuk javascript Leaflet

        //create esri JSON object
    var myReturn = "esriObj = "+xmlHttpGet(restCall, false);
    eval(myReturn);

I can now work with esriObj as a JSON object i.e. esriObj.geometryType. What happens in the xmlHttpGet method? Basically I create a XMLHttpRequest and pass in my REST URL  your can see this code here

3. OK i have my ESRI query JSON object now I need to parse the features in this object and essentially create GeoJSON strings which the OpenLayers sample will be happy with  cue the code butchery


function esriDeserialize(geojson)
{

    var element = document.getElementById('text');
    var type = document.getElementById("formatType").value;
    var features = formats['in'][type].read(geojson);
    var bounds;
    if(features)
    {
        if(features.constructor != Array) {
            features = [features];
        }
        for(var i=0; i<features.length;>
            if (!bounds) {
                bounds = features[i].geometry.getBounds();
            } else {
                bounds.extend(features[i].geometry.getBounds());
            }

        }
        vectors.addFeatures(features);
        //map.zoomToExtent(bounds);
        var plural = (features.length &gt; 1) ? 's' : '';
        //element.value = features.length + ' feature' + plural + ' added'
    } else {
        element.value = 'Bad input ' + type;
    }
}

function getEsriGeom(restCall){

    //call ESRI Rest API
    //"http://pc302926/ArcGIS/rest/services/worldadmin/MapServer/0/query?text=&amp;geometry=&amp;geometryType=esriGeometryEnvelope&amp;inSR=&amp;spatialRel=esriSpatialRelIntersects&amp;where=%22FIPS_CNTRY%22+%3D+%27AS%27&amp;returnGeometry=true&amp;outSR=4326&amp;outFields=&amp;f=json"
    var element = document.getElementById('text');  

    //create esri JSON object
    var myReturn = "esriObj = "+xmlHttpGet(restCall, false);
    eval(myReturn);

    element.value = "";
    var coordPairsPerFeature = 0;

    //for each feature
    for (var i=0; i &lt; esriObj.features.length; i++)
    {
        //get the geometry
        var o = esriObj.features[i].geometry;
        element.value = element.value + esriObj.features[i].attributes.ADMIN_NAME;

        //loop through all the rings
        for (var s=0; s &lt; o.rings.length; s++)
        {
            //create geojson start &amp; end - i know i'm getting polygons
            var geojsonstart = '{"type":"Feature", "id":"OpenLayers.Feature.Vector_124", "properties":{}, "geometry":{"type":"Polygon", "coordinates":[['
            var geojsonend = ']]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}';

            //the coordinates for this ring
            var coords = o.rings[s];

            //loop through each coordinate
            var coordPair="";
            for (var g=0; g &lt; coords.length; g++)
            {
                coordPairsPerFeature = coordPairsPerFeature+1;

                //alert(coords[g]);
                if(g==coords.length-1){
                    coordPair = coordPair+"["+coords[g]+"]";
                }else{
                    coordPair=coordPair+"["+coords[g]+"],";
                }
            }

            //combine to create geojson string
            esriDeserialize(geojsonstart+coordPair+geojsonend);
        }

        element.value = element.value + "," + coordPairsPerFeature +"n";
    }

}
</features.length;>

sumber: http://mapbutcher.com/blog/?p=62


Jika Anda ingin mengonversi, Anda harus menggunakan ogr2ogr
Evan Carroll

5

ArcGIS sekarang mendukung GeoJSON

Sekarang ArcGIS Online memiliki GeoJSON melalui URL API Istirahat ArcGIS. Yang perlu Anda lakukan adalah mengatur f=geojsondi URL dan mengkonfigurasi layanan. Ketahuilah, secara default, ArcGIS online tidak akan mengizinkan GeoJSON mengekspor hingga Anda secara eksplisit mengizinkan format output lainnya.

Berikut ini cara mengaktifkan ekspor:

  1. Masuk ke arcgis online
  2. klik lapisan fitur,
  3. klik tab pengaturan
  4. centang kotak ini yang mengatakan

    Ekspor Data

    Izinkan orang lain untuk mengekspor ke format yang berbeda.

  5. Simpan dan tunggu beberapa menit.

Di halaman permintaan, Anda akan melihat daftar dropdown format output dengan opsi GeoJSON. Yang lama dipanggil json.


Apakah layanan istirahat agol berbeda dari layanan istirahat server ArcGIS? Bisakah agol menyediakan geoJSON sebagai layanan istirahat dan bukan server?
jotamon

4

Leaflet dan layer vektor ArGIS.

https://github.com/JasonSanford/leaflet-vector-layers

Demo kerja. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Lebih lanjut tentang Leaflet dan ArcGIS.

  • Layer Leaflet dan ArcGIS Server yaitu AgsDynamicLayer dan AgsFeatureLayer.

Anda bisa mendapatkan garpu ini yang memiliki dukungan untuk server ArcGIS.

https://github.com/dtsagile/Leaflet/

 var sitesLayer = new L.AgsDynamicLayer(
    'http://ags2.dtsagile.com/ArcGIS/rest/services/LiveFeeds/WxMappr/MapServer',
    { maxZoom: 19,
        attribution: "NOAA",
        opacity: 1,
        layers: 'show:2' });
_map.addLayer(sitesLayer);

http://blog.davebouwman.com/2011/08/04/leaflet-lean-mean-javascript-maps/

ArcGIS Image Services and Leaflet http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/



3

Untuk konversi satu kali, saya akan menggunakan jawaban yang diterima dari @Sasa Ivetic tetapi membutuhkan sesuatu waktu nyata, dan Terraformer bekerja dengan baik untuk itu. Sayangnya itu hanya untuk fitur tunggal secara default, jadi untuk beberapa fitur Anda perlu mengulang-ulang array dan menambahkan ID ke setiap fitur:

var FeatureCollection = {
  type: "FeatureCollection",
  features: []
}

for (var i = 0; i < arcgis.features.length; i++) {
  var feature = Terraformer.ArcGIS.parse(arcgis.features[i]);
  feature.id = i;
  FeatureCollection.features.push(feature)
};

Ini bekerja dengan baik bagi saya kecuali pada poligon multi-bagian (yaitu Alaska dan pulau-pulau), tapi saya baru dalam hal ini sehingga mungkin saya salah mengartikan sesuatu!


3

Konversi ArcGIS JSON ke GeoJSONThere di Browser murni

ada 2 cara yang bisa kamu lakukan

1) TERRAFORMER

Catatan: gunakan di node.js dan digunakan di browser berbeda , detail lihat tautan

2) Esri / arcgis-to-geojson-utils

digunakan di browser, ArcgisToGeojsonUtils adalah referensi global titik masuk modul ini

<script src="https://unpkg.com/@esri/arcgis-to-geojson-utils@1.2.0/dist/arcgis-to-geojson.js"></script>

// parse ArcGIS JSON, convert it to GeoJSON
const geojson = ArcgisToGeojsonUtils.arcgisToGeoJSON({
"x":-122.6764,
"y":45.5165,
"spatialReference": {
  "wkid": 4326
}

});

Namun, jika Anda ingin bergabung sendiri, hanya untuk belajar, ikuti langkah-langkahnya

a) Anda perlu mengkompilasi semua file sumber modul ke dalam satu bundle.js

rollup.js pasang oleh

npm install --global rollup

kemudian pergi ke folder root js lib Anda, cari file entry point js, dalam hal ini adalah index.js

$ rollup index.js --format umd --name "esri_arcgis_to_geojson" --file bundle.js

Anda harus menemukan file bundle.js baru di direktori root Anda.

Sekarang di file html browser Anda, termasuk file bundle.js ini

<script src='.../.../.../bundle.js'>

Anda dapat menggunakannya sekarang dengan

  // parse ArcGIS JSON, convert it to GeoJSON
  var geojson = esri_arcgis_to_geojson.arcgisToGeoJSON({
                            "x":-122.6764,
                            "y":45.5165,
                            "spatialReference": {
                              "wkid": 4326
                            }
                            });

 // take GeoJSON and convert it to ArcGIS JSON
  var arcgis = esri_arcgis_to_geojson.geojsonToArcGIS({
                            "type": "Point",
                              "coordinates": [45.5165, -122.6764]
                            });enter code here

Ingat esri_arcgis_to_geojson adalah nama yang Anda beri nama lib

Ini menjadi nama variabel global, tersedia di browser.

Caranya adalah, proses bundel menambahkan fungsi implement instan seperti (function xx {}) di sini adalah bagian teratas dari bundle.js

  (function (global, factory) {
     typeof exports === 'object' && typeof module !== 'undefined' ? 
        factory(exports) :
      typeof define === 'function' && define.amd ? define(['exports'], 
         factory) :
      (factory((global.arcgis_to_geojson = {})));
      }(this, (function (exports) { 'use strict';

         ***ORIGINAL SOURCE CODE OF JS MODULE***

     })));

arcgis-to-geojson-utils


2

Biasanya * konversi yang cukup mudah.

Saya membuat skrip https://github.com/calvinmetcalf/esri2geo dan ada yang lain juga berfungsi dengan baik.

* Pengecualian adalah poligon multi-bagian dengan lubang yang tidak mengkonversi 1-ke-1 tanpa geoprocessing.



1

Mungkin lebih mudah Anda bisa menggunakan pustaka Esri-leaflet untuk menambahkannya secara native sebagai layer di Leaflet.


2
Bisakah Anda memasukkan contoh dalam posting Anda yang menguraikan bagaimana jawaban ini adalah pertanyaan OP?
Paul

0

Jika yang Anda butuhkan adalah mengembalikan Layanan ArcServer sebagai GeoJSON untuk digunakan dalam teknologi pemetaan mana pun yang Anda inginkan, saya sangat menyarankan Anda melihat dialog masalah GitHub ini .

Saya tidak akan meniru dialog di sini karena itu akan membuang waktu. Pilihan Anda jelas diletakkan di sana langsung dari Esri.


-1

arcgis server rest api, layanan fitur,

jika Anda query layer, dengan URL seperti ini, ... / FeatureServer / query? layerDefs = ...

http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/query?layerDefs={"0":""}&returnGeometry=true&f=pgeojson&geometryType=esriGeometryEnvelope&geometry={"xmin" : -117.923158, "ymin" : 33.644081, "xmax" : -117.921436, "ymax" : 33.645157,"spatialReference" : {"wkid" : 4326}}

Anda tidak dapat mengatur format geojson, f = pgeojson akan menjadi permintaan yang buruk, f = json, karena barang yang dikembalikan bukan fitur, lapisan json dikembalikan.

Coba halaman permintaan html ini, Anda dapat melihat, tidak ada opsi geojson,

 http://services3.arcgis.com/you_token/arcgis/rest/services/Parcels/FeatureServer/query

Jika Anda ingin mengembalikan geojson (fitur), Anda harus menggunakan URL ini ... / FeatureServer / 0 / query ...

/ 0 / berarti layerID, jika pada hanya memiliki 1 layer, maka layerID = 0 .....

Coba halaman permintaan html ini, Anda dapat melihat, geojson adalah opsi, karena Anda adalah lapisan spesifik permintaan dengan layerID = 0

http://services3.arcgis.com/your_token/arcgis/rest/services/Parcels/FeatureServer/0/query

Catatan: ingat untuk mengatur 2 parameter: outSR = 4326 & f = geojson di ID referensi spasial URL, srid = 4326, karena peta web semua menggunakan ini, f berarti format, baik f ​​= pgeojson dan f = geojson works. Jika Anda tidak menetapkanSR = 4326, arc rest server arcgis secara default TIDAK akan menggunakan 4326, alih-alih menggunakan sesuatu yang lain, hanya 4326 yang memiliki derajat satuan, yang digunakan di sebagian besar peta web. Format lain tidak akan berfungsi dengan peta web.

By the way, bagi mereka yang ingin menggunakan arcgis server rest api dengan layanan ubin,

tilestream dan lainnya

/zoom(z)/x/y.png

http://localhost/v2/city_parcels/12/706/1641.png

layanan ubin server arcgis: tidak ada png, x dan y dalam urutan berbeda

     /zoom(z)/y/x

http://services3.arcgis.com/your_token/ArcGIS/rest/services/Parcels/MapServer/tile/12/1641/706

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.