Chuyển đổi ArcGIS Server JSON sang GeoJSON?


47

Tôi đang tạo một bản đồ web bằng Leaflet và tôi muốn có thể lấy các lớp tính năng từ ArcServer của chúng tôi. Tôi đã có thể truy xuất thành công một lớp đối tượng dưới dạng JSON, nhưng các đối tượng JSON của Esri không tuân theo các tiêu chuẩn GeoJSON để chúng không thể được hiển thị.

Có ai biết về một kịch bản chuyển đổi hoặc công cụ xử lý này không?

Nếu không, tôi có kế hoạch tạo một tập lệnh để chuyển đổi các đối tượng ArcServer JSON thành GeoJSON.


Tôi đã gặp sự cố khi để ogr2ogr ăn ESRI json đến từ truy vấn tính năng MapServer. (Ví dụ của @ SasaIvetic sử dụng yêu cầu FeatureServer và kết quả MapServer tôi cần tiêu thụ không được hoán đổi cho nhau.) Dù sao, trang web này hoàn toàn thực hiện thủ thuật: http://ogre.adc4gis.com/
elrobis

Câu trả lời:


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

Lệnh đó sẽ đọc kết quả truy vấn trực tiếp từ URL. Bạn cũng có thể cung cấp cho nó một tệp văn bản chứa JSON của bạn hoặc bạn có thể trực tiếp cung cấp JSON được mã hóa trên dòng lệnh. Tất nhiên, bạn có thể sử dụng các ràng buộc Python ORG để tự động hóa nó trong một tập lệnh nếu cần thiết hoặc thư viện để thực hiện nó trong mã.

Đối với những người thích các dịch vụ web, hãy xem Ogre một ứng dụng web ogr2ogr có thể chuyển đổi json thành Geojson sang và quay lại, cũng như Geojson thành shapefile.

Tham khảo: http://www.gdal.org/drv_geojson.html


Tôi đã tải xuống FWTools. Khi tôi chạy lệnh đó, tôi gặp lỗi 'Không thể mở nguồn dữ liệu' URL của tôi ở đây 'với các trình điều khiển sau. -> ESRI Shapefile -> Tệp MapInfo -> UK .NTF -> SDTS -> TIGER -> S57 -> DGN -> VRT -> REC -> Bộ nhớ -> BNA -> CSV -> NAS -> GML -> GPX - > KML -> GeoJSON -> Interlis 1 -> Interlis 2 -> GMT -> SQLite -> ODBC -> PGeo -> OGDI -> PostgreQuery -> MySQL -> XPlane -> AVCBin -> AVCE00 -> DXF -> Geocon > GeoRSS -> GPSTrackMaker -> VFK Tôi không thấy một cái gì đó như 'ESRI JSON' trong danh sách các trình điều khiển.
Tanner

1
@Tanner: FWTools đi kèm với OGR v1.7 trong đó hỗ trợ GeoJSON được thêm vào với v1.8.0. Tôi đang chạy GDAL / OGR 1.9dev tại đây, mặc dù không thông qua FWTools. Tôi nghĩ rằng tôi đã nhận được chúng từ gisi INTERNals.com/sdk
Sasa Ivetic

Cảm ơn. Tôi đã làm điều này để làm việc trên dòng lệnh. Tôi vẫn đang làm việc để làm cho nó hoạt động trong Javascript của mình - mọi mẹo sẽ được đánh giá cao.
Tanner

@Tanner làm thế nào bạn vượt qua lỗi đó? Đây không phải là vấn đề về phiên bản đối với tôi nhưng tôi cũng gặp lỗi tương tự trên máy tính windows của mình
kflaw

@kflaw Xin lỗi, nhưng tôi không nhớ chính xác. Tôi nghĩ rằng tôi chỉ sử dụng ogr2ogr trên dòng lệnh và không cần hoặc sử dụng FWTools.
Tanner

7

Bạn cũng có thể thấy Geojson-utils trên Github của Esri rằng "chứa các tiện ích [javascript] để chuyển đổi GeoJSON sang các định dạng json địa lý khác và ngược lại. Hiện tại chỉ có GeoJSON thành Esri JSON được phát triển. Ngoài ra, lưu ý rằng chỉ có hình học trong hệ tọa độ WGS84. được hỗ trợ."


2
Cập nhật 12/2017: geojson-utilskhông dùng nữa. Xem arcgis-to-Geojson-utils hoặc terraformer
GavinR

5

ESRI JSON sang GeoJSON (dành cho OpenLayers) * Có khả năng được sửa đổi cho javascript của 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;>

nguồn: http://mapbutcher.com/blog/?p=62


Nếu bạn định chuyển đổi, bạn nên sử dụng ogr2ogr
Evan Carroll

5

ArcGIS hiện hỗ trợ GeoJSON

Bây giờ ArcGIS Online có GeoJSON thông qua URL API còn lại của ArcGIS. Tất cả những gì bạn cần làm là đặt f=geojsonURL và cấu hình dịch vụ. Xin lưu ý, theo mặc định, ArcGIS trực tuyến sẽ không cho phép xuất GeoJSON cho đến khi bạn cho phép rõ ràng các định dạng đầu ra khác.

Dưới đây là cách kích hoạt xuất:

  1. Đăng nhập vào arcgis trực tuyến
  2. nhấp vào các lớp tính năng,
  3. nhấp vào tab cài đặt
  4. đánh dấu vào ô này

    Xuất dữ liệu

    Cho phép người khác xuất sang các định dạng khác nhau.

  5. Lưu và chờ vài phút.

Trong trang truy vấn, bạn sẽ thấy danh sách thả xuống định dạng đầu ra với tùy chọn GeoJSON. Cái cũ đã được gọi json.


Dịch vụ nghỉ ngơi agol có khác với dịch vụ nghỉ ngơi máy chủ ArcGIS không? Chỉ có thể agol cung cấp GeoJSON như một dịch vụ nghỉ ngơi chứ không phải máy chủ?
jotamon

4

Tờ rơi và lớp vector ArGIS.

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

Bản demo làm việc. http://geojason.info/leaflet-vector-layers/demos/arcgis-server/

Thông tin thêm về Tờ rơi và ArcGIS.

  • Các lớp của Leaflet và ArcGIS Server, tức là AgsDAVELayer và AgsFeatureLayer.

Bạn có thể nhận được ngã ba này có hỗ trợ cho máy chủ 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/

Dịch vụ hình ảnh và tờ rơi của ArcGIS http://blog.geomusings.com/2012/04/17/arcgis-image-service-and-leaflet/



3

Đối với chuyển đổi một lần, tôi đã sử dụng câu trả lời được chấp nhận từ @Sasa Ivetic nhưng cần một cái gì đó theo thời gian thực và Terraformer đã hoạt động tốt cho việc đó. Thật không may, nó chỉ dành cho các tính năng duy nhất theo mặc định, vì vậy, đối với nhiều tính năng, bạn cần lặp qua mảng và thêm ID vào từng tính năng:

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

Điều này hoạt động tốt với tôi ngoại trừ đa giác đa phần (ví dụ Alaska và các đảo của nó), nhưng tôi chưa quen với điều này nên có thể tôi đã mã hóa một cái gì đó không chính xác!


3

Chuyển đổi ArcGIS JSON sang GeoJSONThere trong Trình duyệt thuần túy

có 2 cách bạn có thể làm

1) ĐIỀU KHIỂN

Lưu ý: sử dụng trong node.js và sử dụng trong trình duyệt là khác nhau , chi tiết xem liên kết

2) Esri / arcgis-to-Geojson-utils

sử dụng trong trình duyệt, ArcgisToGeojsonUtils là tham chiếu var toàn cầu, điểm vào của mô-đun này

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

});

Tuy nhiên, nếu bạn muốn tự mình bó mình, chỉ để học, hãy làm theo các bước

a) Bạn cần biên dịch tất cả các tệp nguồn mô-đun thành một bundle.js duy nhất

rollup.js cài đặt bởi

npm install --global rollup

sau đó vào thư mục gốc js lib của bạn, tìm tệp js điểm nhập cảnh, trong trường hợp này là index.js

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

Bạn nên tìm một tập tin bundle.js mới trong thư mục gốc của bạn.

Bây giờ trong tệp html trình duyệt của bạn, hãy bao gồm tệp bundle.js này

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

Bạn có thể sử dụng nó ngay bây giờ

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

Hãy nhớ esri_arcgis_to_geojson là tên bạn đặt tên cho lib

Điều này trở thành tên biến toàn cầu, có sẵn trong trình duyệt.

Thủ thuật là, quy trình gói thêm chức năng triển khai tức thời như (hàm xx {}) ở đây là phần trên cùng từ 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

Nó thường * khá dễ dàng chuyển đổi.

Tôi đã tạo một kịch bản https://github.com/calvinmetcalf/esri2geo và có những kịch bản khác cũng hoạt động tốt.

* Ngoại lệ là đa giác nhiều phần có lỗ không chuyển đổi 1 thành 1 mà không cần xử lý địa lý.



1

Có lẽ thậm chí còn dễ dàng hơn khi bạn có thể sử dụng thư viện Esri-leaflet để thêm nó một cách tự nhiên như một lớp trong Tờ rơi.


2
Bạn có thể kết hợp một ví dụ trong bài viết của bạn nêu cách câu trả lời này là câu hỏi của OP không?
Paul

0

Nếu tất cả những gì bạn cần là trả lại Dịch vụ ArcServer dưới dạng GeoJSON để sử dụng trong bất kỳ công nghệ lập bản đồ nào bạn muốn, tôi khuyên bạn nên xem cuộc đối thoại về vấn đề GitHub này .

Tôi sẽ không tái tạo cuộc đối thoại ở đây vì điều đó sẽ lãng phí thời gian. Các lựa chọn của bạn được trình bày rõ ràng trực tiếp từ Esri.


-1

apgis máy chủ nghỉ ngơi api, dịch vụ tính năng,

nếu bạn truy vấn lớp, với URL như thế này, ... / 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}}

Bạn không thể đặt định dạng Geojson, f = pgeojson sẽ là yêu cầu xấu, f = json, vì công cụ trả về không phải là tính năng, các lớp json đã được trả về.

Hãy thử trang truy vấn html này, bạn có thể thấy, không có tùy chọn Geojson,

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

Nếu bạn muốn trả về Geojson (tính năng), bạn phải sử dụng URL này ... / FeatureServer / 0 / query ...

/ 0 / có nghĩa là layerID, nếu trên chỉ có 1 lớp thì layerID = 0 .....

Hãy thử trang truy vấn html này, bạn có thể thấy, Geojson là tùy chọn, bởi vì bạn đang truy vấn lớp cụ thể với layerID = 0

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

Lưu ý: hãy nhớ đặt 2 tham số đó: outSR = 4326 & f = Geojson trong ID tham chiếu không gian URL, srid = 4326, vì tất cả bản đồ web đều sử dụng định dạng này, f có nghĩa là định dạng, cả f = pgeojson và f = Geojson đều hoạt động. Nếu bạn không đặt raSR = 4326, mặc định api máy chủ arcgis sẽ KHÔNG sử dụng 4326, thay vào đó sử dụng một cái gì đó khác, chỉ có 4326 có độ đơn vị, được sử dụng trong hầu hết các bản đồ web. Định dạng khác sẽ không hoạt động với bản đồ web.

Nhân tiện, đối với những người muốn sử dụng api máy chủ arcgis nghỉ ngơi với dịch vụ gạch,

cá rô đồng và những người khác

/zoom(z)/x/y.png

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

Dịch vụ gạch máy chủ arcgis: không có png, x và y theo thứ tự khác nhau

     /zoom(z)/y/x

http://service3.arcgis.com/your_token/ArcGIS/rest/service/Parcels/MapServer/tile/12/1641/706

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.