Revision 3015 trunk/extensions/extGeoProcessing/src/com/iver/gvsig/geoprocessing/gui/GeoProcessingPanel.java
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