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; } /**