[Gvsig_desarrolladores] Distancia entre dos IFeature

Leticia Riestra Ainsua lriestra en lbd.org.es
Lun Abr 22 08:38:58 CEST 2013


Hola

Yo tengo un código que precisamente obtiene aquellas features que están a
una distancia X de otra feature. Dicho parámetro es indicado por el usuario
en la interfaz.
El código es el siguiente:

La función para obtener las capas activas son

public FLayer[] obtenerCapasActivas(){
FLayer[] retorno = null;

IWindow f = PluginServices.getMDIManager().getActiveWindow();

if (f == null) {
return retorno;
}

if (f.getClass() == DefaultViewPanel.class) {
DefaultViewPanel bv = (DefaultViewPanel) f;
ViewDocument mo = bv.getViewDocument();
MapContext contexto = mo.getMapContext();

retorno =contexto.getLayers().getActives();

}
return retorno;
}



try {

        FLayer[] capasActivas = obtenerCapasActivas();
         // Nos quedamos con la primera capa activa porque solo vamos a
calcular las distancias entre las features de una única capa de cada vez. Y
en mi caso solo necesito de la primera activa
  FLayer layer = capasActivas[0];
        FeatureStore featureStore = ((FLyrVect) layer).getFeatureStore();
FeatureSet featureSet = featureStore.getFeatureSet();

        // Recorremos el feature y para cada uno de esos,
// compruebo si todos las
  // demas tienen geometrias a distancia XX
Iterator<?> it = featureSet.fastIterator();
while (it.hasNext()) {
Feature feature = (Feature) it.next();
FeatureType featureType = feature.getType();

Geometry geomFeature1 = feature.getDefaultGeometry();

FeatureAttributeDescriptor[] attributeDescriptors = featureType
.getAttributeDescriptors();

String valorClavePrimariaFeature1 = "";
for (int i = 0; i < attributeDescriptors.length; i++) {
FeatureAttributeDescriptor attrDesc = attributeDescriptors[i];
if (attrDesc.isPrimaryKey()) {
valorClavePrimariaFeature1 += feature.get(attrDesc.getName()) + " | ";
}
}
if (valorClavePrimariaFeature1 != "")
valorClavePrimariaFeature1 = valorClavePrimariaFeature1
.substring(0,
valorClavePrimariaFeature1
.length() - 3);

// Una vez tenemos la claveprimaria, recorremos las
// otras features para
// poder obtener aquellas que estan a una distancia
// menor de la indicada
FeatureSet featureSet2 = featureStore.getFeatureSet();
Iterator<?> it2 = featureSet2.fastIterator();
while (it2.hasNext()) {
Feature feature2 = (Feature) it2.next();
FeatureType featureType2 = feature2.getType();

Geometry geomFeature2 = feature2
.getDefaultGeometry();

FeatureAttributeDescriptor[] attributeDescriptors2 = featureType2
.getAttributeDescriptors();

String valorClavePrimariaFeature2 = "";
for (int i = 0; i < attributeDescriptors2.length; i++) {
FeatureAttributeDescriptor attrDesc2 = attributeDescriptors2[i];
if (attrDesc2.isPrimaryKey()) {
valorClavePrimariaFeature2 += feature2
.get(attrDesc2.getName())
+ " | ";
}
}
if (valorClavePrimariaFeature2 != "")
valorClavePrimariaFeature2 = valorClavePrimariaFeature2.substring(0,
valorClavePrimariaFeature2.length() - 3);

if (!(valorClavePrimariaFeature1.equals(valorClavePrimariaFeature2))
&& (geomFeature1.distance(geomFeature2) < distanciaValor)) {
                                                         //Llegados a este
punto ya sabes las claves primarias
                                                        //de los elementos
que estan separados a cierta distancia así
                                                        //como dicha
distancia.
                                                       //Yo en esta parte
hacía una cosa con los valores. En tu caso,
                                                       //como no se lo que
quieres hacer te diré que las variables que tienes
                                                       //son
                                                       //
valorClavePrimariaFeature1, valorClavePrimariaFeature2
                                                       //geomFeature1,
geomFeature2
                                                       //distancia real
entre ambas: geomFeature1.distance(geomFeature2))

}
}
                        }

} catch (ReadDriverException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


Espero que el código te haya servido.

Saludos



El 19 de abril de 2013 20:34, Alberto Calzada <albertocalsa en gmail.com>escribió:

> Hola a todos,
>
> Estoy programando una extensión para gvSIG en la que necesito obtener la
> distancia entre las distintas IFeatures (o IGeometry) de mi capa.
>
> Por lo pronto, tengo algo así, ya que necesito obtener las IFeatures que
> han sido seleccionadas por el usuario:
>
> private void getSelectedFeatures() {
> try {
> FBitSet fbs = resultLayer.getRecordset().getSelection();
>
> featuresSelected = new LinkedList<IFeature>();
> for(int i=0;i<fbs.size();i++){
>  if(fbs.get(i)){
> featuresSelected.add(resultLayer.getSource().getFeature(i));
> IGeometry geom = resultLayer.getSource().getFeature(i).getGeometry();
>  IGeometry geom2 = resultLayer.getSource().getFeature(j).getGeometry();
>  }
>  }
> } catch (ReadDriverException e) {
> // TODO Auto-generated catch block
>  e.printStackTrace();
> }
>  }
>
> Alguien sabe como podría obtener la distancia entre dos de estas IFeature?
> O si no se puede, como podría obtener esa distancia?
>
> Muchas gracias de antemano,
>
> Un saludo,
>
> Alberto
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>


-- 
Leticia Riestra Ainsua
*Laboratorio de Bases de Datos A Coruña*
*Tlfono: 981 16 70 00 Ext: 1386*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20130422/f585bb2a/attachment.htm 


Más información sobre la lista de distribución gvSIG_desarrolladores