Pruebas convexhull

Version_1_1_0_12-entrega-valoriza-24-3-2019
Elena 2019-03-09 19:55:48 +01:00
parent 9fa8fe4c1b
commit 64c28afe28
10 changed files with 178 additions and 74 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
obj
bin
/OliviaAddIn.suo

Binary file not shown.

View File

@ -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;
@ -236,7 +235,6 @@ namespace OliviaAddIn
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

Binary file not shown.

View File

@ -2,11 +2,11 @@
<Name>OLIVIA AddIn</Name>
<AddInID>{0718b3b3-5422-4d80-97ad-f72b18a3e476}</AddInID>
<Description>Add-In de ArcMap para la herramienta de optimización de la limpieza viaria, OLIVIA.</Description>
<Version>1.1.0.8</Version>
<Version>1.1.0.9</Version>
<Image>Images\OliviaAddIn.png</Image>
<Author>Intergeo Tecnología</Author>
<Company>Intergeo Tecnología</Company>
<Date>11/12/2018</Date>
<Date>04/03/2019</Date>
<Targets>
<Target name="Desktop" version="10.2" />
</Targets>

View File

@ -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;
@ -279,67 +279,6 @@ namespace OliviaAddIn
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
* es menos de un porcentaje, lo quitan

View File

@ -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)

View File

@ -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)

View File

@ -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
*/

View File

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