ArcGIS Server JSON을 GeoJSON으로 변환 하시겠습니까?


47

Leaflet을 사용하여 웹 맵을 만들고 있는데 ArcServer에서 피처 레이어를 가져올 수 있기를 원합니다. 기능 클래스를 JSON으로 검색 할 수 있었지만 Esri의 JSON 객체는 GeoJSON 표준을 따르지 않으므로 표시 할 수 없습니다.

누구든지 이것을 처리하는 변환 스크립트 또는 도구를 알고 있습니까?

그렇지 않다면 ArcServer JSON 객체를 GeoJSON으로 변환하는 스크립트를 만들 계획입니다.


MapServer 기능 쿼리에서 오는 ESRI json을 먹기 위해 ogr2ogr을 얻는 데 문제가있었습니다. (SasaIvetic의 예는 FeatureServer 요청을 사용하고 @ 내가 소비하는 데 필요한 맵 서버 결과가 교환되지 않았을해야합니다.) 어쨌든,이 사이트가 완전히 트릭했다 : 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 바인딩을 사용하여 스크립트 내에서 자동화하거나 라이브러리에서 코드로이를 수행 할 수 있습니다.

웹 서비스를 좋아 하는 사용자는 json을 geojson으로, 그리고 geojson을 shapefile로 변환 할 수있는 ogr2ogr 웹 클라이언트 인 Ogre를 참조하십시오 .

참조 : http://www.gdal.org/drv_geojson.html


FWTools를 다운로드했습니다. 해당 명령을 실행하면 다음 드라이버를 사용하여 '데이터 소스'내 URL을 여기에서 열 수 없습니다 '라는 오류가 발생합니다. -> ESRI Shapefile-> 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'과 같은 것이 보이지 않습니다.
Tanner

1
@Tanner : FWTools는 GeoJSON 지원이 v1.8.0과 함께 추가 된 OGR v1.7과 함께 제공됩니다. FWTools를 통해서는 아니지만 여기서 GDAL / OGR 1.9dev를 실행하고 있습니다. 나는 그들을 거 같아요 gisinternals.com/sdk
사사 Ivetic을

감사. 커맨드 라인에서 작동하도록했습니다. 나는 여전히 내 자바 스크립트에서 작동하도록 노력하고 있습니다-모든 팁을 주시면 감사하겠습니다.
Tanner

@Tanner 그 오류를 어떻게 극복 했습니까? 그것은 나에게 버전 문제가 아니지만 내 Windows 컴퓨터에서 동일한 오류가 발생합니다
kflaw

@kflaw 죄송 합니다만, 정확하게 기억 나지 않습니다. 방금 명령 줄에서 ogr2ogr을 사용했으며 FWTools가 필요하지 않거나 사용하지 않았다고 생각합니다.
Tanner

7

또한 Github에서 Esri의 geojson-utils 를 볼 수 있습니다. "GeoJSON을 다른 지리적 json 형식으로 변환하거나 그 반대로 변환하기위한 [javascript] 유틸리티가 포함되어 있습니다. 현재 GeoJSON 만 Esri JSON으로 개발되었습니다. 또한 WGS84 좌표계의 형상 만 지원됩니다. "


2
2017 년 12 월 업데이트 : geojson-utils더 이상 사용되지 않습니다. 보기 는 ArcGIS --에 geojson-utils에 또는 terraformer
GavinR

5

ESRI JSON에서 GeoJSON으로 (OpenLayers 용) * Leaflet JavaScript를 위해 수정 될 것

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



5

ArcGIS는 이제 GeoJSON을 지원합니다

이제 ArcGIS Online에는 ArcGIS Rest API URL을 통해 GeoJSON이 있습니다. 당신이해야 할 모든 설정 f=geojson의 URL과 서비스를 구성합니다. 기본적으로 ArcGIS online은 다른 출력 형식을 명시 적으로 허용 할 때까지 GeoJSON 내보내기를 허용 하지 않습니다 .

내보내기를 활성화하는 방법은 다음과 같습니다.

  1. arcgis 온라인에 로그인
  2. 피처 레이어를 클릭하고
  3. 설정 탭을 클릭하십시오
  4. 이 확인란을 선택하십시오

    데이터 내보내기

    다른 사람이 다른 형식으로 내보낼 수 있습니다.

  5. 저장하고 몇 분 기다립니다.

쿼리 페이지에 GeoJSON 옵션이있는 출력 형식 드롭 다운 목록이 표시됩니다. 옛날이라고 불렸다 json.


agol rest 서비스는 ArcGIS server rest 서비스와 다른가요? agol만이 geoJSON을 서버가 아닌 나머지 서비스로 제공 할 수 있습니까?
jotamon

4

전단지 및 ArGIS 벡터 레이어.

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

실무 데모. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

전단지 및 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 는 그 점을 잘 처리했습니다. 불행히도 기본적으로 단일 기능에만 해당되므로 여러 기능의 경우 배열반복 하고 각 기능에 ID를 추가 해야 합니다.

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으로 변환

당신이 할 수있는 두 가지 방법이 있습니다

1) 테라 포머

참고 : node.js에서의 사용과 브라우저에서의 사용이 다릅니다 . 자세한 내용은 링크를 참조하십시오

2) Esri / arcgis-to-geojson-utils

브라우저에서 사용하면 ArcgisToGeojsonUtils는이 모듈의 시작점 인 전역 var 참조입니다.

<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라는 이름입니다

이것은 브라우저에서 사용 가능한 전역 변수 이름이됩니다.

요령은 번들 프로세스가 (function xx {})와 같은 인스턴트 구현 기능을 추가하는 것입니다.

  (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

보통 * 매우 쉬운 변환입니다.

나는 https://github.com/calvinmetcalf/esri2geo 스크립트를 만들었고 다른 것들도 잘 작동합니다.

* 일부 지오 프로세싱없이 일대일 변환하지 않는 구멍이있는 다중 부품 다각형은 예외입니다.





-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를 의미합니다. on에 레이어가 하나만 있으면 layerID = 0 .....

이 HTML 쿼리 페이지를 시도하십시오. layerID = 0 인 특정 레이어를 쿼리하기 때문에 geojson이 옵션입니다.

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

참고 : 웹 맵은 모두 이것을 사용하므로 f는 형식을 의미하고 f는 p = pgeojson과 f = geojson이 작동하므로 URL 공간 참조 ID에서 srid = 4326 인 outSR = 4326 & f = geojson이라는 두 매개 변수를 설정해야합니다. SR = 4326을 설정하지 않으면 arcgis 서버 나머지 API는 기본적으로 4326을 사용하지 않고 대신 다른 것을 사용합니다. 대부분의 웹 맵에서 사용되는 단위 등급은 4326입니다. 다른 형식은 웹 맵에서 작동하지 않습니다.

그런데 arcgis 서버 레스트 API를 타일 서비스와 함께 사용하려는 사람들에게는

tilestream 및 기타

/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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.