[Gvsig_desarrolladores] Distancia entre dos IFeature

Alberto Calzada albertocalsa en gmail.com
Lun Abr 22 16:47:28 CEST 2013


Hola Leticia!

Muchisimas gracias por el código! Ahora me he dado cuenta de que necesitaba
era utilizar "Feature" en vez de "IFeature", y así poder obtener los
objetos de la clase "com.vividsolutions.jts.geom.Geometry". Parece ser que
no hay forma de hacer estos cálculos directamente con los IFeature y
IGeometry y hay que utilizar los otros. Pero bueno, para lo que lo necesite
me viene perfecto!

Muchas gracias!

Un saludo,

Alberto


2013/4/22 Leticia Riestra Ainsua <lriestra en lbd.org.es>

> 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*
>
> _______________________________________________
> 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
>
>


-- 
*--
*

*Mr Alberto Calzada
Full-time PhD Candidate*

*Room 16J25 *

*School of Computing and Mathematics
Faculty of Computing and Engineering*

*University of Ulster at Jordanstown Campus
Northern Ireland, UK
Email: Calzada-A en email.ulster.ac.uk*

*Tel:  +44 28 90361114 *
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20130422/96d5b904/attachment.htm 


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