sra_esri

AutomationException: No spatial reference exists.

Discussion created by sra_esri on Oct 28, 2010
Latest reply on Nov 17, 2016 by victoria.tori.hall@gmail.com
I have been given the task of creating a file geodatabase, as a way of exporting spatial data from our (Oracle) database into a format suitable for use in a client's ArcGIS system.

I have managed to create a feature workspace, and a feature dataset within this workspace.  My code fails while attempting to create a feature class, throwing "AutomationException: No spatial reference exists." on the "featureDataset.createFeatureClass" call marked in the code below.  I'm totally confused by this, as I have explicitly created a SpatialReference object and used it when creating the dataset.  Where am I going wrong?

package envirosys.gi;

import com.esri.arcgis.datasourcesGDB.FileGDBWorkspaceFactory;
import com.esri.arcgis.geodatabase.*;
import com.esri.arcgis.geometry.*;
import com.esri.arcgis.interop.AutomationException;
import com.esri.arcgis.system.*;
import envirosys.util.*;
import oracle.jbo.*;
import org.apache.log4j.Logger;

public class GeodatabaseTask extends Thread {

  private ApplicationModule am = null;
  private Logger logger = null;
  private String path = null;
  private String filename = null;
  
  private boolean isNew = false;

  public GeodatabaseTask(ApplicationModule am, Logger logger, String path, String filename) {
    this.am = am;
    this.logger = logger;
    this.path = path;
    this.filename = filename;
  }
  
  public void run() {
    try {
      this.logger.info("Starting Geodatabase export");
      
      EngineInitializer.initializeEngine();
      
      AoInitialize aoInitializer = new AoInitialize();
      if ( aoInitializer.isProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeArcView) == esriLicenseStatus.esriLicenseAvailable ) {
        aoInitializer.initialize(esriLicenseProductCode.esriLicenseProductCodeArcView);
      } else {
        aoInitializer.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
      }
      
      IWorkspace workspace = this.getWorkspace();
      IFeatureWorkspace featureWorkspace = new IFeatureWorkspaceProxy(workspace);
      
      ISpatialReference spatialReference = new UnknownCoordinateSystem();
      spatialReference.setDomain(0, 21474.83645, 0, 21474.83645);
      spatialReference.setFalseOriginAndUnits(0, 0, 100000);
      spatialReference.setMDomain(0, 21474.83645);
      spatialReference.setZDomain(0, 21474.83645);
      spatialReference.setZFalseOriginAndUnits(0, 100000);
     
      StringBuffer sbSQL = new StringBuffer("SELECT spae_id, schema_name, table_name FROM spatial_extracts ORDER BY spae_id");
      ViewObject voSpatialExtracts = DBCommon.getViewObject(this.am, "voSpatialExtracts", sbSQL.toString(), true);
      while ( voSpatialExtracts.hasNext() ) {
        Row rowSpatialExtract = voSpatialExtracts.next();
        
        String spaeId = PageFields.getStringValue(rowSpatialExtract.getAttribute("SPAE_ID"));
        String schemaName = PageFields.getStringValue(rowSpatialExtract.getAttribute("SCHEMA_NAME"));
        String tableName = PageFields.getStringValue(rowSpatialExtract.getAttribute("TABLE_NAME"));

        IFeatureDataset featureDataset = null;
        if ( this.isNew ) {
          featureDataset = featureWorkspace.createFeatureDataset(tableName, spatialReference);
        } else {
          featureDataset = featureWorkspace.openFeatureDataset(tableName);
        }
 
        IFeatureClass featureClass = this.createFeatureClass(featureDataset, spaeId, tableName);
 
        this.createFeatures(featureClass, schemaName, tableName);
      }
      voSpatialExtracts.remove();
      voSpatialExtracts = null;
      
      aoInitializer.shutdown();
      
      this.logger.info("Completed Geodatabase export");
    } catch ( AutomationException ae ) {
      System.out.println("CODE [" + ae.getCode() + "], DESCRIPTION [" + ae.getDescription() + "]");
    } catch ( Exception e ) {
      Utilities.dumpError("GeodatabaseTask.run", this.logger, e);
    }
  }
  
  private IWorkspace getWorkspace() {
    IWorkspace workspace = null;

    try {
      IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactory();
      
      if ( workspaceFactory.isWorkspace(this.path + this.filename + ".gdb") ) {
        workspace = workspaceFactory.openFromFile(this.path + this.filename + ".gdb", 0);
      } else {
        IWorkspaceName workspaceName = workspaceFactory.create(this.path, this.filename + ".gdb", null, 0);
        IName name = (IName)workspaceName;
        workspace = new IWorkspaceProxy(name.open());
        
        this.isNew = true;
      }
    } catch ( AutomationException ae ) {
      System.out.println("CODE [" + ae.getCode() + "], DESCRIPTION [" + ae.getDescription() + "]");
    } catch ( Exception e ) {
      Utilities.dumpError("GeodatabaseTask.getWorkspace", this.logger, e);
    } finally {
      return workspace;
    }
  }

  private IFeatureClass createFeatureClass(IFeatureDataset featureDataset, String spaeId, String table) {
    IFeatureClass featureClass = null;

    try {
      StringBuffer sbSQL = new StringBuffer("SELECT spae.method_alias, tesm.name FROM spatial_extract_methods spae, test_methods tesm WHERE spae.spae_id = " + spaeId + " AND tesm.tesm_id = spae.tesm_id");
      ViewObject voMethods = DBCommon.getViewObject(this.am, "voMethods", sbSQL.toString(), true);
      int fieldCount = new Long(voMethods.getEstimatedRowCount()).intValue() + 2;
      int fieldCtr = 0;

      IFields fields = new Fields();
      IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
      fieldsEdit.setFieldCount(fieldCount);

      IField fieldUserDefined = new Field();
      IFieldEdit fieldEdit = (IFieldEdit)fieldUserDefined;
      fieldEdit.setName("OBJECTID");
      fieldEdit.setAliasName("OBJECT ID");
      fieldEdit.setType(esriFieldType.esriFieldTypeOID);
      fieldsEdit.setFieldByRef(fieldCtr++, fieldUserDefined);

      IGeometryDef geometryDef = new GeometryDef();
      IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
      geometryDefEdit.setGeometryType(esriGeometryType.esriGeometryPoint);

      geometryDefEdit.setGridCount(1);
      geometryDefEdit.setGridSize(0, 0);
      geometryDefEdit.setHasM(false);
      geometryDefEdit.setHasZ(false);

      fieldUserDefined = new Field();
      fieldEdit = (IFieldEdit)fieldUserDefined;
      fieldEdit.setName("SHAPE");
      fieldEdit.setType(esriFieldType.esriFieldTypeGeometry);
      fieldEdit.setGeometryDefByRef(geometryDef);
      fieldEdit.setIsNullable(true);
      fieldEdit.setRequired(true);
      fieldsEdit.setFieldByRef(fieldCtr++, fieldUserDefined);

      while ( voMethods.hasNext() ) {
        Row rowMethod = voMethods.next();
        
        fieldUserDefined = new Field();
        fieldEdit = (IFieldEdit)fieldUserDefined;
        fieldEdit.setName(PageFields.getStringValue(rowMethod.getAttribute("NAME")));
        fieldEdit.setAliasName(PageFields.getStringValue(rowMethod.getAttribute("METHOD_ALIAS")));
        fieldEdit.setEditable(true);
        fieldEdit.setIsNullable(false);
        fieldEdit.setPrecision(18);
        fieldEdit.setScale(8);
        fieldEdit.setType(esriFieldType.esriFieldTypeDouble);
        fieldsEdit.setFieldByRef(fieldCtr++, fieldUserDefined);
      }
      voMethods.remove();
      voMethods = null;

      IFeatureClassDescription fcDesc = new FeatureClassDescription();
      IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;

      featureClass = featureDataset.createFeatureClass(table, fields, ocDesc.getInstanceCLSID(), ocDesc.getClassExtensionCLSID(), esriFeatureType.esriFTSimple, "SHAPE", ""); // fails on this line
    } catch ( AutomationException ae ) {
      System.out.println("CODE [" + ae.getCode() + "], DESCRIPTION [" + ae.getDescription() + "]");
    } catch ( Exception e ) {
      Utilities.dumpError("GeodatabaseTask.createFeatureClass", this.logger, e);
    } finally {
      return featureClass;
    }
  }
  
  private void createFeatures(IFeatureClass featureClass, String schema, String table) {
    
    try {
      if ( featureClass.getShapeType() != esriGeometryType.esriGeometryPoint) {
        return;
      }
      
      IFields fields = featureClass.getFields();
      
      StringBuffer sbSQL = new StringBuffer("SELECT * FROM " + schema + "." + table);
      ViewObject voPoints = DBCommon.getViewObject(this.am, "voPoints", sbSQL.toString(), true);
      while ( voPoints.hasNext() ) {
        Row rowPoint = voPoints.next();
        
        IPoint point = null;
        
        IFeature feature = featureClass.createFeature();
        feature.setShapeByRef(point);
        
        ISubtypes subtypes = (ISubtypes)featureClass;
        IRowSubtypes rowSubtypes = (IRowSubtypes)feature;
        if ( subtypes.isHasSubtype() ) {
          rowSubtypes.setSubtypeCode(3);
        }
        
        rowSubtypes.initDefaultValues();
        
        for ( int fieldCtr = 0; fieldCtr < fields.getFieldCount(); fieldCtr++ ) {
          IField field = fields.getField(fieldCtr);
          String alias = field.getAliasName();
          
          String value = PageFields.getStringValue(rowPoint.getAttribute(alias));
          if ( !value.equals("") ) {
            feature.setValue(fieldCtr, value);
          }
        }
        
        feature.store();
      }
      voPoints.remove();
      voPoints = null;
    } catch ( AutomationException ae ) {
      System.out.println("CODE [" + ae.getCode() + "], DESCRIPTION [" + ae.getDescription() + "]");
    } catch ( Exception e ) {
      Utilities.dumpError("GeodatabaseTask.createFeatures", this.logger, e);
    }
  }
}

Outcomes