ThinkGeo.com    |     Documentation    |     Premium Support

GetFeatures and OracleLayer Questions

Hello,


We want to implement a mapsuite InMemoryFeatureLayer client side, in which the user sees and edits geometries from different kind of objects (bridges and bridges axis)

The object geometries shown depends on the following szenarios

1.- The user changes the actual map region, the system shows the geometries contained in the showing region.

2.- The user draws a fence in the actual map and defines criterias based on object data whith our query tool (like all objects whith name beginning "N"), the system shows the object geometries contained in the fence from the objects corresponding to the data criteria.

3.- The user selects a group of objects in our application object explorer, the system shows the geometries from the selected objects and actualices the actual map in background.



The geometries can be edited by the user and the changes need to be persisted.



Solution

We want to store the object geometries in the database. (We support oracle 10 and 11 and sql server 2008)

In our 3 tier achitecture application, the WMS - server will send the geometries in form of a mapsuite feature list.

The server needs to get features using spatial and data criterias.

In the MapSuite core we don't found methods which gives features as result that combines spatial and data criterias. 

The methods which gives features as result like SpatialQuery, GetFeaturesInsideBoundingBox only have spatial criteria

and the ohters, which combines both, like GetFeaturesByColumnValue or GetFeaturesByIds aren't sufficient for us. Our data criterias are more complex.

Question 1: Exists other methods whith result: features and input: spatial and data criterias.



We have problems by testing the oracleFeatureLayer. 

When we use the ExecuteQuery method and the query contains a column from type SDO_GEOMETRY we get the error "Nicht unterstützten Oracle-Datentyp USERDEFINED gefunden." (Not supported Oracle datatype Userdefined found)

The function FeatureSource.GetCount gives the right number of rows in the table

The function FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns) we get the error "ORA-01747: Ungültige Angabe für benutzer.tabelle.spalte, tabelle.spalte oder spalte" (ORA-01747: ORA-01747: invalid user.table.column, table.column, or column specification)

After adding the oracle layer to the WpfMap and by calling the Refresh Method we get a NullReferenceException

We tested with oracle client version 10 and server version 10, client version only ODAC 11 and server 11

Question 2: Have you an idea what the problem is, we don't found information about the errors in internet.



By analysing  the ExecuteQuery method from sqlFeatureLayer we noticed, that it allows queries with spatial and data criterias.

The result-table gives the results in database type format. 

It means, that we need to convert the geometry columns in features. For SqlServerLayer it is easy, but for the OracleLayer it will be more difficult.

Question 3: Exists MapSuite Core methods for transforming database geometry data in features, do we have access to this functions?

 


Many thanks,


Guillaume.



Guillaume 
  
 1,You can use SQL Query to help you implement complex criteria. Here is usually the way to do it.  
 A, Add a new column “FeatureId” to your database, this column store the ID for every feature 
 B, Execute your SQL statement with the complex criteria, and return the ID of the features, so the code would like  
 
“DataTable dataTable = layer.QueryTools.ExecuteQuery(“select FeatureId from cntry02 where …(the complex data criteria)”);
 
 C, you then can get the Id list from the returned dataTable, put that Ids to an array and use the layer.QueryTools.GetFeaturesByIds() to get the feature you want. 
   
 2, You can’t execute a query which returns a user defined data type such as ‘SDO_GEOMETRY’ which only exists in Oracle. To get the geometry data, you can execute query like this “SELECT tn.GeometryColumnName.GET_WKT() FROM TableName tn”, then use Base.CreateShapeFromWellKnownData(string wkt) to create the shape from the returned WKT. 
 I’m not sure about the problem with FeatureSource.GetAllFeatures(), it works fine in my test with our data. Can you let me know the column names in your oracle database? We will try to recreate it here. For now to work around, you can use Sql Statement (ExecuteQuery) to get all the tabular data.  
  
 3, As mentioned above, you can get the WKT of a feature from Oracle first, and then create a feature based on that using the following constructor. 
 Feature feature = new Feature(string wellKnownText); 
  
 Hope that helps, let us know if you have any issues. 
  
 Thanks, 
  
 Ben 


Hi Ben, 
  
 Thank you for your answer.  
 We will work with WKT on the Database Layer and convert this to features on the clients. 
 We have done some tests and our Oracle Version (11 and 10) doesn’t support GET_WKT(), we need to use SDO_UTIL.TO_WKTGEOMETRY(geometryColumnName), which has the same result. 
 For saving the WKT in the database we use SDO_UTIL.FROM_WKTGEOMETRY(WKT as string) 
  
 Thanks again, 
 Guillaume.

Guillaume, 
  
 That’s great! Let us know if you have more issues. 
  
 Thanks, 
  
 Ben