docs: public static Geometry symmetricDifference(Geometry geometry_a,
  			Geometry geometry_b, SpatialReference sr,
  			ProgressTracker progress_tracker) {
  		if (geometry_a.getDimension() > geometry_b.getDimension())
  			return normalizeResult_(normalizeInputGeometry_(geometry_a),
  					geometry_a, geometry_b, '^');
  
  		if (geometry_a.getDimension() < geometry_b.getDimension())
  			return normalizeResult_(normalizeInputGeometry_(geometry_b),
  					geometry_a, geometry_b, '^');
  
  		if (geometry_a.isEmpty())
  			return normalizeResult_(normalizeInputGeometry_(geometry_b),
  					geometry_a, geometry_b, '^');
  
  		if (geometry_b.isEmpty())
  			return normalizeResult_(normalizeInputGeometry_(geometry_a),
  					geometry_a, geometry_b, '^');
  
  		Envelope2D env2D_1 = new Envelope2D();
  		geometry_a.queryEnvelope2D(env2D_1);
  		Envelope2D env2D_2 = new Envelope2D();
  		geometry_b.queryEnvelope2D(env2D_2);
  		// TODO: add optimization here to merge two geometries if the envelopes
  		// do not overlap.
  
  		Envelope2D envMerged = new Envelope2D();
  		envMerged.setCoords(env2D_1);
  		envMerged.merge(env2D_2);
  		double tolerance = InternalUtils.calculateToleranceFromGeometry(sr,
  				envMerged, true);// conservative to have same effect as simplify
  
  		TopologicalOperations topoOps = new TopologicalOperations();
  		EditShape edit_shape = new EditShape();
  		int geom_a = edit_shape
  				.addGeometry(normalizeInputGeometry_(geometry_a));
  		int geom_b = edit_shape
  				.addGeometry(normalizeInputGeometry_(geometry_b));
  		topoOps.setEditShapeCrackAndCluster(edit_shape, tolerance,
  				progress_tracker);
  		int result = topoOps.symmetricDifference(geom_a, geom_b);
  		Geometry res_geom = normalizeResult_(edit_shape.getGeometry(result),
  				geometry_a, geometry_b, '^');
  
  		if (Geometry.isMultiPath(res_geom.getType().value())) {
  			((MultiVertexGeometryImpl) res_geom._getImpl()).setIsSimple(
  					GeometryXSimple.Strong, tolerance, false);
  			if (res_geom.getType() == Geometry.Type.Polygon)
  				((MultiPathImpl) res_geom._getImpl())._updateOGCFlags();
  		}
  
  		return res_geom;
  	}