Pruebas convexhull
parent
9fa8fe4c1b
commit
64c28afe28
|
|
@ -1,2 +1,3 @@
|
|||
obj
|
||||
bin
|
||||
/OliviaAddIn.suo
|
||||
|
|
|
|||
BIN
OliviaAddIn.suo
BIN
OliviaAddIn.suo
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue