Конвертировать ArcGIS Server JSON в GeoJSON?


47

Я создаю веб-карту с помощью Leaflet , и я хочу иметь возможность получать слои объектов с нашего ArcServer. Я успешно смог получить класс объектов как JSON, но объекты Esri JSON не соответствуют стандартам GeoJSON, поэтому их нельзя отобразить.

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

Если нет, я планирую создать скрипт для преобразования объектов ArcServer JSON в GeoJSON.


У меня были проблемы с получением ogr2ogr, чтобы съесть ESRI JSON из запроса функции MapServer. (Пример @SasaIvetic использует запрос FeatureServer, и результат MapServer, который мне нужно использовать, не должен быть взаимозаменяемым.) В любом случае, этот сайт полностью справился с
задачей

Ответы:


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 здесь »со следующими драйверами». -> Шейп-файл 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 - любые советы будут оценены.
Таннер

@ Таннер, как ты справился с этой ошибкой? Это не проблема версии для меня, но я получаю ту же ошибку на моем компьютере с Windows
kflaw

@kflaw Извините, но я точно не помню. Я думаю, что я просто использовал ogr2ogr в командной строке и не нуждался в FWTools.
Таннер

7

Вы также можете увидеть gerijson-utils Esri на 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 ArcGIS Rest API. Все, что вам нужно сделать, это установить f=geojsonв URL и настроить сервис. Имейте в виду, что по умолчанию ArcGIS online не разрешит экспорт GeoJSON, пока вы явно не разрешите другие форматы вывода.

Вот как включить экспорт:

  1. Войти в arcgis онлайн
  2. щелкните по слоям объектов,
  3. нажмите вкладку настройки
  4. установите этот флажок

    Экспорт данных

    Разрешить другим экспортировать в разные форматы.

  5. Сохраните и подождите несколько минут.

На странице запроса вы должны увидеть выпадающий список выходного формата с опцией GeoJSON. Старый назывался json.


Отличается ли служба отдыха agol от службы отдыха сервера ArcGIS? Может ли agol предоставлять geoJSON только как службу отдыха, а не как сервер?
Jotamon

4

Листовка и векторный слой ArGIS.

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

Рабочая демка. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Больше на Leaflet и ArcGIS.

  • Слои листовок и ArcGIS Server, то есть AgsDynamicLayer и AgsFeatureLayer.

Вы можете получить этот форк, который поддерживает ArcGIS server.

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 и буклет 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 в GeoJSON есть в чистом браузере

Есть 2 способа, которыми вы можете сделать

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
}

});

Тем не менее, если вы хотите связать самостоятельно, просто для обучения, следуйте инструкциям

а) Вам нужно скомпилировать весь исходный файл модуля в единый пакет.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

Это становится именем глобальной переменной, доступной в браузере.

Хитрость в том, что процесс связывания добавляет мгновенную функцию реализации, например (function 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 к GeoJSON-утилитами


2

Его обычно * довольно легко конвертировать.

Я сделал скрипт https://github.com/calvinmetcalf/esri2geo, и есть другие, которые тоже работают хорошо.

* Исключение составляют многокомпонентные полигоны с отверстиями, которые не преобразуются 1-в-1 без некоторой геообработки.


1

Если это однократный запрос и у вас нет более 1000 объектов, попробуйте вставить его в qgis с помощью добавления векторного слоя - выберите протокол и замените этот оставшийся URL-адрес arcgis своим: 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 .

Я не собираюсь повторять здесь диалог, потому что это потратит время. Ваши варианты четко изложены там прямо от Esri.


-1

ArcGIS Server Rest 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, если on имеет только 1 уровень, то layerID = 0 .....

Попробуйте эту страницу запроса html, вы можете видеть, что geojson - это опция, потому что вы запрашиваете определенный слой с layerID = 0

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

Примечание: не забудьте установить эти 2 параметра: outSR = 4326 & f = geojson в идентификаторе пространственной ссылки URL, srid = 4326, поскольку все веб-карты используют это, f означает формат, и f = pgeojson и f = geojson работают. Если вы не установите outSR = 4326, то по умолчанию api rest сервера Arcgis НЕ будет использовать 4326, вместо этого будет использоваться что-то другое, только 4326 имеет единичный градус, который используется в большинстве веб-карт. Другой формат не будет работать с веб-картами.

Кстати, для тех, кто хочет использовать ArcGIS Server Rest API с сервисом плитки,

Tilestream и другие

/zoom(z)/x/y.png

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

Служба тайлов ArcGIS Server: нет 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.