POST
|
Hello, I have a problem with versioning using ArcSDE. The customer has the following configuration: - ArcSDE 9.3.1 (yes, I know it is an ancient version, but I cannot do anything about it) running on Windows 2008 - Oracle database 11gR2 - Arcmap 10.1 to edit data Everything worked fine until last weekend the server with the database crashed. We restarted it, restarted SDE and it began working again. The only problem is with versioning. When I start editing all edits are commited to the base version on the moment I make them. I cannot do undo/redo operations - they are inactive. When I stop editing I do not get the prompt dialog to choose if the data should be saved or not. What we have done already: - restarted SDE and database again - unversioned and again registered as versioned (with moving edits to base) the whole dataset - I prepared a new mxd file to make sure it is not the case - I made sure that in Editor -> Options -> Versioning tab, the option to use versioning is enabled (I use Arcmap 10.3.1, but it seems that arcmap is not the problem). Unfortunately nothing helped. Did I miss something that need to be set ? Generally I did not see any errors neither in ArcMap, ArcCatalog and SDE logs. The funny thing is that we have another SDE instances running on the mentioned windows machine, but they point to different databases. And editing works fine with them. We have compared SDE schemas on those databases and found no differences. Did anyone had similiar problems and could have any suggestions ? If you need more information pleaase tell me and I will provide what is needed.
... View more
09-22-2016
12:55 AM
|
0
|
1
|
970
|
POST
|
Hello, I have a question about table joins and relations in ESRI REST FeatureService. I created an mxd file with several layers and managed to create a REST service out of it. I can see all layers, symbols etc. Here everything works fine. Today I wanted to add a join to a layer. I joined another layer from the same document. In ArcMap everything worked fine. I could see the joined fields. When I uploaded the service (which by the way did not want tu update itself and I had to delete the service and publish the mxd as a new one) I found out that all my columns in the layer, that was the owner of the join, disappeared. In FeatureServer I had only the OID and geometry. When I looked at MapServer service definition of this layer - everything was fine. All the fields, along with the joined ones, were present. Similiar thing happens with relations. I create a relation to a another layer in the same mxd file and its definition is visible in MapServer and not in FeatureServer. Did anyone come accross this error ? What I might be doing wrong? And one more thing. Is there a way for FeatureServer to show layers hierarchy like MapServer does ? With group layers visible ? I use ArcGis Server 10.3. It runs on Windows Server 2012 R2 Standard (64 bit). If anything written above is unclear please let me know and I'll update my question.
... View more
11-20-2015
01:04 AM
|
0
|
1
|
2382
|
POST
|
Hello, recently I have been trying to establish direct connection to oracle geodatabase using Java API. The problem is, that when I execute the code, the connection works fine only in debug mode when I execute the program step by step. In all other cases the program hangs trying to establish the connection. Here is a piece of code that I use: public class SdeTest {
public static void main(String[] args) {
SeConnection connection = null;
try {
System.out.println("Connecting");
connection = new SeConnection("none", "sde:oracle11g:geobase_tns", "none", "{my-user}", "{my-password}@geobase_tns");
System.out.println("CONNECTION OK");
} catch (SeException e) {
e.printStackTrace();
} finally {
if(connection != null) {
try {
connection.freeAllLocks();
connection.close();
} catch (SeException e) {
e.printStackTrace();
}
}
}
}
} Here is my system configuration: System: Windows 7 Professional 64bit Java: 8 update 40 64 bit Oracle client: Oracle 11g 64bit ArcSDE SDK: 10.2.2 64bit Other settings. 1. I have created SDEHOME system variable and its value points to a folder on the disk. Inside the folder I created 'bin' directory and filled it with the following files: icudt44.dll icuuc44.dll pe.dll sg.dll xerces-c_3_1.dll sde.dll sdejavautil.dll gsrvrora11g102.dll sdeora11gsrvr102.dll 2. The path to {SDEHOME}/bin is added to the Path of the system. 3. The path to {SDEHOME}/bin is added to Java VM: -Djava.library.path={absolute-path-to-bin-folder} 4. The oracle databases are fine, I cann see my spatial data with ArcCatalog. 5. Here is my TNS definition: geobase_tns = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {my-host-ip})(PORT = {my-port-number})) ) (CONNECT_DATA = (SERVICE_NAME = {my-service-name}) ) ) 6. Here is my sqlnet.ora file: SQLNET.AUTHENTICATION_SERVICES= (NONE) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) What I've already tried. 1. I tried to use other java versions 2. I tried to add ORACLE_HOME system variable and pointed it to my oracle client installation 3. I disabled Windows firewall and my antivirus system. 4. I tried connecting to both 9.3.1 oracle geodatabase and 10.3 oracle geodatabase. In each case I got the same result: stepping in debug mode is fine, running the application freely - hangs. At this point I am run out of ideas. I can see in my IDE (eclipse - mars) that it holds at SeConnection.createDirectConnection() method. Can someone give me some suggestions why it behaves like that ? Maybe I missed something while preparing the system for direct connection.
... View more
07-04-2015
10:20 AM
|
0
|
3
|
3766
|
POST
|
Really? Nobody tried to read shapefiles this way using FeatureTables ? I know I posted lots of code, but it really is not that dificult to understand 😉 Even an information that what I am doing is not possible would be valuable. It would definitely save me a lot time.
... View more
02-11-2014
11:36 PM
|
0
|
0
|
1020
|
POST
|
The ShapefileFeature class:
public class ShapefileFeature implements Feature {
private long id;
private AbstractShape abstractShape;
private Geometry geometry;
private Map<String, Object> attributes;
private SpatialReference spatialReference;
private Symbol symbol;
public ShapefileFeature(AbstractShape abstractShape,
Map<String, Object> attributes, SpatialReference spatialReference,
Symbol symbol) {
this.abstractShape = abstractShape;
this.attributes = attributes;
this.spatialReference = spatialReference;
this.symbol = symbol;
}
/*package*/ void setId(long id) {
this.id = id;
}
public Object getAttributeValue(String fieldName) {
return attributes == null ? null : attributes.get(fieldName);
}
public Map<String, Object> getAttributes() {
return attributes;
}
public Geometry getGeometry() {
if(geometry == null) {
geometry = this.toGeometry(abstractShape);
}
return geometry;
}
public long getId() {
return id;
}
public SpatialReference getSpatialReference() {
return spatialReference;
}
public Symbol getSymbol() {
return symbol;
}
private Geometry toGeometry(AbstractShape ps) {
if(ps instanceof PolylineShape) {
Polyline result = new Polyline();
PointData[] points = ((PolylineShape)ps).getPoints();
for(int i=0;i<points.length - 1;++i) {
Line linePart = new Line();
linePart.setStart(new Point(points.getX(), points.getY()));
linePart.setEnd(new Point(points[i + 1].getX(), points[i + 1].getY()));
result.addSegment(linePart, result.getPathCount() == 0);
}
return result;
}
//TODO: other geometries will be implemented later
throw new IllegalStateException("Not yet implemented!");
}
}
And at last GeometryUtils that is made to filter objects by geometry and is used in spatial queries:
public class GeometryUtils {
private static Map<SpatialRelationship, GeometryRelationFilter> FILTERS = new HashMap<SpatialRelationship, GeometryRelationFilter>();
static {
FILTERS.put(SpatialRelationship.CONTAINS, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
return GeometryEngine.contains(left, right, sr);
}
});
FILTERS.put(SpatialRelationship.CROSSES, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
return GeometryEngine.crosses(left, right, sr);
}
});
FILTERS.put(SpatialRelationship.ENVELOPE_INTERSECTS, new GeometryRelationFilter() {
private Envelope leftGeomExtent = new Envelope();
private Envelope rightGeomExtent = new Envelope();
public synchronized boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
left.queryEnvelope(leftGeomExtent);
right.queryEnvelope(rightGeomExtent);
Envelope leftEnvelope = leftGeomExtent.getXMin() <= rightGeomExtent.getXMin() ? leftGeomExtent : rightGeomExtent;
Envelope rightenvelope = leftEnvelope == leftGeomExtent ? rightGeomExtent : leftGeomExtent;
if(leftEnvelope.getXMax() < rightenvelope.getXMin()) {
return false;
}
Envelope topEnvelope = leftGeomExtent.getYMax() >= rightGeomExtent.getYMax() ? leftGeomExtent : rightGeomExtent;
Envelope bottomEnvelope = topEnvelope == leftGeomExtent ? rightGeomExtent : leftGeomExtent;
return topEnvelope.getYMin() < bottomEnvelope.getYMax();
}
});
FILTERS.put(SpatialRelationship.INTERSECTS, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
Geometry intersection = GeometryEngine.intersect(left, right, sr);
return intersection != null && !intersection.isEmpty();
}
});
FILTERS.put(SpatialRelationship.TOUCHES, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
return GeometryEngine.touches(left, right, sr);
}
});
FILTERS.put(SpatialRelationship.WITHIN, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
return GeometryEngine.within(left, right, sr);
}
});
FILTERS.put(SpatialRelationship.OVERLAPS, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
if(left.getDimension() != right.getDimension()) {
Geometry intersection = GeometryEngine.intersect(left, right, sr);
return intersection.getDimension() == left.getDimension();
}
throw new IllegalArgumentException("Relacja pokrywania (overlap) jest nieokre�?lona dla różnych typów geometrii!");
}
});
FILTERS.put(SpatialRelationship.INDEX_INTERSECTS, new GeometryRelationFilter() {
public boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr) {
//TODO
throw new IllegalStateException("Relacja INDEX_INTERSECTS jest niezaimplementowana!");
}
});
}
public static List<Feature> filterFeatures(Map<Long, Feature> features,
Geometry filterGeometry, SpatialRelationship sr, int maxFeatures) {
GeometryRelationFilter filter = FILTERS.get(sr);
List<Feature> result = new ArrayList<Feature>(500 > features.size() ? 500 : features.size());
for(Entry<Long, Feature> feature : features.entrySet()) {
Feature f = feature.getValue();
if(filter.isRelationvalid(filterGeometry, f.getGeometry(), f.getSpatialReference())) {
result.add(f);
}
if(result.size() >= maxFeatures) {
break;
}
}
return result;
}
public static List<Feature> filterFeatures(Collection<Feature> features,
Geometry filterGeometry, SpatialRelationship sr, int maxFeatures) {
GeometryRelationFilter filter = FILTERS.get(sr);
List<Feature> result = new ArrayList<Feature>(500 > features.size() ? 500 : features.size());
for(Feature f : features) {
if(filter.isRelationvalid(filterGeometry, f.getGeometry(), f.getSpatialReference())) {
result.add(f);
}
if(result.size() >= maxFeatures) {
break;
}
}
return result;
}
private static interface GeometryRelationFilter {
boolean isRelationvalid(Geometry left, Geometry right, SpatialReference sr);
}
}
... View more
02-04-2014
09:14 PM
|
0
|
0
|
1020
|
POST
|
And here is my implementation of the feature table:
public class ShapefileFeatureTable extends FeatureTable {
private String tableName;
private boolean hasGeometry;
private SpatialReference spatialReference;
private Map<String, Field> fields = new HashMap<String, Field>(2);
private Map<Long, Feature> features = new HashMap<Long, Feature>();
private SimpleLineSymbol sls = new SimpleLineSymbol(Color.BLUE, 8);
private long featureId = 1;
public ShapefileFeatureTable(String shapefilePath) {
tableName = shapefilePath.substring(shapefilePath.lastIndexOf('/') + 1, shapefilePath.lastIndexOf('.'));
//TODO: load from shp
fields.put("OID", new ShapefileField("OID", Field.esriFieldTypeOID, 8));
fields.put("SHAPE", new ShapefileField("SHAPE", Field.esriFieldTypeGeometry, -1));
hasGeometry = true;
spatialReference = SpatialReference.create(SpatialReference.WKID_WGS84);
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(shapefilePath);
bis = new BufferedInputStream(fis);
ShapeFileReader reader = new ShapeFileReader(bis);
AbstractShape shape = reader.next();
while(shape != null) {
this.addFeature(new ShapefileFeature(shape,
null,
spatialReference, sls));
shape = reader.next();
}
} catch (Exception e) {
}
}
@Override
public long addFeature(Feature feature) throws TableException {
if(feature instanceof ShapefileFeature) {
this.validateSchema(feature);
long id = featureId++;
((ShapefileFeature) feature).setId(id);
features.put(id, feature);
return id;
}
throw new TableException("You can only add type: ShapefileFeature!');
}
@Override
public long[] addFeatures(List<Feature> features) throws TableException {
if(features != null && features.size() > 0) {
long[] result = new long[features.size()];
int index = 0;
for(Feature feature : features) {
result[index++] = this.addFeature(feature);
}
return result;
}
return new long[0];
}
@Override
public void deleteFeature(long featureId) throws TableException {
features.remove(featureId);
}
@Override
public void deleteFeatures(long[] featureIds) throws TableException {
if(featureIds != null && featureIds.length > 0) {
for(long featureId : featureIds) {
this.deleteFeature(featureId);
}
}
}
@Override
public String getCopyright() {
return "C";
}
@Override
public Feature getFeature(long id) throws TableException {
return features.get(id);
}
@Override
public FeatureResult getFeatures(long[] ids) {
ShapefileFeatures result = new ShapefileFeatures();
if(ids != null && ids.length > 0) {
List<Object> features = new ArrayList<Object>(ids.length);
for(long id : ids) {
features.add(this.features.get(id));
}
result.setFeatures(this.features.values());
}
return result;
}
@Override
public Field getField(String fieldName) {
return fields.get(fieldName);
}
@Override
public List<Field> getFields() {
return new ArrayList<Field>(fields.values());
}
@Override
public String getTableName() {
return tableName;
}
@Override
public boolean hasGeometry() {
return hasGeometry;
}
@Override
public boolean isEditable() {
return true;
}
@Override
public Future<FeatureResult> queryFeatures(final QueryParameters queryParameters, final CallbackListener<FeatureResult> callbackListener) {
return new FutureTask<FeatureResult>(new Callable<FeatureResult>() {
public FeatureResult call() throws Exception {
try {
FeatureResult result = ShapefileFeatureTable.this.queryFeatures(queryParameters);
callbackListener.onCallback(result);
return result;
} catch(Exception e) {
callbackListener.onError(e);
throw e;
}
}
});
}
@Override
public Future<long[]> queryIds(final QueryParameters queryParameters, final CallbackListener<long[]> callbackListener) {
return new FutureTask<long[]>(new Callable<long[]>() {
public long[] call() throws Exception {
try {
FeatureResult result = ShapefileFeatureTable.this.queryFeatures(queryParameters);
long[] ids = new long[(int) result.featureCount()];
Iterator<Object> iterator = result.iterator();
int index = 0;
while(iterator.hasNext()) {
Object obj = iterator.next();
if(obj instanceof Feature) {
ids[index++] = ((Feature) obj).getId();
}
}
callbackListener.onCallback(ids);
return ids;
} catch(Exception e) {
callbackListener.onError(e);
throw e;
}
}
});
}
private FeatureResult queryFeatures(QueryParameters queryParameters) {
int maxFeatures = queryParameters.getMaxFeatures();
if(maxFeatures <= 0) {
maxFeatures = Integer.MAX_VALUE;
}
List<Feature> features = null;
if(queryParameters.getObjectIds() != null && queryParameters.getObjectIds().length > 0) {
features = new ArrayList<Feature>(Math.min(maxFeatures, queryParameters.getObjectIds().length));
for(long id : queryParameters.getObjectIds()) {
features.add(this.features.get(id));
}
}
Geometry g = queryParameters.getGeometry();
if(g != null) {
SpatialRelationship sr = queryParameters.getSpatialRelationship();
if(sr == null) {
throw new IllegalArgumentException("Nie podano typu relacji przestrzennej!");
}
if(features != null) {
features = GeometryUtils.filterFeatures(features, g, sr, maxFeatures);
} else {
features = GeometryUtils.filterFeatures(this.features, g, sr, maxFeatures);
}
}
ShapefileFeatures result = new ShapefileFeatures();
result.setFeatures(features);
return result;
}
@Override
public void updateFeature(long featureId, Feature feature) throws TableException {
this.validateSchema(feature);
if(features.containsKey(featureId)) {
features.put(featureId, feature);
}
}
@Override
public void updateFeatures(long[] ids, List<Feature> features) throws TableException {
if(ids != null && features != null && ids.length > 0 && ids.length == features.size()) {
int index = 0;
for(Feature feature : features) {
this.updateFeature(ids[index++], feature);
}
}
}
private void validateSchema(Feature feature) throws TableException {
//TODO
}
public static class ShapefileFeatures extends FeatureResult implements Iterator<Object> {
private List<Feature> features;
private int index;
private ShapefileFeatures() { }
private void setFeatures(Collection<Feature> features) {
if(features instanceof List) {
this.features = (List<Feature>)features;
} else {
this.features = new ArrayList<Feature>(features);
}
}
@Override
public Iterator<Object> iterator() {
return this;
}
@Override
public long featureCount() {
return features.size();
}
public boolean hasNext() {
return index < features.size() - 1;
}
public Object next() {
return this.hasNext() ? features.get(index++) : null;
}
public void remove() {
features.remove(index);
}
}
private static class ShapefileField extends Field {
private String name;
private int type;
private int length;
public ShapefileField(String name, int type, int length) {
this.name = name;
this.type = type;
this.length = length;
}
@Override
public String getAlias() {
return name;
}
@Override
public Domain getDomain() {
return null;
}
@Override
public int getFieldType() {
return type;
}
@Override
public String getName() {
return name;
}
@Override
public int getLength() {
return length;
}
}
}
... View more
02-04-2014
09:14 PM
|
0
|
0
|
1020
|
POST
|
Hello, recently I was trying to open a shapefile on Android and display it on the map. I am able to load the shapefile data but displaying it on the map is a little bit complicated. I tried to use FeatureLayer and FeatureTable to do this, but unfortunately there was no visible map on the screen. It it even possible to display shapefiles this way ? Here is my code for FeatureLayer:
public class ShapefileLayer extends FeatureLayer {
private String url;
public ShapefileLayer(String shpPath, Envelope fullExtent) {
super(new ShapefileFeatureTable(shpPath));
url = new File(shpPath).getAbsolutePath();
this.setFullExtent(fullExtent);
this.setInitialExtent(fullExtent);
this.setVisible(true);
this.initLayer();
this.changeStatus(STATUS.INITIALIZED);
}
@Override
public double getMaxScale() {
return 100000;
}
@Override
public double getMinScale() {
return 1;
}
@Override
public String getUrl() {
return url;
}
}
The other three classes are in next post because of the characters limit 🙂 In my MainActivity I add:
mapView.addLayer(new ShapefileLayer("/mnt/sdcard2/shp/gaz.shp", fullLayerExtent));
but I see only black screen or other layers if I add them too. The file from sdCard is available and I am able to open it for reading and writing so no problems there. These classes are very simple and do not include all the features I plan to add. It is made to only load geometry and display it on the map.
... View more
02-04-2014
09:09 PM
|
0
|
8
|
5193
|
Online Status |
Offline
|
Date Last Visited |
05-28-2024
03:03 PM
|