Hi, I'm using a SOE and I would like to export a geometry to file in order to share it.
I tried with ExportToESRIShape (like in this example) but saving the output buffer in a file I didn't obtain a known format (e.g. shp or zip).
Anyone knows about another method? or an ExportToESRIShape example to export to file?
Thanks in advance,
Guglielmo.
Solved! Go to Solution.
In help you need see class that implement the interface IFeatureClassName
You can write similar code:
IMapServer mapServer = (IMapServer)serverObjectHelper.ServerObject;
string mapName = mapServer.DefaultMapName;
IMapServerDataAccess dataAccess = (IMapServerDataAccess)mapServer;
IFeatureClass sourceFeatureClass = (IFeatureClass)dataAccess.GetDataSource(mapName, 0);
IDataset sourceDataSet = (IDataset)sourceFeatureClass;
IWorkspace sourceWorkspace = sourceDataSet.Workspace;
IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
IWorkspaceFactory targetWorkspaceFactory = new ShapefileWorkspaceFactory();
IWorkspace targetWorkspace = targetWorkspaceFactory.OpenFromFile($@"c:\temp", 0);
IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
IName targetWorkspaceDatasetName = targetWorkspaceDataset.FullName;
IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDatasetName;
IFeatureClassName shpFeatureClassName = new FeatureQueryNameClass();
IDatasetName shpDatasetName = (IDatasetName)shpFeatureClassName;
shpDatasetName.WorkspaceName = targetWorkspaceName;
shpDatasetName.Name = $"Test_{Guid.NewGuid()}";
int shapeFieldPosition = sourceFeatureClass.FindField(sourceFeatureClass.ShapeFieldName);
IFields inputFields = sourceFeatureClass.Fields;
IField shapeField = inputFields.get_Field(shapeFieldPosition);
IGeometryDef geometryDef = (IGeometryDef)((IClone)shapeField.GeometryDef).Clone();
IFields outFields = (IFields)((IClone)sourceFeatureClass.Fields).Clone();
featureDataConverter.ConvertFeatureClass((IFeatureClassName)sourceDataSet.FullName, null, null, shpFeatureClassName, geometryDef, outFields, "", 1000, 0);
First, I don't know what SOE is. But I don't think it matters. I'm responding to make sure you know that an ESRI shapefile is not a SINGLE file. An ESRI Shapefile is a collection of files (minimum 3, maximum like 7). So when you say you didn't get a known format (shp or zip) you won't get a single file. If you export to a shapefile you will get a collection of files with the same root name and each having a different filename extension (ie: .shp, .dbf, .prj, .shx, ...)
if can be useful you can see my soe https://github.com/nicogis/Factory-Utilities-SOE
here you have an operation ('ExtractData') https://github.com/nicogis/Factory-Utilities-SOE/blob/37f3a4868d85435bf03cb3b6648a1a7dedccae40/Facto... where if you can pass a featureset from client you can select parameter dataFormat (SHAPEFILE) to dowload file zipped
If you want use sdk you can use FeatureDataConverter class ( FeatureDataConverter Class (arcgis.com) )
- create a scratch file gdb (try and see if you can use ProConcepts DDL · Esri/arcgis-pro-sdk Wiki · GitHub ) or use a template gdb empty on server
- use method convertfeatureclass ( IFeatureDataConverter2 Interface | ArcGIS Enterprise SDK )
- zip gdb
- download file (see this samples arcgis-enterprise-sdk-resources/Samples/dot net/SOE/DownloadFileRESTSOE at master · Esri/arcgis-ente... )
Thanks nicogis!
I tried to use your ConvertFeatureClassToShapefile.
ConvertFeatureClassToShapefile takes as input IWorkspace sourceWorkspace and I have created a sourceWorkspace with:
IMapServer mapServer = (IMapServer)serverObjectHelper.ServerObject;
string mapName = mapServer.DefaultMapName;
// Use IMapServerDataAccess to get the data
IMapServerDataAccess dataAccess = (IMapServerDataAccess)mapServer;
// Get access to the source feature class.
IFeatureClass m_fc = (IFeatureClass)dataAccess.GetDataSource(mapName, 0);// Layer 0
IDataset pDataSet = (IDataset)m_fc;
IWorkspace sourceWorkspace = pDataSet.Workspace;
in ConvertFeatureClassToShapefile it is used new FeatureClassNameClass() does not exist in the SDK.
I replaced it with (IFeatureClassName)pDataSet.FullName but calling (IFeatureClass)sourceName.Open() I get System.Runtime.InteropServices.COMException (0x80040351): Exception from HRESULT: 0x80040351 at ESRI.ArcGIS.esriSystem.IName.Open()
Where am I doing wrong?
Thanks again.
In help you need see class that implement the interface IFeatureClassName
You can write similar code:
IMapServer mapServer = (IMapServer)serverObjectHelper.ServerObject;
string mapName = mapServer.DefaultMapName;
IMapServerDataAccess dataAccess = (IMapServerDataAccess)mapServer;
IFeatureClass sourceFeatureClass = (IFeatureClass)dataAccess.GetDataSource(mapName, 0);
IDataset sourceDataSet = (IDataset)sourceFeatureClass;
IWorkspace sourceWorkspace = sourceDataSet.Workspace;
IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
IWorkspaceFactory targetWorkspaceFactory = new ShapefileWorkspaceFactory();
IWorkspace targetWorkspace = targetWorkspaceFactory.OpenFromFile($@"c:\temp", 0);
IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
IName targetWorkspaceDatasetName = targetWorkspaceDataset.FullName;
IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDatasetName;
IFeatureClassName shpFeatureClassName = new FeatureQueryNameClass();
IDatasetName shpDatasetName = (IDatasetName)shpFeatureClassName;
shpDatasetName.WorkspaceName = targetWorkspaceName;
shpDatasetName.Name = $"Test_{Guid.NewGuid()}";
int shapeFieldPosition = sourceFeatureClass.FindField(sourceFeatureClass.ShapeFieldName);
IFields inputFields = sourceFeatureClass.Fields;
IField shapeField = inputFields.get_Field(shapeFieldPosition);
IGeometryDef geometryDef = (IGeometryDef)((IClone)shapeField.GeometryDef).Clone();
IFields outFields = (IFields)((IClone)sourceFeatureClass.Fields).Clone();
featureDataConverter.ConvertFeatureClass((IFeatureClassName)sourceDataSet.FullName, null, null, shpFeatureClassName, geometryDef, outFields, "", 1000, 0);