Перетворення сервера ArcGIS JSON в GeoJSON?


47

Я створюю веб-карту за допомогою Leaflet , і я хочу мати можливість захоплювати функціональні шари з нашого ArcServer. Мені вдалося отримати клас функцій як JSON, але об'єкти JSON Esri не відповідають стандартам GeoJSON, тому вони не можуть бути відображені.

Хто-небудь знає сценарій перетворення або інструмент, який обробляє це?

Якщо ні, я планую створити скрипт для перетворення об’єктів ArcServer JSON в GeoJSON.


У мене виникли проблеми з отриманням ogr2ogr, щоб поїсти json ESRI, що надходить із запиту на функцію MapServer. (@ Приклад SasaIvetic використовує запит FeatureServer, і результат MapServer, який мені потрібно споживати, не повинен бути взаємозамінним.) Як би там не було, цей сайт повністю зробив трюк: http://ogre.adc4gis.com/
elrobis

Відповіді:


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

Ця команда прочитає результат запиту безпосередньо з URL-адреси. Ви також можете надати текстовий файл, що містить ваш JSON, або ви можете безпосередньо поставити закодований JSON в командному рядку. Звичайно, ви можете використовувати прив'язки ORG Python для автоматизації цього сценарію, якщо це необхідно, або бібліотеку, щоб зробити це в коді.

Для тих, хто любить веб-сервіси, див. Ogre веб-клієнт ogr2ogr, який може перетворити json в geojson на та назад, а також geojson у shapefile.

Довідка: http://www.gdal.org/drv_geojson.html


Я завантажив FWTools. Коли я запускаю цю команду, я отримую помилку "Не вдається відкрити джерело даних" Моя URL-адреса тут "із наступними драйверами. -> Shapefile ESRI -> Файл MapInfo -> UK .NTF -> SDTS -> TIGER -> S57 -> DGN -> VRT -> REC -> Пам'ять -> BNA -> CSV -> NAS -> GML -> GPX - > KML -> GeoJSON -> Interlis 1 -> Interlis 2 -> GMT -> SQLite -> ODBC -> PGeo -> OGDI -> PostgreSQL -> MySQL -> XPlane -> AVCBin -> AVCE00 -> DXF -> Geoconcept - > GeoRSS -> GPSTrackMaker -> VFK У списку драйверів я не бачу на зразок "ESRI JSON".
Таннер

1
@Tanner: FWTools поставляється з OGR v1.7, де підтримка GeoJSON була додана з v1.8.0. Я запускаю GDAL / OGR 1.9dev тут, хоча не через FWTools. Я думаю, що я отримав їх з gisinternals.com/sdk
Sasa Ivetic

Дякую. Я отримав це для роботи в командному рядку. Я все ще працюю над тим, щоб він працював у Javascript - будь-які поради будуть вдячні.
Таннер

@Tanner, як ти пройшов цю помилку? Це не проблема з версією, але я отримую таку ж помилку на моїй машині Windows
kflaw

@kflaw Вибачте, але я не пам'ятаю точно. Я думаю, що я просто використав ogr2ogr в командному рядку і не потребував і не використовував FWTools.
Таннер

7

Ви також можете побачити геосйонні утиліти Есрі в Github, що "містить [javascript] утиліти для перетворення GeoJSON в інші географічні формати json і навпаки. В даний час розроблений лише GeoJSON в Esri JSON. Також зауважте, що в системі координат WGS84 є лише геометрії. підтримуються. "


2
Оновлення 12/2017: geojson-utilsзастаріле. Дивіться arcgis-to-geojson-utils або тераформер
GavinR

5

ESRI JSON для GeoJSON (для OpenLayers) * Ймовірно, буде змінено для 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;>

джерело: http://mapbutcher.com/blog/?p=62


Якщо ви збираєтеся конвертувати, вам слід скористатися ogr2ogr
Еван Керролл

5

ArcGIS тепер підтримує GeoJSON

Тепер ArcGIS Online має GeoJSON через URL-адресу API ArcGIS Rest. Все, що вам потрібно зробити, це встановити f=geojsonв URL-адресі та налаштувати службу. Будьте в курсі, за замовчуванням ArcGIS в Інтернеті не дозволить експортувати GeoJSON, поки явно не дозволите інші формати виводу.

Ось як увімкнути експорт:

  1. Увійдіть в арггіс онлайн
  2. натисніть шари функцій,
  3. перейдіть на вкладку налаштувань
  4. Поставте цей прапорець із написом

    Експорт даних

    Дозвольте іншим експортувати в різні формати.

  5. Збережіть і почекайте кілька хвилин.

На сторінці запиту ви повинні побачити спадний список формату виводу з опцією GeoJSON. Старий називався json.


Чи відрізняється сервіс відпочинку agol від сервісу відпочинку сервера ArcGIS? Чи може лише agol надавати geoJSON як послугу відпочинку, а не сервер?
Джотамон

4

Листівки та векторний шар ArGIS.

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

Робоча демонстрація. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Детальніше про Leaflet та ArcGIS.

  • Листівки та шари сервера ArcGIS, тобто AgsDynamicLayer та AgsFeatureLayer.

Ви можете отримати цю вилку, яка підтримує сервер 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 та листівка http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/



3

Для одноразового перетворення я використав би прийняту відповідь від @Sasa Ivetic, але мені було потрібно щось у режимі реального часу, і Terraformer працював на це гідно. На жаль, це лише одна функція за замовчуванням, тому для декількох функцій вам потрібно прокрутити масив і додати ідентифікатор до кожної функції:

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

Це добре працювало для мене, за винятком багатокутних полігонів (тобто Аляска та її острови), але я новачок у цьому, тому можливо, що я щось закодовано неправильно!


3

Перетворення ArcGIS JSON в GeoJSONThere в чистому браузері

Є два способи зробити це

1) ТЕРАФОРМАТОР

Примітка: використання в node.js та використання в браузері різні , детальніше див. Посилання

2) Esri / arcgis-to-geojson-utils

використання в браузері, ArcgisToGeojsonUtils - глобальна посилання для точки входу цього модуля

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

});

Однак якщо ви хочете зв’язатись самостійно, лише для навчання, виконайте кроки

a) Вам потрібно зібрати весь вихідний файл модуля в один bundle.js

rollup.js встановити

npm install --global rollup

потім перейдіть до кореневої папки js lib, знайдіть файл js точки входу, у цьому випадку це index.js

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

Ви повинні знайти новий файл bundle.js у вашому кореневому каталозі.

Тепер у свій HTML-файл браузера включіть цей файл bundle.js

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

Ви можете використовувати його зараз від

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

Пам'ятайте, esri_arcgis_to_geojson - це ім'я, яке ви назвали lib

Це стає глобальним ім'ям змінної, доступним у браузері.

Підступність полягає в тому, що процес зв’язування додайте функцію миттєвого виконання на зразок (функція xx {}), ось верхня частина від 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-утиліти


2

Його зазвичай * досить легко перетворювати.

Я зробив сценарій https://github.com/calvinmetcalf/esri2geo і є інші, які теж добре працюють.

* Виняток становлять багаточастинні багатокутники з отворами, які не перетворюють 1 на 1 без певної геообробки.


1

Якщо це одноразовий запит, і у вас немає більше 1000 функцій, спробуйте вставити це в qgis за допомогою шару додати вектор - виберіть протокол і замініть цю URL-адресу решти аркгізу вашою: http://geodata.epa.gov/arcgis / rest / services / OAR / USEPA_NEI_2005 / MapServer / 1 / query? where = objectid +% 3D + objectid & outfields = * & f = json ... Це передбачає, що у вас встановлено gdal 1.10



0

Якщо все, що вам потрібно, це повернути службу ArcServer як GeoJSON для використання у будь-якому технічному режимі картографування, я настійно рекомендую переглянути цей діалог з питання GitHub .

Я не збираюся повторювати діалог тут, тому що це втратить час. Ваші варіанти чітко викладені там безпосередньо від Есрі.


-1

arcgis сервіс відпочинку api, функціональне обслуговування,

якщо ви запитуєте шар із такою URL-адресою, ... / 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}}

Ви не можете встановити формат geojson, f = pgeojson буде поганим запитом, f = json, оскільки повернення матеріалів не є функцією, шари json були поверненими.

Спробуйте цю сторінку html-запиту, ви бачите, немає варіантів geojson,

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

Якщо ви хочете повернути geojson (функцію), ви повинні використовувати цю URL-адресу ... / FeatureServer / 0 / query ...

/ 0 / означає layerID, якщо на має лише 1 шар, то layerID = 0 .....

Спробуйте цю сторінку html-запиту, ви можете бачити, geojson - це варіант, тому що ви запитуєте певний шар із layerID = 0

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

Примітка: не забудьте встановити ці два параметри: outSR = 4326 & f = geojson в ідентифікаторі просторового довідника URL, srid = 4326, тому що всі веб-карти використовують це, f означає формат, і f = pgeojson, і f = geojson працює. Якщо ви не встановите outSR = 4326, сервер arcgis rest api за замовчуванням НЕ використовуватиме 4326, замість цього використовуйте щось інше, лише 4326 має одиничний ступінь, який використовується на більшості веб-карт. Інший формат не працює з веб-картами.

До речі, для тих, хто хоче використовувати сервер arcgis rest api за допомогою служби плитки,

плитковий потік та інші

/zoom(z)/x/y.png

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

сервіс плитки arcgis: ні png, x та y у різному порядку

     /zoom(z)/y/x

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.