[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