diff --git a/.gitignore b/.gitignore
index 7de5508..77decf0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
obj
bin
+/OliviaAddIn.suo
diff --git a/OliviaAddIn.suo b/OliviaAddIn.suo
deleted file mode 100644
index 2f325da..0000000
Binary files a/OliviaAddIn.suo and /dev/null differ
diff --git a/OliviaAddIn/Comun.cs b/OliviaAddIn/Comun.cs
index 9d06489..73797ff 100644
--- a/OliviaAddIn/Comun.cs
+++ b/OliviaAddIn/Comun.cs
@@ -144,7 +144,6 @@ namespace OliviaAddIn
{
f = fc.GetFeature(ids[elem]);
geom = f.Shape;
- geom = FunGDB.reproyecta(geom, OliviaGlob.coorsys);//reproyecta por si hace falta
instalacion = (IPoint)geom;
x = instalacion.X;
y = instalacion.Y;
@@ -235,8 +234,7 @@ namespace OliviaAddIn
geom = f.Shape;
geom_sal = FunGDB.une_geoms(geom_sal, geom);
FunGDB.libera(f);
- }
- geom_sal = FunGDB.reproyecta(geom_sal, OliviaGlob.coorsys);//reproyecta por si hace falta
+ }
}
FunGDB.libera(fc);
//Actualiza el texto de salida
diff --git a/OliviaAddIn/Config.Designer.cs b/OliviaAddIn/Config.Designer.cs
index c16a676..70931ac 100644
Binary files a/OliviaAddIn/Config.Designer.cs and b/OliviaAddIn/Config.Designer.cs differ
diff --git a/OliviaAddIn/Config.esriaddinx b/OliviaAddIn/Config.esriaddinx
index 72c18ea..153fcc9 100644
--- a/OliviaAddIn/Config.esriaddinx
+++ b/OliviaAddIn/Config.esriaddinx
@@ -2,11 +2,11 @@
OLIVIA AddIn
{0718b3b3-5422-4d80-97ad-f72b18a3e476}
Add-In de ArcMap para la herramienta de optimización de la limpieza viaria, OLIVIA.
- 1.1.0.8
+ 1.1.0.9
Images\OliviaAddIn.png
Intergeo Tecnología
Intergeo Tecnología
- 11/12/2018
+ 04/03/2019
diff --git a/OliviaAddIn/DatosGDB.cs b/OliviaAddIn/DatosGDB.cs
index e55fdb9..69af9f5 100644
--- a/OliviaAddIn/DatosGDB.cs
+++ b/OliviaAddIn/DatosGDB.cs
@@ -238,7 +238,7 @@ namespace OliviaAddIn
capa = System.IO.Path.GetFileNameWithoutExtension(copia);
fc1 = FunGDB.abre_ftclass(OliviaGlob.Paths.DirData, capa);
- queryGeometry = une_geometria(fc1, filtro);
+ queryGeometry = FunGDB.une_geometria(fc1, filtro, out err_st);
if (queryGeometry == null)
mal = true;
@@ -277,68 +277,7 @@ namespace OliviaAddIn
queryGeometry.Project(def_geom.SpatialReference);
return queryGeometry;
- }
-
- /*
- * A partir de una capa recorre todos los elementos que cumplen el filtro y los une en una única geometría
- */
- public IGeometry une_geometria(IFeatureClass fc1, IQueryFilter filtro)
- {
- IFeatureCursor fcc = null;
- IFeature f1 = null, f2 = null;
- IGeometry queryGeometry = null;
- ITopologicalOperator union = null;
-
- try
- {
- fcc = fc1.Search(filtro, false);
- }
- catch (Exception)
- {
- MessageBox.Show("La capa seleccionada no tiene campos o atributos adecuados.", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return null;
- }
-
- try
- {
- f2 = f1 = fcc.NextFeature();
- if (f1 == null)
- {
- err_st = string.Format("La capa seleccionada: {0} no contiene elementos que cumplan la consulta: {1}", fc1.AliasName, filtro.WhereClause);
- return null;
- }
- f2 = fcc.NextFeature();
-
- union = (ITopologicalOperator)f1.Shape;
- while (f1 != null && f2 != null)
- {
- f1.Shape = union.Union(f2.Shape);
- union = (ITopologicalOperator)f1.Shape;
- f2.Delete();
- FunGDB.libera(f2);
- f2 = fcc.NextFeature();
- }
-
- queryGeometry = f1.Shape;
- f1.Store();
-
- return queryGeometry;
-
- }
- catch (Exception)
- {
- err_st = "Error al unir polígonos de la capa" + fc1.AliasName;
- return null;
- }
- finally
- {
- //libera
- FunGDB.libera(f1);
- FunGDB.libera(f2);
- FunGDB.libera(fcc);
- }
-
- }
+ }
/**
* Recorre los ámbitos lineales del shp viendo qué longitud tienen dentro de la geometría, y si
diff --git a/OliviaAddIn/DatosGDBLimp.cs b/OliviaAddIn/DatosGDBLimp.cs
index dfdd3ae..88f565a 100644
--- a/OliviaAddIn/DatosGDBLimp.cs
+++ b/OliviaAddIn/DatosGDBLimp.cs
@@ -114,6 +114,16 @@ namespace OliviaAddIn
else
tabla = FunGDB.dame_tabla_clase(OliviaGlob.Paths.PathGdbGen, LimpiezaDef.Capas.ftclass_limp_mec);
+ if (tabla == null)
+ {
+ if (path_class != null)
+ limp.err_st = "No se encuentra la capa " + path_class;
+ else
+ limp.err_st = "No se encuentra la capa " + LimpiezaDef.Capas.ftclass_limp_mec;
+
+ return false;
+ }
+
//se comprueba que existen todos los campos que se han configurado en la capa seleccionada para la recogida
camps = new string[NCAMPS];
camps[0] = LimpiezaDef.Campos.consulta_entidad;
@@ -382,7 +392,8 @@ namespace OliviaAddIn
if (limp.coords_instala[0] != 0 && limp.coords_instala[1] != 0)
{
//hay instalación
- geom_ambits=FunGDB.amplia_geom(geom_ambits, limp.coords_instala[0], limp.coords_instala[1]);
+ if (!FunGDB.is_pto_in_geom(limp.coords_instala[0], limp.coords_instala[1], geom_ambits))
+ geom_ambits = FunGDB.amplia_geom(geom_ambits, limp.coords_instala[0], limp.coords_instala[1]);
//comprueba, si hay restricciones de circulación, que la instalación no está en ellas
if (limp.geom_rest_acces != null)
diff --git a/OliviaAddIn/DatosGDBReco.cs b/OliviaAddIn/DatosGDBReco.cs
index bd20b31..7bfaee1 100644
--- a/OliviaAddIn/DatosGDBReco.cs
+++ b/OliviaAddIn/DatosGDBReco.cs
@@ -450,7 +450,15 @@ namespace OliviaAddIn
if (rec.coords_instala[0] != 0 && rec.coords_instala[1] != 0)
{
//hay instalación
- geom_ambits = FunGDB.amplia_geom(geom_ambits, rec.coords_instala[0], rec.coords_instala[1]);
+ if (!FunGDB.is_pto_in_geom(rec.coords_instala[0], rec.coords_instala[1], geom_ambits))
+ {
+ geom_ambits = FunGDB.amplia_geom_convexhull(geom_ambits, rec.coords_instala[0], rec.coords_instala[1]);
+ if (geom_ambits == null)
+ {
+ err_st = "Error al obtener envolvente convexa con instalación";
+ return false;
+ }
+ }
//comprueba, si hay restricciones de circulación, que la instalación no está en ellas
if (rec.geom_rest_acces != null)
@@ -465,7 +473,15 @@ namespace OliviaAddIn
if (rec.coords_descarg[0] != 0 && rec.coords_descarg[1] != 0)
{
//hay instalación de descarga
- geom_ambits = FunGDB.amplia_geom(geom_ambits, rec.coords_descarg[0], rec.coords_descarg[1]);
+ if (!FunGDB.is_pto_in_geom(rec.coords_descarg[0], rec.coords_descarg[1], geom_ambits))
+ {
+ geom_ambits = FunGDB.amplia_geom_convexhull(geom_ambits, rec.coords_descarg[0], rec.coords_descarg[1]);
+ if (geom_ambits == null)
+ {
+ err_st = "Error al obtener envolvente convexa con instalación";
+ return false;
+ }
+ }
//comprueba, si hay restricciones de circulación, que la instalación no está en ellas
if (rec.geom_rest_acces != null)
diff --git a/OliviaAddIn/FunGDB.cs b/OliviaAddIn/FunGDB.cs
index 3d670ae..1d26f2c 100644
--- a/OliviaAddIn/FunGDB.cs
+++ b/OliviaAddIn/FunGDB.cs
@@ -881,7 +881,8 @@ namespace OliviaAddIn
}
/**
- * Forma el polígono que contiene los ámbitos para exportar, a partir de ahí la red navegable ampliando a un buffer
+ * Forma el envelope que contiene los ámbitos para exportar, a partir de ahí la red navegable ampliando a un buffer
+ * Envelope es un rectángulo, no es el polígono mínimo que los contiene
*/
public static IGeometry dame_geom_envelope(string path_clase)
{
@@ -918,8 +919,111 @@ namespace OliviaAddIn
}
}
+ /*
+ * A partir de una capa recorre todos los elementos que cumplen el filtro y los une en una única geometría
+ */
+ public static IGeometry une_geometria(IFeatureClass fc1, IQueryFilter filtro, out string err_st)
+ {
+ IFeatureCursor fcc = null;
+ IFeature f1 = null, f2 = null;
+ IGeometry queryGeometry = null;
+ ITopologicalOperator union = null;
+
+ err_st = "";
+ try
+ {
+ fcc = fc1.Search(filtro, false);
+ }
+ catch (Exception)
+ {
+ err_st = string.Format("La capa {0} no contiene elementos que cumplan la consulta: {1}", fc1.AliasName, filtro.WhereClause);
+ return null;
+ }
+
+ try
+ {
+ f2 = f1 = fcc.NextFeature();
+ if (f1 == null)
+ {
+ err_st = string.Format("La capa {0} no contiene elementos que cumplan la consulta: {1}", fc1.AliasName, filtro.WhereClause);
+ return null;
+ }
+ f2 = fcc.NextFeature();
+
+ union = (ITopologicalOperator)f1.Shape;
+ while (f1 != null && f2 != null)
+ {
+ f1.Shape = union.Union(f2.Shape);
+ union = (ITopologicalOperator)f1.Shape;
+ f2.Delete();
+ FunGDB.libera(f2);
+ f2 = fcc.NextFeature();
+ }
+
+ queryGeometry = f1.Shape;
+ f1.Store();
+
+ return queryGeometry;
+
+ }
+ catch (Exception)
+ {
+ err_st = string.Format("Error al unir geometría de la capa {0} con el filtro {1}", fc1.AliasName, filtro.WhereClause);
+ return null;
+ }
+ finally
+ {
+ //libera
+ FunGDB.libera(f1);
+ FunGDB.libera(f2);
+ FunGDB.libera(fcc);
+ }
+ }
+
/**
- * Amplia la geom para que contenga el punto p
+ * Forma la envolvente compleja, el mínimo polígono,
+ * que contiene los ámbitos para exportar, a partir de ahí la red navegable ampliando a un buffer
+ */
+ public static IGeometry dame_geom_convexhull(string path_clase)
+ {
+
+ IFeatureClass fc;
+ IGeometry geom, geom_convhull;
+ ITopologicalOperator convhull = null;
+ IQueryFilter filtro;
+ string err_st;
+
+ try
+ {
+ filtro = new QueryFilterClass();
+ filtro.WhereClause="";
+ fc = abre_ftclass(path_clase);
+ if (fc == null)
+ {
+ return null;
+ }
+ geom = une_geometria(fc, filtro, out err_st);
+ if (geom == null)
+ {
+ return null;
+ }
+ //castea la geometría a itopologicaloperator
+ convhull = (ITopologicalOperator)geom;
+ geom_convhull = convhull.ConvexHull();
+
+ //libera
+ FunGDB.libera(fc);
+
+ return geom_convhull;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Amplia la geom para que contenga el punto p ampliando el rectangulo del envelope
*/
public static IGeometry amplia_geom(IGeometry geom, double p_x, double p_y)
{
@@ -959,6 +1063,38 @@ namespace OliviaAddIn
return geom;
}
+ /**
+ * Amplia la geom para que contenga el punto p ampliando la envolvente convexa
+ */
+ public static IGeometry amplia_geom_convexhull(IGeometry geom, double p_x, double p_y)
+ {
+ IPoint p;
+ ITopologicalOperator union;
+ IGeometry geom_p,geom_tot, geom_convhull;
+
+ try
+ {
+ p = new Point();
+ p.PutCoords(p_x, p_y);
+ geom_p = (IGeometry)p;
+ geom_p.SpatialReference = geom.SpatialReference;
+ union = (ITopologicalOperator)geom_p;
+ //une el punto nuevo a la geometría geom
+ geom_tot = union.Union(geom);
+
+ //reapunta union al total
+ union = (ITopologicalOperator)geom_tot;
+ geom_convhull = union.ConvexHull();
+
+ return geom_convhull;
+ }
+ catch (System.Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ return null;
+ }
+ }
+
/*
* Añade a la capa de origen la columna que se pasa como argumento
*/
diff --git a/OliviaAddIn/LimpiezaDlg.cs b/OliviaAddIn/LimpiezaDlg.cs
index 1cf417d..c8fd827 100644
--- a/OliviaAddIn/LimpiezaDlg.cs
+++ b/OliviaAddIn/LimpiezaDlg.cs
@@ -152,7 +152,7 @@ namespace OliviaAddIn
/**
* Inicializa los elementos de la ventana: rellena los boxes etc
*/
- private void inicia()
+ private bool inicia()
{
try
{
@@ -197,12 +197,15 @@ namespace OliviaAddIn
if (!OliviaGlob.gdb_limp.comprueba_campos_limp(limp))
{
MessageBox.Show(limp.err_st, "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
}
}
catch (Exception)
{
MessageBox.Show("Error al iniciar la ventana de Limpieza", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
}
+ return true;
}
/**