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

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

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

评论

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

#1 楼

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。

参考: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”之类的内容。

–鞣剂
2011年8月3日在20:15

@Tanner:FWTools随附OGR v1.7,其中v1.8.0添加了GeoJSON支持。我在这里运行GDAL / OGR 1.9dev,尽管不是通过FWTools。我想我是从gisinternals.com/sdk获得的

– Sasa Ivetic
2011年8月3日在20:33



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

–鞣剂
2011年8月4日在18:03

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

–kflaw
16年6月22日在19:45

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

–鞣剂
16年6月23日在17:19

#2 楼

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

评论


更新12/2017:不推荐使用geojson-utils。参见arcgis-to-geojson-utils或terraformer

– GavinR
17年12月11日14:44



#3 楼

现在,ArcGIS现在支持GeoJSON
ArcGIS Server(自10.4起),并且ArcGIS Online通过ArcGIS Rest API URL具有GeoJSON。您只需要在URL中设置f=geojson并配置服务即可。请注意,默认情况下,在您明确允许其他输出格式之前,ArcGIS Online将不允许GeoJSON导出。
以下是启用导出的方法:

登录到ArcGIS Online
单击要素图层,
单击“设置”选项卡
选中显示“


导出数据
”的复选框,以允许其他人导出为不同格式。
5。保存并等待几分钟。

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

这里是新闻发布,宣布2014年12月的功能

您可以在此处看到他们的GeoJSON示例

这是一个带有可自定义选项的HTML论坛,向您显示了ArcGIS API的功能



评论


轻松休息服务与ArcGIS Server休息服务是否不同?只能由agol提供geoJSON作为休息服务,而不提供服务器吗?

– jotamon
18年3月29日在23:57

我刚刚编辑了答案,希望很快就会显示出来,从10.4开始,ArcGIS Server也支持该答案。

– Philip Nagel
20年7月9日,下午1:36

#4 楼

从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)
17年1月12日在7:36

“ *可能要为Leaflet javascript进行修改”-是否有更新? (而且,地图屠夫URL是404 :-(

–莫格说要恢复莫妮卡
20-11-10在21:09



#5 楼

传单和ArGIS矢量层。

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

工作演示。
http:// geojason。 info / leaflet-vector-layers / demos / arcgis-server /

有关Leaflet和ArcGIS的更多信息。

您可以获取支持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图像服务和传单
http://blog.geomusings.com/2012/04/17/arcgis-image-services-and-leaflet/

#6 楼

它通常*非常容易转换。

我制作了一个脚本https://github.com/calvinmetcalf/esri2geo,还有其他脚本也能很好地工作。

*例外是具有孔的多部分多边形,在不进行某些地理处理的情况下不会将其一对一转换。

#7 楼

我已经构建了一个服务器对象扩展,可以从ArcGIS Server地图服务生成GeoJSON。它已经在10.1和10.2上进行了测试,但是还没有过测试。 https://github.com/geobabbler/AGSOpenFormats

#8 楼

对于一次转换,我将使用@Sasa Ivetic可接受的答案,但需要实时进行,Terraformer为此进行了体面的工作。不幸的是,默认情况下它仅适用于单个功能,因此对于多个功能,您需要遍历数组并为每个功能添加一个ID:

除了多部分多边形(即阿拉斯加及其岛)以外,但是我对此并不陌生,所以可能我编写的代码不正确!

#9 楼

将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。您的根目录中的bundle.js文件。

现在在浏览器html文件中,包含此bundle.js文件

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


您可以使用现在通过

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


记住esri_arc gis_to_geojson是您命名为lib的名称。

这将成为全局变量名称,可在浏览器中使用。 })是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


arcgis-to-geojson-utils

#10 楼

如果它是一次性查询,并且您没有超过1000个功能,请尝试使用添加矢量层将其粘贴到qgis中-选择协议,并将此arcgis rest 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

#11 楼

我在https://observablehq.com/@thadk/arcgis-json-parser-to-geojson的浏览器中制作了用于ESRI JSON-> GeoJSON转换的ESRI Terraformer工具的网络版本,可以在ArcGIS服务器上根据需要进行自定义不允许您直接将其导出为GeoJSON。

#12 楼




也许甚至更容易,您可以使用Esri-leaflet库将本机添加为Leaflet中的图层。

评论


您能否在帖子中加入一个示例,概述此答案是OP的问题?

– Paul
2013年9月26日18:00

#13 楼

如果您需要将ArcServer Service作为GeoJSON返回以在所需的任何映射技术中使用,我强烈建议您查看此GitHub问题对话框。因为那会浪费时间。您可以直接从Esri那里清楚地列出您的选择。

#14 楼

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仅具有1层,则layerID = 0 .....

尝试此html查询页面,可以看到geojson是选项,因为您是查询特定图层的layerID = 0

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


注意:记得设置这2个参数: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与tile服务一起使用的人,

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