将ArcGIS Server JSON转换为GeoJSON?


47

我正在使用Leaflet创建Web地图,并且希望能够从ArcServer抓取要素图层。我已经能够成功将要素类检索为JSON,但是Esri的JSON对象未遵循GeoJSON标准,因此无法显示。

有人知道处理此问题的转换脚本或工具吗?

如果没有,我计划创建一个脚本以将ArcServer JSON对象转换为GeoJSON。


我无法让ogr2ogr吃来自MapServer功能查询的ESRI json。(@SasaIvetic的示例使用FeatureServer请求,并且我需要使用的MapServer结果一定不能互换。)无论如何,此站点完全成功了:http
//ogre.adc4gis.com/

Answers:


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绑定使其自动化,也可以使用库在代码中进行自动化。

对于喜欢Web服务的用户,请参阅Ogre ogr2ogr Web客户端,它可以将json转换为geojson并来回转换,也可以将geojson转换为shapefile。

参考:http//www.gdal.org/drv_geojson.html


我下载了FWTools。运行该命令时,出现以下错误,提示“无法在此处打开数据源“我的URL””。-> ESRI Shapefile-> MapInfo文件-> UK .NTF-> SDTS->老虎-> 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随附OGR v1.7,其中v1.8.0添加了GeoJSON支持。我在这里运行GDAL / OGR 1.9dev,尽管不是通过FWTools。我想我是从gisinternals.com/sdk
2011年

谢谢。我让它在命令行上工作。我仍在努力使其能够在我的Javascript中运行-任何提示将不胜感激。
Tanner

@Tanner您如何克服这个错误?对我来说,这不是版本问题,但我在Windows机器上遇到了相同的错误
kflaw

@kflaw对不起,但我不记得确切。我想我只是在命令行上使用了ogr2ogr,而无需使用FWTools。
Tanner

7

您还可以在Github上看到Esri的geojson-utils,其中“包含[javascript]实用程序,可将GeoJSON转换为其他地理json格式,反之亦然。目前仅开发了将GeoJSON转换为Esri JSON。此外,请注意,只有WGS84坐标系中的几何支持。”


2
更新12/2017:geojson-utils已过时。参见arcgis-to-geojson-utilsterraformer
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


如果您要进行转换,则应使用ogr2​​ogr
Evan Carroll

5

ArcGIS现在支持GeoJSON

现在,ArcGIS Online通过ArcGIS Rest API URL具有GeoJSON。您所需要做的就是f=geojson在URL中设置并配置服务。要知道,在默认情况下,ArcGIS Online的将不会允许GeoJSON的出口,直到你明确允许其他输出格式。

以下是启用导出的方法:

  1. 在线登录arcgis
  2. 单击要素图层,
  3. 点击设置标签
  4. 选中显示以下内容的框

    汇出资料

    允许其他人导出为不同的格式。

  5. 保存并等待几分钟。

在查询页面中,您应该看到带有GeoJSON选项的输出格式下拉列表。老被称为json


轻松休息服务与ArcGIS Server休息服务是否不同?只能由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的此fork。

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和Leaflet 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)TERRAFORMER

注意:在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是您命名的库名称

这将成为全局变量名称,可在浏览器中使用。

诀窍是,bundle进程会添加即时执行函数,例如(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-to-geojson-utils





0

如果您需要将ArcServer服务作为GeoJSON返回,以便在所需的任何映射技术中使用,我强烈建议您查看此GitHub问题对话框

我不会在这里重复对话,因为那样会浪费时间。您可以直接从Esri那里清楚地列出您的选择。


-1

arcgis服务器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

注意:请记住在URL空间参考ID中设置那两个参数:outSR = 4326&f = geojson,srid = 4326,因为网络地图都使用此参数,f表示格式,f = pgeojson和f = geojson都可以使用。如果未设置outSR = 4326,则默认情况下,arcgis服务器rest api将不使用4326,而是使用其他名称,只有4326具有单位度数,这在大多数Web地图中都使用。其他格式不适用于网络地图。

顺便说一句,对于那些想将Arcgis Server Rest 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.