Revision 3015 trunk/extensions/extGeoProcessing/src/com/iver/gvsig/geoprocessing/gui/GeoProcessingPanel.java

View differences:

GeoProcessingPanel.java
1137 1137
        }
1138 1138
    }
1139 1139
    // Spatial join con Intersect
1140
    // Funciona bien salvo para el caso de l?neas y puntos, donde habr?a que aumentar
1141
    // la precisi?n del PrecisionModel a costa probablemente de perder velocidad ...
1140 1142
    private void intersectMethod() {
1141 1143
        String layerToIntersectName = (String)((JComboBox)geoProcessingIntersectPanel.getComponent(0)).getSelectedItem();
1142 1144
        FLayer layerToIntersect = layers.getLayer(layerToIntersectName);
1143 1145
        String intersectingLayerName = (String)((JComboBox)geoProcessingIntersectPanel.getComponent(3)).getSelectedItem();
1144 1146
        FLayer intersectingLayer = layers.getLayer(intersectingLayerName);
1145 1147
        boolean selected = false;
1146
        Geometry[] geometriesToIntersect = getJtsGeometries(layerToIntersect, selected);
1147
        Geometry[] intersectingGeometries = getJtsGeometries(intersectingLayer, selected);
1148 1148
        try {
1149
            //if (((JCheckBox)geoProcessingIntersectPanel.getComponent(1)).isSelected()) selected = true;
1149
            if (((JCheckBox)geoProcessingIntersectPanel.getComponent(1)).isSelected()) selected = true;
1150 1150
            AlphanumericData lyrToIntersect = (AlphanumericData)layerToIntersect;
1151
            if (((JCheckBox)geoProcessingIntersectPanel.getComponent(5)).isSelected()) selected = true;
1152
            AlphanumericData intersectingLyr = (AlphanumericData)intersectingLayer;
1153
            Geometry[] geometriesToIntersect = getJtsGeometries(layerToIntersect, selected);
1154
            Geometry[] intersectingGeometries = getJtsGeometries(intersectingLayer, selected);
1151 1155
            SelectableDataSource lyrToIntersectSDS = lyrToIntersect.getRecordset();
1152
            //if (((JCheckBox)geoProcessingIntersectPanel.getComponent(5)).isSelected()) selected = true;
1153
            AlphanumericData intersectingLyr = (AlphanumericData)intersectingLayer;
1154
            DataSource lyrToIntersectDS;
1155
            DataSource intersectingLyrDS;
1156
            lyrToIntersectDS = lyrToIntersect.getRecordset();
1157
            intersectingLyrDS = intersectingLyr.getRecordset();
1156
            SelectableDataSource intersectingLyrSDS = intersectingLyr.getRecordset();
1157
            //DataSource lyrToIntersectDS;
1158
            //DataSource intersectingLyrDS;
1159
            //lyrToIntersectDS = lyrToIntersect.getRecordset();
1160
            //intersectingLyrDS = intersectingLyr.getRecordset();
1161
            // Tener en cuenta que podemos estar trabajando solo con una selecci?n
1162
            FBitSet fBitSet1 = lyrToIntersectSDS.getSelection();
1163
            FBitSet fBitSet2 = intersectingLyrSDS.getSelection();
1164
            // Clono porque preguntarle al FBitSet si est? lleno es una putada ...
1165
            FBitSet otherFBitSet1 = (FBitSet)fBitSet1.clone();
1166
            if (otherFBitSet1.cardinality()==0) otherFBitSet1.set(0, (int)lyrToIntersectSDS.getRowCount());
1167
            Value[][] selectedValues1 = new Value[otherFBitSet1.cardinality()][lyrToIntersectSDS.getFieldCount()];
1168
            int n=0;
1169
            for (int i=0;i<lyrToIntersectSDS.getRowCount();i++) {
1170
                if (otherFBitSet1.get(i)) {
1171
                    selectedValues1[n] = lyrToIntersectSDS.getRow(i);
1172
                    n++;
1173
                }
1174
            }
1175
            // Clono porque preguntarle al FBitSet si est? lleno es una putada ...
1176
            FBitSet otherFBitSet2 = (FBitSet)fBitSet2.clone();
1177
            if (otherFBitSet2.cardinality()==0) otherFBitSet2.set(0, (int)intersectingLyrSDS.getRowCount());
1178
            Value[][] selectedValues2 = new Value[otherFBitSet2.cardinality()][intersectingLyrSDS.getFieldCount()];
1179
            int m=0;
1180
            for (int i=0;i<intersectingLyrSDS.getRowCount();i++) {
1181
                if (otherFBitSet2.get(i)) {
1182
                    selectedValues2[m] = intersectingLyrSDS.getRow(i);
1183
                    m++;
1184
                }
1185
            }
1158 1186
            // Los campos se a?aden siempre. Los valores solo cuando toca ...
1159
            String[] lyrToIntersectFieldNames = new String[lyrToIntersectDS.getFieldCount()];
1160
            int[] lyrToIntersectFieldTypes = new int[lyrToIntersectDS.getFieldCount()];
1161
            for (int i = 0; i < lyrToIntersectDS.getFieldCount(); i++) {
1162
                lyrToIntersectFieldNames[i] = lyrToIntersectDS.getFieldName(i);
1163
                lyrToIntersectFieldTypes[i] = lyrToIntersectDS.getFieldType(i);
1187
            String[] lyrToIntersectFieldNames = new String[lyrToIntersectSDS.getFieldCount()];
1188
            int[] lyrToIntersectFieldTypes = new int[lyrToIntersectSDS.getFieldCount()];
1189
            for (int i = 0; i < lyrToIntersectSDS.getFieldCount(); i++) {
1190
                lyrToIntersectFieldNames[i] = lyrToIntersectSDS.getFieldName(i);
1191
                lyrToIntersectFieldTypes[i] = lyrToIntersectSDS.getFieldType(i);
1164 1192
            }
1165
            String[] intersectingLyrFieldNames = new String[intersectingLyrDS.getFieldCount()];
1166
            int[] intersectingLyrFieldTypes = new int[intersectingLyrDS.getFieldCount()];
1167
            for (int i = 0; i < intersectingLyrDS.getFieldCount(); i++) {
1168
                intersectingLyrFieldNames[i] = intersectingLyrDS.getFieldName(i);
1169
                intersectingLyrFieldTypes[i] = intersectingLyrDS.getFieldType(i);
1193
            String[] intersectingLyrFieldNames = new String[intersectingLyrSDS.getFieldCount()];
1194
            int[] intersectingLyrFieldTypes = new int[intersectingLyrSDS.getFieldCount()];
1195
            for (int i = 0; i < intersectingLyrSDS.getFieldCount(); i++) {
1196
                intersectingLyrFieldNames[i] = intersectingLyrSDS.getFieldName(i);
1197
                intersectingLyrFieldTypes[i] = intersectingLyrSDS.getFieldType(i);
1170 1198
            }
1171
            String[] intersectedLyrFieldNames = new String[lyrToIntersectDS.getFieldCount()+intersectingLyrDS.getFieldCount()-2]; // Le quito los dos PKs
1172
            int[] intersectedLyrFieldTypes = new int[lyrToIntersectDS.getFieldCount()+intersectingLyrDS.getFieldCount()-2];
1199
            String[] intersectedLyrFieldNames = new String[lyrToIntersectSDS.getFieldCount()+intersectingLyrSDS.getFieldCount()-2]; // Le quito los dos PKs
1200
            int[] intersectedLyrFieldTypes = new int[lyrToIntersectSDS.getFieldCount()+intersectingLyrSDS.getFieldCount()-2];
1173 1201
            int l=0;
1174 1202
            for (int i=0;i<lyrToIntersectFieldNames.length-1;i++) {
1175 1203
                intersectedLyrFieldNames[i] = lyrToIntersectFieldNames[i];
......
1187 1215
            ds.start();
1188 1216
            DataWare dw = ds.getDataWare(DataSourceFactory.MANUAL_OPENING);
1189 1217
            dw.beginTrans();
1190
            ds.stop();
1191
            // Si cierro no tendr? problemas a continuaci?n?
1192
            lyrToIntersectSDS.stop();
1193 1218
            
1194 1219
            Vector values = new Vector();
1195 1220
            Vector geometriesIntersected = new Vector();
......
1201 1226
                    Geometry intersectingGeometry = intersectingGeometries[j];
1202 1227
                    if (intersectingGeometry.intersects(geometryToIntersect)) {
1203 1228
                        geometriesIntersected.add(geometryToIntersect.intersection(intersectingGeometry));
1204
                        /*for (int m=0;m<intersectedLyrFieldNames.length;m++) {
1205
                            rows[m] = ds.getFieldValue(i, m);
1206
                        }*/
1207 1229
                        Value[] rows = new Value[intersectedLyrFieldNames.length+1]; // +1 porque faltaba el PK
1208 1230
                        for (int k=0;k<lyrToIntersectFieldNames.length-1;k++) {
1209
                            rows[k] = lyrToIntersectDS.getFieldValue(i, k);
1231
                            //rows[k] = lyrToIntersectDS.getFieldValue(i, k);
1232
                            rows[k] = selectedValues1[i][k];
1210 1233
                        }
1211 1234
                        for (int k=0;k<intersectingLyrFieldNames.length-1;k++) {
1212
                            rows[k+l] = intersectingLyrDS.getFieldValue(j, k);
1235
                            //rows[k+l] = intersectingLyrDS.getFieldValue(j, k);
1236
                            rows[k+l] = selectedValues2[j][k];
1213 1237
                        }
1214 1238
                        rows[intersectedLyrFieldNames.length] = ValueFactory.createValue(i);
1215 1239
                        values.add(rows);
......
1217 1241
                }
1218 1242
            }
1219 1243
            
1244
            ds.stop();
1245
            lyrToIntersectSDS.stop();
1246
            intersectingLyrSDS.stop();
1247
            
1220 1248
            for (int i=0;i<geometriesIntersected.size();i++) {
1221 1249
                dw.insertFilledRow(((Value[])values.get(i)));
1222 1250
            }

Also available in: Unified diff