[Gvsig_desarrolladores] Distancia entre dos IFeature

Joaquin del Cerro jjdelcerro.gvsig en gmail.com
Mar Abr 23 11:23:24 CEST 2013


El 22/04/13 16:47, Alberto Calzada escribió:
> 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!

Hola Alberto,
IFeature e IGeometry sin interfaces de gvSIG 1.X, mientras que el codigo que
te ha pasado Leticia, el Feature, FeatureStore o Geometry, son para gvSIG 2.X.

No se sobre que estaras prearando tu plugin.
Si es para gvSIG 2, te puede venir bien el codigo de Leticia, si no me temo
que no te va a valer. Comenta por la lista si es para la 1 a ver si algun
compañero que sepa mas como hacerlo te puede echar una mano.

Un saludo
Joaquin


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


-- 
--------------------------------------
Joaquin Jose del Cerro
Development and software arquitecture manager.
jjdelcerro en gvsig.com
gvSIG Association
www.gvsig.com
www.gvsig.org


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