[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