Pruebas convexhull
parent
9fa8fe4c1b
commit
64c28afe28
|
|
@ -1,2 +1,3 @@
|
||||||
obj
|
obj
|
||||||
bin
|
bin
|
||||||
|
/OliviaAddIn.suo
|
||||||
|
|
|
||||||
BIN
OliviaAddIn.suo
BIN
OliviaAddIn.suo
Binary file not shown.
|
|
@ -144,7 +144,6 @@ namespace OliviaAddIn
|
||||||
{
|
{
|
||||||
f = fc.GetFeature(ids[elem]);
|
f = fc.GetFeature(ids[elem]);
|
||||||
geom = f.Shape;
|
geom = f.Shape;
|
||||||
geom = FunGDB.reproyecta(geom, OliviaGlob.coorsys);//reproyecta por si hace falta
|
|
||||||
instalacion = (IPoint)geom;
|
instalacion = (IPoint)geom;
|
||||||
x = instalacion.X;
|
x = instalacion.X;
|
||||||
y = instalacion.Y;
|
y = instalacion.Y;
|
||||||
|
|
@ -236,7 +235,6 @@ namespace OliviaAddIn
|
||||||
geom_sal = FunGDB.une_geoms(geom_sal, geom);
|
geom_sal = FunGDB.une_geoms(geom_sal, geom);
|
||||||
FunGDB.libera(f);
|
FunGDB.libera(f);
|
||||||
}
|
}
|
||||||
geom_sal = FunGDB.reproyecta(geom_sal, OliviaGlob.coorsys);//reproyecta por si hace falta
|
|
||||||
}
|
}
|
||||||
FunGDB.libera(fc);
|
FunGDB.libera(fc);
|
||||||
//Actualiza el texto de salida
|
//Actualiza el texto de salida
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -2,11 +2,11 @@
|
||||||
<Name>OLIVIA AddIn</Name>
|
<Name>OLIVIA AddIn</Name>
|
||||||
<AddInID>{0718b3b3-5422-4d80-97ad-f72b18a3e476}</AddInID>
|
<AddInID>{0718b3b3-5422-4d80-97ad-f72b18a3e476}</AddInID>
|
||||||
<Description>Add-In de ArcMap para la herramienta de optimización de la limpieza viaria, OLIVIA.</Description>
|
<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>
|
<Image>Images\OliviaAddIn.png</Image>
|
||||||
<Author>Intergeo Tecnología</Author>
|
<Author>Intergeo Tecnología</Author>
|
||||||
<Company>Intergeo Tecnología</Company>
|
<Company>Intergeo Tecnología</Company>
|
||||||
<Date>11/12/2018</Date>
|
<Date>04/03/2019</Date>
|
||||||
<Targets>
|
<Targets>
|
||||||
<Target name="Desktop" version="10.2" />
|
<Target name="Desktop" version="10.2" />
|
||||||
</Targets>
|
</Targets>
|
||||||
|
|
|
||||||
|
|
@ -238,7 +238,7 @@ namespace OliviaAddIn
|
||||||
|
|
||||||
capa = System.IO.Path.GetFileNameWithoutExtension(copia);
|
capa = System.IO.Path.GetFileNameWithoutExtension(copia);
|
||||||
fc1 = FunGDB.abre_ftclass(OliviaGlob.Paths.DirData, capa);
|
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)
|
if (queryGeometry == null)
|
||||||
mal = true;
|
mal = true;
|
||||||
|
|
||||||
|
|
@ -279,67 +279,6 @@ namespace OliviaAddIn
|
||||||
return queryGeometry;
|
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
|
* Recorre los ámbitos lineales del shp viendo qué longitud tienen dentro de la geometría, y si
|
||||||
* es menos de un porcentaje, lo quitan
|
* es menos de un porcentaje, lo quitan
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,16 @@ namespace OliviaAddIn
|
||||||
else
|
else
|
||||||
tabla = FunGDB.dame_tabla_clase(OliviaGlob.Paths.PathGdbGen, LimpiezaDef.Capas.ftclass_limp_mec);
|
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
|
//se comprueba que existen todos los campos que se han configurado en la capa seleccionada para la recogida
|
||||||
camps = new string[NCAMPS];
|
camps = new string[NCAMPS];
|
||||||
camps[0] = LimpiezaDef.Campos.consulta_entidad;
|
camps[0] = LimpiezaDef.Campos.consulta_entidad;
|
||||||
|
|
@ -382,6 +392,7 @@ namespace OliviaAddIn
|
||||||
if (limp.coords_instala[0] != 0 && limp.coords_instala[1] != 0)
|
if (limp.coords_instala[0] != 0 && limp.coords_instala[1] != 0)
|
||||||
{
|
{
|
||||||
//hay instalación
|
//hay instalación
|
||||||
|
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]);
|
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
|
//comprueba, si hay restricciones de circulación, que la instalación no está en ellas
|
||||||
|
|
|
||||||
|
|
@ -450,7 +450,15 @@ namespace OliviaAddIn
|
||||||
if (rec.coords_instala[0] != 0 && rec.coords_instala[1] != 0)
|
if (rec.coords_instala[0] != 0 && rec.coords_instala[1] != 0)
|
||||||
{
|
{
|
||||||
//hay instalación
|
//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
|
//comprueba, si hay restricciones de circulación, que la instalación no está en ellas
|
||||||
if (rec.geom_rest_acces != null)
|
if (rec.geom_rest_acces != null)
|
||||||
|
|
@ -465,7 +473,15 @@ namespace OliviaAddIn
|
||||||
if (rec.coords_descarg[0] != 0 && rec.coords_descarg[1] != 0)
|
if (rec.coords_descarg[0] != 0 && rec.coords_descarg[1] != 0)
|
||||||
{
|
{
|
||||||
//hay instalación de descarga
|
//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
|
//comprueba, si hay restricciones de circulación, que la instalación no está en ellas
|
||||||
if (rec.geom_rest_acces != null)
|
if (rec.geom_rest_acces != null)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
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)
|
public static IGeometry amplia_geom(IGeometry geom, double p_x, double p_y)
|
||||||
{
|
{
|
||||||
|
|
@ -959,6 +1063,38 @@ namespace OliviaAddIn
|
||||||
return geom;
|
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
|
* Añade a la capa de origen la columna que se pasa como argumento
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ namespace OliviaAddIn
|
||||||
/**
|
/**
|
||||||
* Inicializa los elementos de la ventana: rellena los boxes etc
|
* Inicializa los elementos de la ventana: rellena los boxes etc
|
||||||
*/
|
*/
|
||||||
private void inicia()
|
private bool inicia()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -197,12 +197,15 @@ namespace OliviaAddIn
|
||||||
if (!OliviaGlob.gdb_limp.comprueba_campos_limp(limp))
|
if (!OliviaGlob.gdb_limp.comprueba_campos_limp(limp))
|
||||||
{
|
{
|
||||||
MessageBox.Show(limp.err_st, "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show(limp.err_st, "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
MessageBox.Show("Error al iniciar la ventana de Limpieza", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show("Error al iniciar la ventana de Limpieza", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue