Revision 1159

View differences:

org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3
  <modelVersion>4.0.0</modelVersion>
4
  <artifactId>org.gvsig.geoprocess.algorithm.buffer</artifactId>
5
  <packaging>jar</packaging>
6
  <name>org.gvsig.geoprocess.algorithm.buffer</name>
7
	
8
	<parent>
9
		<groupId>org.gvsig</groupId>
10
		<artifactId>org.gvsig.geoprocess.algorithm</artifactId>
11
		<version>2.2.106</version>
12
	</parent>
13
	
14
	<dependencies>
15
		<dependency>
16
		    <groupId>org.gvsig</groupId>
17
   			<artifactId>org.gvsig.geoprocess.algorithm.base</artifactId>
18
            <scope>compile</scope>
19
   		</dependency>
20
   		<dependency>
21
		    <groupId>org.gvsig</groupId>
22
   			<artifactId>org.gvsig.geoprocess.algorithm.dissolve</artifactId>
23
            <scope>compile</scope>
24
   		</dependency>
25
   		<dependency>
26
		    <groupId>org.gvsig</groupId>
27
   			<artifactId>org.gvsig.geoprocess.algorithm.fusespatially</artifactId>
28
            <scope>compile</scope>
29
   		</dependency>
30
   		<dependency>
31
		    <groupId>org.gvsig</groupId>
32
   			<artifactId>org.gvsig.andami</artifactId>
33
            <scope>compile</scope>
34
   		</dependency>
35
        <dependency>
36
            <groupId>org.gvsig</groupId>
37
            <artifactId>org.gvsig.fmap.mapcontext.api</artifactId>
38
            <scope>compile</scope>
39
        </dependency>
40
        <dependency>
41
            <groupId>org.gvsig</groupId>
42
            <artifactId>org.gvsig.fmap.mapcontext.impl</artifactId>
43
            <scope>runtime</scope>
44
        </dependency>
45
		<dependency>
46
            <groupId>org.gvsig</groupId>
47
            <artifactId>org.gvsig.fmap.dal.api</artifactId>
48
            <scope>compile</scope>
49
        </dependency>
50
        <dependency>
51
            <groupId>org.gvsig</groupId>
52
            <artifactId>org.gvsig.fmap.dal.impl</artifactId>
53
            <scope>runtime</scope>
54
        </dependency>
55
        <dependency>
56
            <groupId>org.gvsig</groupId>
57
            <artifactId>org.gvsig.fmap.dal.file.lib</artifactId>
58
            <scope>compile</scope>
59
        </dependency>
60
        <dependency>
61
            <groupId>org.gvsig</groupId>
62
            <artifactId>org.gvsig.fmap.dal.spi</artifactId>
63
            <scope>compile</scope>
64
        </dependency>
65
	</dependencies>
66
	
67
</project>
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/resources/help/BufferAlgorithm.xml
1
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
2
<!--
3

  
4
    gvSIG. Desktop Geographic Information System.
5

  
6
    Copyright (C) 2007-2012 gvSIG Association.
7

  
8
    This program is free software; you can redistribute it and/or
9
    modify it under the terms of the GNU General Public License
10
    as published by the Free Software Foundation; either version 2
11
    of the License, or (at your option) any later version.
12

  
13
    This program is distributed in the hope that it will be useful,
14
    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
    GNU General Public License for more details.
17

  
18
    You should have received a copy of the GNU General Public License
19
    along with this program; if not, write to the Free Software
20
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21
    MA  02110-1301, USA.
22

  
23
    For any additional information, do not hesitate to contact us
24
    at info AT gvsig.com, or visit our website www.gvsig.com.
25

  
26
-->
27
<help>
28
	<element name="DESCRIPTION"
29
		text="Este geoproceso crea una nueva capa vectorial de pol&#237;gonos, generados como zonas de influencia alrededor de las geometr&#237;as de los elementos vectoriales de una capa de entrada.&#10;&#10;Las geometr&#237;as de la capa de entrada pueden ser tanto de puntos, como de l&#237;neas o pol&#237;gonos. Se pueden generar varios anillos conc&#233;ntricos equidistantes en torno a las geometr&#237;as de entrada. Adem&#225;s, en el caso de geometr&#237;as de entrada poligonales el &#225;rea de influencia puede ser exterior, interior o exterior e interior al pol&#237;gono original.&#10;&#10;Este Geoproceso puede ser de gran utilidad para la realizaci&#243;n de an&#225;lisis de corredor. Por ejemplo:&#10;&lt;UL&gt;&#10;&lt;LI&gt;Qu&#233; zonas urbanos no tienen una parada de autobuses en un radio de 500 m.&lt;/LI&gt;&#10;&lt;LI&gt;Qu&#233; zonas urbanas carecen de colegios en un radio de 1000 m.&lt;/LI&gt;&#10;&lt;LI&gt;Qu&#233; pozos incumplen la normativa al no respetar la distancia m&#237;nima entre dos consecutivos.&lt;/LI&gt;&#10;&lt;/UL&gt;&#10;Etc. &#10; Nota: Las distancias del buffer hay que definirlas en metros. En caso de que el sistema de referencia no sea proyectado esta distancia se calcula a la altura del ecuador. El usuario deber? considerar la desviaci?n o bien convertir la cartograf?a a un sistema de referencia en metros. "
30
		description="Descripci&#243;n" type="0">
31
		<image description="" file="bufferdesc.png">
32
		</image>
33
	</element>
34
	<element name="ADDITIONAL_INFO" text=""
35
		description="Informaci&#243;n adicional" type="0">
36
	</element>
37
	<element name="EXTENSION_AUTHOR" text="Nacho Brodin"
38
		description="Algoritmo creado por" type="0">
39
	</element>
40
	<element name="HELP_AUTHOR" text="" description="Ayuda creada por"
41
		type="0">
42
	</element>
43
	<element name="USER_NOTES" text="" description="Notas de usuario"
44
		type="0">
45
	</element>
46
	<element name="LAYER" text="" description="Capa de entrada"
47
		type="3">
48
	</element>
49
	<element name="SELECTED_GEOM" text="" description="Geometrias seleccionadas"
50
		type="3">
51
	</element>
52
	<element name="DISTANCE" text="" description="Distancia" type="3">
53
	</element>
54
	<element name="FIELD" text="" description="Campo" type="3">
55
	</element>
56
	<element name="ROUND_BORDER" text="" description="Borde redondeado"
57
		type="3">
58
	</element>
59
	<element name="AREA" text="" description="Areas de influencia"
60
		type="3">
61
	</element>
62
	<element name="RING_NUMBER" text="" description="N&#250;mero de anillos"
63
		type="3">
64
	</element>
65
	<element name="OUTPUT_DESCRIPTION" text="" description="Descripci&#243;n"
66
		type="2">
67
	</element>
68
	<element name="RESULT" text="" description="Buffer" type="2">
69
	</element>
70
</help>
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/resources/help/BufferAlgorithm_en.xml
1
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
2
<!--
3

  
4
    gvSIG. Desktop Geographic Information System.
5

  
6
    Copyright (C) 2007-2012 gvSIG Association.
7

  
8
    This program is free software; you can redistribute it and/or
9
    modify it under the terms of the GNU General Public License
10
    as published by the Free Software Foundation; either version 2
11
    of the License, or (at your option) any later version.
12

  
13
    This program is distributed in the hope that it will be useful,
14
    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
    GNU General Public License for more details.
17

  
18
    You should have received a copy of the GNU General Public License
19
    along with this program; if not, write to the Free Software
20
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21
    MA  02110-1301, USA.
22

  
23
    For any additional information, do not hesitate to contact us
24
    at info AT gvsig.com, or visit our website www.gvsig.com.
25

  
26
-->
27
<help>
28
	<element name="DESCRIPTION"
29
		text="This geoprocess creates a new polygon layer, with polygon buffers of the geometries of the input layer.&#10;&#10;Input layer geometries could have any geometry type (point, line or polygon). For each input geometry, you could create one or many equidistant polygon buffer rings. Also, if input geometry type is polygon, the buffer could be internal, external or both. &#10; Note: The buffer distance has to be defined in meters. If the reference system is not projected, this distance is calculated in the Ecuador. The user should be consider the deviation, or convert the cartography into a reference system in meters."
30
		description="Descripci&#243;n" type="0">
31
		<image description="" file="bufferdesc.png">
32
		</image>
33
	</element>
34
	<element name="ADDITIONAL_INFO" text=""
35
		description="Informaci&#243;n adicional" type="0">
36
	</element>
37
	<element name="EXTENSION_AUTHOR" text="Nacho Brodin"
38
		description="Algoritmo creado por" type="0">
39
	</element>
40
	<element name="HELP_AUTHOR" text="" description="Ayuda creada por"
41
		type="0">
42
	</element>
43
	<element name="USER_NOTES" text="" description="Notas de usuario"
44
		type="0">
45
	</element>
46
	<element name="LAYER" text="" description="Capa de entrada"
47
		type="3">
48
	</element>
49
	<element name="SELECTED_GEOM" text="" description="Geometrias seleccionadas"
50
		type="3">
51
	</element>
52
	<element name="DISTANCE" text="" description="Distancia" type="3">
53
	</element>
54
	<element name="FIELD" text="" description="Campo" type="3">
55
	</element>
56
	<element name="ROUND_BORDER" text="" description="Borde redondeado"
57
		type="3">
58
	</element>
59
	<element name="AREA" text="" description="Areas de influencia"
60
		type="3">
61
	</element>
62
	<element name="RING_NUMBER" text="" description="N&#250;mero de anillos"
63
		type="3">
64
	</element>
65
	<element name="OUTPUT_DESCRIPTION" text="" description="Descripci&#243;n"
66
		type="2">
67
	</element>
68
	<element name="RESULT" text="" description="Buffer" type="2">
69
	</element>
70
</help>
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.geoprocess.algorithm.buffer.BufferLibrary
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/resources/org/gvsig/geoprocess/algorithm/buffer/buffer.properties
1
#
2
# gvSIG. Desktop Geographic Information System.
3
#
4
# Copyright (C) 2007-2012 gvSIG Association.
5
#
6
# This program is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU General Public License
8
# as published by the Free Software Foundation; either version 2
9
# of the License, or (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
# MA  02110-1301, USA.
20
#
21
# For any additional information, do not hesitate to contact us
22
# at info AT gvsig.com, or visit our website www.gvsig.com.
23
#
24

  
25
basic_vect_algorithms=Capas vectoriales
26
Buffer=Buffer
27
poly_in=Dentro del pol?gono
28
poly_out=Fuera del pol?gono
29
poly_inandout=Dentro y fuera del pol?gono
30
Input_layer=Capa de entrada
31
Selected_geometries=Geometrias seleccionadas
32
Distance=Distancia
33
Field=Campo
34
Fields=Campos
35
Merge=Mezcla
36
Round_border=Borde redondeado
37
Builds_influence_area=Areas de influencia
38
Number_of_rings=N?mero de anillos
39
Wrong_type_for_this_shapetype=Tipo erroneo para este tipo de shape
40
area_field=?rea definida por un campo en metros
41
area_distance=?rea definida por una distancia en metros
42
file_exists=El fichero de salida existe
43
Dissolve_entities=Disolver entidades (solo un anillo)
44
options=Opciones
45
input=Entradas
46
outputs=Salidas
47
calc_buffer=Calculando Buffer
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/resources/org/gvsig/geoprocess/algorithm/buffer/buffer_en.properties
1
#
2
# gvSIG. Desktop Geographic Information System.
3
#
4
# Copyright (C) 2007-2012 gvSIG Association.
5
#
6
# This program is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU General Public License
8
# as published by the Free Software Foundation; either version 2
9
# of the License, or (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
# MA  02110-1301, USA.
20
#
21
# For any additional information, do not hesitate to contact us
22
# at info AT gvsig.com, or visit our website www.gvsig.com.
23
#
24

  
25
basic_vect_algorithms=Vector layers tools
26
Buffer=Buffer
27
poly_in=Inside the polygon
28
poly_out=Outside the polygon
29
poly_inandout=Inside and outside the polygon
30
Input_layer=Input cover
31
Selected_geometries=Selected features
32
Distance=Distance
33
Field=Field
34
Fields=Fields
35
Merge=Merge
36
Round_border=Round border
37
Builds_influence_area=Influence areas (only polygons)
38
Number_of_rings=Number of radial buffers
39
Wrong_type_for_this_shapetype=wrong type for this shape type
40
area_field=Area defined by a field in meters
41
area_distance=Area defined by a distance in meters
42
file_exists=The output file exists
43
Dissolve_entities=Dissolve entities
44
options=Options
45
input=Inputs
46
outputs=Outputs
47
calc_buffer=Calculating buffer
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/java/org/gvsig/geoprocess/algorithm/buffer/BufferParametersPanel.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.algorithm.buffer;
25

  
26
import java.awt.BorderLayout;
27
import java.awt.GridBagConstraints;
28
import java.awt.GridBagLayout;
29
import java.awt.Insets;
30
import java.awt.event.ActionEvent;
31
import java.awt.event.ActionListener;
32
import java.util.ArrayList;
33
import java.util.List;
34

  
35
import javax.swing.BorderFactory;
36
import javax.swing.ButtonGroup;
37
import javax.swing.ComboBoxModel;
38
import javax.swing.DefaultComboBoxModel;
39
import javax.swing.JCheckBox;
40
import javax.swing.JComboBox;
41
import javax.swing.JLabel;
42
import javax.swing.JPanel;
43
import javax.swing.JRadioButton;
44
import javax.swing.JScrollPane;
45
import javax.swing.JTextField;
46

  
47
import org.gvsig.geoprocess.lib.api.GeoProcessLocator;
48
import org.gvsig.geoprocess.sextante.gui.algorithm.AlgorithmOutputPanel;
49

  
50
import es.unex.sextante.core.GeoAlgorithm;
51
import es.unex.sextante.core.ObjectAndDescription;
52
import es.unex.sextante.core.OutputObjectsSet;
53
import es.unex.sextante.core.ParametersSet;
54
import es.unex.sextante.core.Sextante;
55
import es.unex.sextante.dataObjects.IVectorLayer;
56
import es.unex.sextante.gui.algorithm.GeoAlgorithmParametersPanel;
57
import es.unex.sextante.gui.algorithm.OutputChannelSelectionPanel;
58
import es.unex.sextante.gui.core.SextanteGUI;
59
import es.unex.sextante.outputs.Output;
60

  
61
/**
62
 * Panel for buffer algorithm
63
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
64
 */
65
public class BufferParametersPanel extends GeoAlgorithmParametersPanel implements ActionListener {
66
	private static final long                serialVersionUID   = 1L;
67
	private final int                        marginSides        = 15;
68
	private final int                        marginBottom       = 8;
69
	private GeoAlgorithm                     m_Algorithm        = null;
70
	private JComboBox                        layers             = null;
71
	private JComboBox                        fields             = null;
72
	private JComboBox                        influenceAreas     = null;
73
	private JComboBox                        radialBuffers      = null;
74
	private JCheckBox                        selectionOnly      = null;
75
	private JCheckBox                        dissolveEntities   = null;
76
	private JCheckBox                        roundBorder        = null;
77
	private JTextField                       distance           = null;
78
	private JRadioButton                     selectDistance     = null;
79
	private JRadioButton                     selectField        = null;
80
	
81
	private List<String>                     fieldList             = new ArrayList<String>();
82
	private AlgorithmOutputPanel             algorithmOutputPanel  = null;
83
	private OutputChannelSelectionPanel      outputChannelSelectionPanel;
84
	private JPanel                           outputPanel;
85
 	
86
	public BufferParametersPanel() {
87
		super();
88
	}
89

  
90
    public void init(GeoAlgorithm algorithm) {
91
    	m_Algorithm = algorithm;
92
    	initGUI();
93
    }
94

  
95
	private void initGUI() {
96
		this.setLayout(new BorderLayout());
97
		this.add(getMainJScrollPane(), BorderLayout.CENTER);
98
	}
99
	
100
	private JScrollPane getMainJScrollPane() {
101
		JPanel panel = new JPanel();
102
		GridBagLayout gbl = new GridBagLayout();
103
		panel.setLayout(gbl);
104
		
105
		GridBagConstraints gbc = new GridBagConstraints();
106
		gbc.fill = GridBagConstraints.HORIZONTAL;
107
		gbc.weightx = 1.0;
108
		gbc.gridx = 0;
109
		gbc.gridy = 0;
110
		gbc.insets = new Insets(0, marginSides, 0, marginSides);
111
		panel.add(getInputPanel(), gbc);
112
		
113
		gbc.gridy = 1;
114
		panel.add(getOptionsPanel(), gbc);
115
		
116
		gbc.gridy = 2;
117
		panel.add(getOutputsPanel(), gbc);
118
		JScrollPane scrollPane = new JScrollPane(panel);
119
		return scrollPane;
120
	}
121
	
122
	/**
123
	 * Gets the output panel (SEXTANTE)
124
	 * @return
125
	 */
126
	private JPanel getOutputChannelSelectionPanel() {
127
		if(outputPanel == null) {
128
			try {
129
				outputPanel = new JPanel();
130
				outputPanel.setLayout(new BorderLayout());
131
				final OutputObjectsSet ooSet = m_Algorithm.getOutputObjects();
132
				final Output out = ooSet.getOutput(BufferAlgorithm.RESULT);
133
				outputChannelSelectionPanel = new OutputChannelSelectionPanel(out, m_Algorithm.getParameters());
134
				outputPanel.add(new JLabel(" " + GeoProcessLocator.getGeoProcessManager().getTranslation("Buffer") +
135
						" [" + GeoProcessLocator.getGeoProcessManager().getTranslation("Vectorial") +
136
						"]               "), BorderLayout.WEST);
137
				outputPanel.add(outputChannelSelectionPanel, BorderLayout.CENTER);
138
			} catch (final Exception e) {
139
				Sextante.addErrorToLog(e);
140
			}
141
		}
142
		return outputPanel;
143
	}
144
	
145
	/**
146
	 * Gets the output panel
147
	 * @return
148
	 */
149
	@SuppressWarnings("unused")
150
	private AlgorithmOutputPanel getAlgorithmOutputPanel() {
151
		if(algorithmOutputPanel == null)
152
		    algorithmOutputPanel = new AlgorithmOutputPanel();
153
		return algorithmOutputPanel;
154
	}
155
	
156
	/**
157
	 * Gets a new input panel
158
	 * @param text
159
	 * @param combo
160
	 * @return
161
	 */
162
	public JPanel getOutputsPanel() {
163
		JPanel panel = new JPanel();
164
		GridBagLayout gbl = new GridBagLayout();
165
		panel.setLayout(gbl);
166
		panel.setBorder(BorderFactory.createTitledBorder(GeoProcessLocator.getGeoProcessManager().getTranslation("outputs")));
167
		
168
		GridBagConstraints gbc = new GridBagConstraints();
169
		gbc.fill = GridBagConstraints.HORIZONTAL;
170
		gbc.weightx = 1.0;
171
		gbc.insets = new Insets(0, marginSides, marginBottom, marginSides);
172
		panel.add(getOutputChannelSelectionPanel(), gbc);
173
		
174
		return panel;
175
	}
176
	
177
	/**
178
	 * Gets a new input panel
179
	 * @param text
180
	 * @param combo
181
	 * @return
182
	 */
183
	public JPanel getInputPanel() {
184
		JPanel panel = new JPanel();
185
		GridBagLayout gbl = new GridBagLayout();
186
		panel.setLayout(gbl);
187
		panel.setBorder(BorderFactory.createTitledBorder(GeoProcessLocator.getGeoProcessManager().getTranslation("input")));
188
		
189
		GridBagConstraints gbc = new GridBagConstraints();
190
		gbc.fill = GridBagConstraints.HORIZONTAL;
191
		gbc.weightx = 1.0;
192
		gbc.insets = new Insets(0, marginSides, marginBottom, marginSides);
193
		panel.add(getComboLayers(), gbc);
194
		
195
		return panel;
196
	}
197
	
198
	/**
199
	 * Gets a new options panel
200
	 * @param text
201
	 * @param combo
202
	 * @return
203
	 */
204
	public JPanel getOptionsPanel() {
205
		JPanel panel = new JPanel();
206
		GridBagLayout gbl = new GridBagLayout();
207
		panel.setLayout(gbl);
208
		panel.setBorder(BorderFactory.createTitledBorder(GeoProcessLocator.getGeoProcessManager().getTranslation("options")));
209
		
210
		ButtonGroup group = new ButtonGroup();
211
		group.add(getRadioSelectDistance());
212
	    group.add(getRadioSelectField());
213

  
214
		GridBagConstraints gbc = new GridBagConstraints();
215
		gbc.fill = GridBagConstraints.HORIZONTAL;
216
		gbc.weightx = 1.0;
217
		gbc.insets = new Insets(0, marginSides, marginBottom, marginSides);
218
		panel.add(getRadioSelectField(), gbc);
219
		
220
		gbc.gridy = 1;
221
		gbc.insets = new Insets(0, marginSides + 10, marginBottom, marginSides);
222
		panel.add(getComboFields(), gbc);
223
		
224
		gbc.gridy = 2;
225
		gbc.insets = new Insets(0, marginSides, marginBottom, marginSides);
226
		panel.add(getRadioSelectDistance(), gbc);
227
		
228
		gbc.gridy = 3;
229
		gbc.insets = new Insets(0, marginSides + 10, marginBottom, marginSides);
230
		panel.add(getTextDistance(), gbc);
231
		
232
		gbc.gridy = 4;
233
		gbc.insets = new Insets(0, marginSides, marginBottom, marginSides);
234
		panel.add(getCheckSelectedGeom(), gbc);
235
		
236
		gbc.gridy = 5;
237
		panel.add(getCheckDissolveEntities(), gbc);
238
		
239
		gbc.gridy = 6;
240
		panel.add(getCheckRoundBorder(), gbc);
241
		
242
		gbc.gridy = 7;
243
		panel.add(getComboInfluenceAreas(), gbc);
244
		
245
		gbc.gridy = 8;
246
		panel.add(getComboRadialBuffers(), gbc);
247
		
248
		checkLineLayer();
249
		
250
		return panel;
251
	}
252
	
253
	/**
254
	 * Gets a ComboBox
255
	 * @return
256
	 */
257
	public JComboBox getComboLayers() {
258
		if(layers == null) {
259
			layers = new JComboBox();
260
			ComboBoxModel comboModel = new DefaultComboBoxModel(getLayerList());
261
			layers.setModel(comboModel);
262
			layers.addActionListener(this);
263
		}
264
		return layers;
265
	}
266
	
267
	/**
268
	 * Gets a influence areas ComboBox
269
	 * @return
270
	 */
271
	public JComboBox getComboInfluenceAreas() {
272
		if(influenceAreas == null) {
273
			influenceAreas = new JComboBox();
274
			for (int i = 0; i < BufferAlgorithm.sOptions.length; i++) {
275
				influenceAreas.addItem(BufferAlgorithm.sOptions[i]);
276
			}
277
			influenceAreas.addActionListener(this);
278
		}
279
		return influenceAreas;
280
	}
281
	
282
	/**
283
	 * Gets a influence areas ComboBox
284
	 * @return
285
	 */
286
	public JComboBox getComboRadialBuffers() {
287
		if(radialBuffers == null) {
288
			radialBuffers = new JComboBox();
289
			radialBuffers.addItem(BufferAlgorithm.BUFFER_OUTSIDE_POLY + 1 + "");
290
			radialBuffers.addItem(BufferAlgorithm.BUFFER_INSIDE_POLY + 1 + "");
291
			radialBuffers.addItem(BufferAlgorithm.BUFFER_INSIDE_OUTSIDE_POLY + 1 + "");
292
			radialBuffers.addActionListener(this);
293
		}
294
		return radialBuffers;
295
	}
296
	
297
	/**
298
	 * Gets a CheckBox
299
	 * @return
300
	 */
301
	public JCheckBox getCheckSelectedGeom() {
302
		if(selectionOnly == null) {
303
			selectionOnly = new JCheckBox(GeoProcessLocator.getGeoProcessManager().getTranslation("Selected_geometries"));
304
		}
305
		return selectionOnly;
306
	}
307
	
308
	/**
309
	 * Gets a CheckBox
310
	 * @return
311
	 */
312
	public JCheckBox getCheckDissolveEntities() {
313
		if(dissolveEntities == null) {
314
			dissolveEntities = new JCheckBox(GeoProcessLocator.getGeoProcessManager().getTranslation("Dissolve_entities"));
315
		}
316
		return dissolveEntities;
317
	}
318
	
319
	/**
320
	 * Gets a CheckBox
321
	 * @return
322
	 */
323
	public JCheckBox getCheckRoundBorder() {
324
		if(roundBorder == null) {
325
			roundBorder = new JCheckBox(GeoProcessLocator.getGeoProcessManager().getTranslation("Round_border"));
326
		}
327
		return roundBorder;
328
	}
329
	
330
	/**
331
	 * Gets a ComboBox
332
	 * @return
333
	 */
334
	public JComboBox getComboFields() {
335
		if(fields == null) {
336
			fields = new JComboBox();
337
			loadFieldsInAreaCombo();
338
			fields.setEnabled(true);
339
		}
340
		return fields;
341
	}
342
	
343
	private void loadFieldsInAreaCombo() {
344
		List<String> fieldList = getFieldList();
345
		getComboFields().removeAllItems();
346
		for (int i = 0; i < fieldList.size(); i++) 
347
			getComboFields().addItem(fieldList.get(i));
348
	}
349
	
350
	private void checkLineLayer() {
351
		IVectorLayer vectorLyr = getSelectedVectorLayer();
352
		if(vectorLyr.getShapeType() == IVectorLayer.SHAPE_TYPE_LINE || vectorLyr.getShapeType() == IVectorLayer.SHAPE_TYPE_POINT) {
353
			getComboInfluenceAreas().setSelectedIndex(BufferAlgorithm.BUFFER_OUTSIDE_POLY);
354
			getComboInfluenceAreas().setEnabled(false);
355
		} else {
356
			getComboInfluenceAreas().setEnabled(true);
357
		}
358
	}
359
	
360
	/**
361
	 * Gets a CheckBox
362
	 * @return
363
	 */
364
	public JTextField getTextDistance() {
365
		if(distance == null) {
366
			distance = new JTextField("0.0");
367
			distance.setEnabled(false);
368
		}
369
		return distance;
370
	}
371
	
372
	/**
373
	 * Gets a JRadioButton
374
	 * @return
375
	 */
376
	public JRadioButton getRadioSelectDistance() {
377
		if(selectDistance == null) {
378
			selectDistance = new JRadioButton(GeoProcessLocator.getGeoProcessManager().getTranslation("area_distance"));
379
			selectDistance.addActionListener(this);
380
			selectDistance.setSelected(false);
381
		}
382
		return selectDistance;
383
	}
384
	
385
	/**
386
	 * Gets a JRadioButton
387
	 * @return
388
	 */
389
	public JRadioButton getRadioSelectField() {
390
		if(selectField == null) {
391
			selectField = new JRadioButton(GeoProcessLocator.getGeoProcessManager().getTranslation("area_field"));
392
			selectField.addActionListener(this);
393
			selectField.setSelected(true);
394
		}
395
		return selectField;
396
	}
397
	
398
	//------------------------------------------------------------
399
	
400
	/*
401
	 * (non-Javadoc)
402
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
403
	 */
404
	public void actionPerformed(ActionEvent e) {
405
		if(e.getSource() == getRadioSelectDistance()) {
406
			getTextDistance().setEnabled(true);
407
			getComboFields().setEnabled(false);
408
		}
409
		
410
		if(e.getSource() == getRadioSelectField()) {
411
			getTextDistance().setEnabled(false);
412
			getTextDistance().setText("0.0");
413
			getComboFields().setEnabled(true);
414
		}
415
		
416
		if(e.getSource() == getComboLayers()) {
417
			loadFieldsInAreaCombo();
418
			checkLineLayer();
419
		}
420
	}
421
	
422
	@Override
423
    public void assignParameters() {
424
		try {
425
			ParametersSet params = m_Algorithm.getParameters();
426
			params.getParameter(BufferAlgorithm.LAYER).setParameterValue(getSelectedVectorLayer());
427
			params.getParameter(BufferAlgorithm.FIELD).setParameterValue(getFieldPosition());
428
			params.getParameter(BufferAlgorithm.FIELD).setParameterValue(getFieldName());
429
			params.getParameter(BufferAlgorithm.SELECTED_GEOM).setParameterValue(getCheckSelectedGeom().isSelected());
430
			double dist = 0;
431
			try {
432
				dist = new Double(getTextDistance().getText());
433
			} catch(NumberFormatException e) {
434
			}
435
			params.getParameter(BufferAlgorithm.DISTANCE).setParameterValue(dist);
436
			params.getParameter(BufferAlgorithm.DISSOLVE).setParameterValue(getCheckDissolveEntities().isSelected());
437
			params.getParameter(BufferAlgorithm.ROUND_BORDER).setParameterValue(getCheckRoundBorder().isSelected());
438
			params.getParameter(BufferAlgorithm.AREA).setParameterValue(getComboInfluenceAreas().getSelectedIndex());
439
			params.getParameter(BufferAlgorithm.RING_NUMBER).setParameterValue(getComboRadialBuffers().getSelectedIndex());
440
			
441
			OutputObjectsSet ooSet = m_Algorithm.getOutputObjects();
442
			Output out = ooSet.getOutput(BufferAlgorithm.RESULT);
443
			
444
			//Reponer estas l?neas para cambiar el panel de salida y comentar la siguiente
445
			//AlgorithmOutputPanel fsp = getAlgorithmOutputPanel();
446
			//out.setOutputChannel(new CompositeSourceOutputChannel(fsp.getOutputParameters()));
447
	         out.setOutputChannel(outputChannelSelectionPanel.getOutputChannel());
448
		} catch (Exception e) {
449
			Sextante.addErrorToLog(e);
450
		}
451
	}
452
	
453
	
454

  
455
	@Override
456
	public void setOutputValue(String arg0, String arg1) {
457
		
458
	}
459

  
460
	@Override
461
	public void setParameterValue(String arg0, String arg1) {
462
		
463
	}
464
	
465
	/**
466
	 * Gets the input layer list
467
	 * @return
468
	 */
469
	private ObjectAndDescription[] getLayerList() {
470
		IVectorLayer[] layers = SextanteGUI.getInputFactory()
471
					.getVectorLayers(IVectorLayer.SHAPE_TYPE_WRONG);
472
		ObjectAndDescription[] oad = new ObjectAndDescription[layers.length];
473
		for (int i = 0; i < layers.length; i++)
474
			oad[i] = new ObjectAndDescription(layers[i].getName(), layers[i]);
475
		return oad;
476
	}
477
	
478
	/**
479
	 * Gets the selected vector layer in the JComboBox
480
	 * @return
481
	 */
482
	private IVectorLayer getSelectedVectorLayer() {
483
		if(layers.getSelectedItem() != null)
484
			return (IVectorLayer)((ObjectAndDescription)layers.getSelectedItem()).getObject();
485
		return null;
486
	}
487
	
488
	/**
489
	 * Gets the field list of the selected layer
490
	 * @return
491
	 */
492
	@SuppressWarnings("unchecked")
493
	public List<String> getFieldList() {
494
		IVectorLayer layer = getSelectedVectorLayer();
495
		List<String> data = new ArrayList<String>();
496
		fieldList.clear();
497
		for (int i = 0; i < layer.getFieldCount(); i++) {
498
			Class type = layer.getFieldType(i);
499
			fieldList.add(layer.getFieldName(i));
500
			if(Number.class.isAssignableFrom(type))
501
				data.add(layer.getFieldName(i));
502
		}
503
		return data;
504
	}
505
	
506
	private int getFieldPosition() {
507
		if(getComboFields().getSelectedItem() != null) {
508
			String label = getComboFields().getSelectedItem().toString();
509
			for (int i = 0; i < fieldList.size(); i++) {
510
				if(fieldList.get(i).equals(label)) {
511
					return i;
512
				}
513
			}
514
		}
515
		return -1;
516
	}	
517
        
518
        private String getFieldName() {
519
		if(getComboFields().getSelectedItem() != null) {
520
			String label = getComboFields().getSelectedItem().toString();
521
                        return label;
522
		}
523
		return null;
524
	}
525
}
0 526

  
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/java/org/gvsig/geoprocess/algorithm/buffer/AbstractDistance.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.algorithm.buffer;
25

  
26
import org.cresques.cts.IProjection;
27
import org.gvsig.fmap.dal.feature.Feature;
28
import org.gvsig.fmap.mapcontext.MapContext;
29

  
30
/**
31
 * Abstract distance implementation.
32
 * 
33
 * @author gvSIG Team
34
 * @version $Id$
35
 */
36
public abstract class AbstractDistance implements IDistance {
37

  
38
    public static final double EARTH_RADIUS = 6378137d;
39
    protected int numberOfRings = 1;
40
    protected Feature feature = null;
41
    
42
    public void setFeature(Feature feature) {
43
        this.feature = feature;
44
    }
45

  
46
    /**
47
     * For computing with geodetic coordinates:
48
     * returns the angular measure (in radians)
49
     * for a distance over the earth along a
50
     * meridiam.
51
     * Because this consideration is an approximation,
52
     * we consideer the eart like an sphere (not an
53
     * ellipsoid)
54
     * 
55
     * @param dist
56
     *            distance in meters
57
     * @return arc of meridian whose length is the specified
58
     *         distance
59
     */
60
    private double toSexaAngularMeasure(double dist) {
61
        /*
62
         * dist = 6378km(terrestrial radius) -> 2PI
63
         * passed distance -> incognite
64
         */
65
        return Math.toDegrees((2 * Math.PI * dist) / EARTH_RADIUS);
66
    }
67

  
68
    /**
69
     * Converts a distance entered by user in the GUI in the same distance
70
     * in internal units (measure units)
71
     */
72
    protected double getInInternalUnits(double userEntryDistance,
73
        IProjection proj, int distanceUnits, int mapUnits) {
74

  
75
       /* double[] trans2Meter = MapContext.getDistanceTrans2Meter();
76
        double distInInternalUnits =
77
            (userEntryDistance / trans2Meter[mapUnits])
78
                * trans2Meter[distanceUnits];
79

  
80
        if ((proj != null) && !(proj.isProjected()))
81
            distInInternalUnits = toSexaAngularMeasure(distInInternalUnits);
82
            
83
        return distInInternalUnits;*/
84
    	
85
    	/*
86
    	 * En caso de que el sistema de referencia sea proyectado se usa la distancia
87
    	 * que el usuario ha definido, ya que esta se supone en metros. En caso de que
88
    	 * las coordenadas sean en geogr?ficas se toma la distancia que el usuario ha
89
    	 * definido en metros en el ecuador. Esto supone una desviaci?n a medida que 
90
    	 * nos alejamos del ecuador. Una posible soluci?n ser?a obtener esa distancia 
91
    	 * para la posici?n en el planeta en la que se encuentra la cartograf?a en la
92
    	 * proyecci?n en la que est? definida. 
93
    	 */
94

  
95
    	if ((proj != null) && !(proj.isProjected()))
96
    		return userEntryDistance / 111352D;
97
        return userEntryDistance;
98
    }
99
    
100
    public void setNumberOfRings(int n) {
101
    	numberOfRings = n;
102
    }
103

  
104
}
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/java/org/gvsig/geoprocess/algorithm/buffer/BufferLibrary.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.algorithm.buffer;
25

  
26
import org.gvsig.geoprocess.algorithm.base.core.AlgorithmAbstractLibrary;
27
import org.gvsig.i18n.Messages;
28
import org.gvsig.tools.library.LibraryException;
29

  
30
/**
31
 * Initialization of BufferLibrary library.
32
 * 
33
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
34
 * @author gvSIG Team
35
 */
36
public class BufferLibrary extends AlgorithmAbstractLibrary {
37

  
38
    @Override
39
    protected void doInitialize() throws LibraryException {
40
        // Nothing to do
41
    }
42

  
43
    @Override
44
    protected void doPostInitialize() throws LibraryException {
45
        Messages.addResourceFamily(
46
            "org.gvsig.geoprocess.algorithm.buffer.buffer", BufferLibrary.class
47
                .getClassLoader(), BufferLibrary.class.getClass().getName());
48
        registerGeoProcess(new BufferAlgorithm());
49
    }
50

  
51
}
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/java/org/gvsig/geoprocess/algorithm/buffer/FieldDistance.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.algorithm.buffer;
25

  
26
import org.cresques.cts.IProjection;
27

  
28
/**
29
 * Computes a constant size of each geometry built
30
 * 
31
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
32
 */
33
public class FieldDistance extends AbstractDistance {
34

  
35
    private String attributeName = null;
36
    private int attributeIndex = -1;
37

  
38
    public FieldDistance(String attributeName) {
39
        this.attributeName = attributeName;
40
    }
41

  
42
    public FieldDistance(int attributeIndex) {
43
        this.attributeIndex = attributeIndex;
44
    }
45

  
46
    public double getBufferDistance(IProjection projection, int distanceUnits, int mapUnits) {
47
        double value = 0D;
48
        Object obj;
49
        if( this.attributeIndex<0 ) {
50
            obj = feature.get(attributeName);
51
        } else {
52
            obj = feature.get(attributeIndex);
53
        }
54
        if (obj instanceof Number) {
55
            value = ((Number) obj).doubleValue();
56
        } else {
57
            return 0;
58
        }
59
        return getInInternalUnits(value, projection, distanceUnits, mapUnits) * numberOfRings;
60
    }
61

  
62
}
org.gvsig.geoprocess/tags/org.gvsig.geoprocess-2.2.106/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/java/org/gvsig/geoprocess/algorithm/buffer/BufferAlgorithm.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.algorithm.buffer;
25

  
26
import java.io.File;
27

  
28
import javax.swing.JOptionPane;
29

  
30
import org.cresques.cts.IProjection;
31
import org.gvsig.fmap.dal.DALLocator;
32
import org.gvsig.fmap.dal.DataManager;
33
import org.gvsig.fmap.dal.DataStoreParameters;
34
import org.gvsig.fmap.dal.DataTypes;
35
import org.gvsig.fmap.dal.exception.DataException;
36
import org.gvsig.fmap.dal.exception.InitializeException;
37
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
38
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
39
import org.gvsig.fmap.dal.feature.EditableFeatureType;
40
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
41
import org.gvsig.fmap.dal.feature.FeatureStore;
42
import org.gvsig.fmap.dal.feature.FeatureType;
43
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
44
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
45
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
46
import org.gvsig.fmap.geom.Geometry;
47
import org.gvsig.geoprocess.lib.api.GeoProcessLocator;
48
import org.gvsig.geoprocess.lib.sextante.AbstractSextanteGeoProcess;
49
import org.gvsig.geoprocess.lib.sextante.dataObjects.FlyrVectIVectorLayer;
50

  
51
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
52
import es.unex.sextante.core.Sextante;
53
import es.unex.sextante.dataObjects.IVectorLayer;
54
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
55
import es.unex.sextante.exceptions.NullParameterValueException;
56
import es.unex.sextante.exceptions.OptionalParentParameterException;
57
import es.unex.sextante.exceptions.RepeatedParameterNameException;
58
import es.unex.sextante.exceptions.UndefinedParentParameterNameException;
59
import es.unex.sextante.exceptions.UnsupportedOutputChannelException;
60
import es.unex.sextante.exceptions.WrongParameterIDException;
61
import es.unex.sextante.exceptions.WrongParameterTypeException;
62
import es.unex.sextante.gui.algorithm.GeoAlgorithmParametersPanel;
63
import es.unex.sextante.outputs.OutputVectorLayer;
64

  
65
/**
66
 * Geoprocess that computes a buffer area around each feature's geometry of the
67
 * input layer. <br>
68
 * All the points interior to this buffer area has to be at a distance inferior
69
 * to "buffer distance" to the original geometry. This buffer distance could be
70
 * constant, or it could be a function of the value of a feature attribute.<br>
71
 * 
72
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
73
 * @author gvSIG Team
74
 */
75
public class BufferAlgorithm extends AbstractSextanteGeoProcess {
76

  
77
    public static final String RESULT                   = "RESULT";
78
    public static final String LAYER                    = "LAYER";
79
    public static final String SELECTED_GEOM            = "SELECTED_GEOM";
80
    public static final String DISTANCE                 = "DISTANCE";
81
    public static final String FIELD                    = "FIELD";
82
    public static final String DISSOLVE                 = "DISSOLVE";
83
    public static final String ROUND_BORDER             = "ROUND_BORDER";
84
    public static final String AREA                     = "AREA";
85
    public static final String RING_NUMBER              = "RING_NUMBER";
86
    
87
	/**
88
	 * For polygonal buffers, only compute exterior buffers
89
	 * (is the default operation, it applies to any geometry type)
90
	 */
91
	public static final byte BUFFER_OUTSIDE_POLY        = 0;
92
	/**
93
	 * For polygonal buffers, only compute interior buffers
94
	 */
95
	public static final byte BUFFER_INSIDE_POLY         = 1;
96
	/**
97
	 * For polygonal buffers, compute interior and exterior buffers
98
	 */
99
	public static final byte BUFFER_INSIDE_OUTSIDE_POLY = 2;
100
	
101
    public static final byte SOURCE_FIELDS              = 0;
102
    public static final byte FID_DIST_FIELDS            = 1;
103
    public static final byte FID_FROM_TO_FIELDS         = 2;
104
    protected byte           tableFields                = -1; 
105
    
106
    private int              inflArea                   = BUFFER_OUTSIDE_POLY;
107
    protected boolean        dissolve                   = false;
108
    protected int            rings                      = 0;
109
    protected boolean        selectedGeom               = false;
110
    protected FeatureStore   inputStore                 = null;
111
    protected FeatureStore   outputStore                = null;
112
    protected IVectorLayer   sextanteInputLayer         = null;
113
    protected boolean        round_border               = false; 
114
	
115
    public static String[] sOptions = {
116
    	GeoProcessLocator.getGeoProcessManager().getTranslation("poly_out"), 
117
    	GeoProcessLocator.getGeoProcessManager().getTranslation("poly_in"),
118
    	GeoProcessLocator.getGeoProcessManager().getTranslation("poly_inandout") 
119
    };
120

  
121
    public void defineCharacteristics() {
122
        setName(getTranslation("Buffer"));
123
        setGroup(getTranslation("basic_vect_algorithms"));
124
        // setGeneratesUserDefinedRasterOutput(false);
125
       
126
        try {
127
            m_Parameters.addInputVectorLayer(LAYER, getTranslation("Input_layer"), 
128
            	IVectorLayer.SHAPE_TYPE_WRONG, true);
129
            m_Parameters.addBoolean(SELECTED_GEOM, getTranslation("Selected_geometries"), false);
130
            m_Parameters.addNumericalValue(DISTANCE, getTranslation("area_distance"), 0,
131
                AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
132
            m_Parameters.addTableField(FIELD, getTranslation("area_field"), "LAYER");
133
            m_Parameters.addBoolean(DISSOLVE, getTranslation("Dissolve_entities"), false);
134
            m_Parameters.addBoolean(ROUND_BORDER, getTranslation("Round_border"), true);
135
            m_Parameters.addSelection(AREA, getTranslation("Builds_influence_area"), sOptions);
136
            m_Parameters.addSelection(RING_NUMBER, getTranslation("Number_of_rings"),
137
                new String[] { "1", "2", "3" });
138
        } catch (RepeatedParameterNameException e) {
139
            Sextante.addErrorToLog(e);
140
        } catch (UndefinedParentParameterNameException e) {
141
            Sextante.addErrorToLog(e);
142
        } catch (OptionalParentParameterException e) {
143
            Sextante.addErrorToLog(e);
144
        }
145
        addOutputVectorLayer(RESULT, getTranslation("Buffer"),
146
            OutputVectorLayer.SHAPE_TYPE_POLYGON);
147
    }
148
    
149
    protected void readParameters() throws WrongParameterTypeException, NullParameterValueException, WrongParameterIDException {
150
    	sextanteInputLayer = m_Parameters.getParameterValueAsVectorLayer(LAYER);
151
    	selectedGeom = m_Parameters.getParameter(SELECTED_GEOM).getParameterValueAsBoolean();
152
    	rings = m_Parameters.getParameterValueAsInt(RING_NUMBER);
153
        dissolve = m_Parameters.getParameter(DISSOLVE).getParameterValueAsBoolean();
154
        round_border = m_Parameters.getParameter(ROUND_BORDER).getParameterValueAsBoolean();
155
    }
156

  
157
    public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
158
    	if(existsOutPutFile(BufferAlgorithm.RESULT, 0)) {
159
    		throw new GeoAlgorithmExecutionException(getTranslation("file_exists"));
160
    	}
161
        
162
        double distanceValue = m_Parameters.getParameter(DISTANCE).getParameterValueAsDouble();
163
        String attributeName = m_Parameters.getParameterValueAsString(FIELD);
164
        inflArea = m_Parameters.getParameterValueAsInt(AREA);
165
        readParameters();
166

  
167
        if (sextanteInputLayer.getShapeType() != IVectorLayer.SHAPE_TYPE_POLYGON
168
            && inflArea != BUFFER_OUTSIDE_POLY) {
169
            JOptionPane.showMessageDialog(null,
170
                getTranslation("Wrong_type_for_this_shapetype"), "Error",
171
                JOptionPane.WARNING_MESSAGE);
172
            inflArea = BUFFER_OUTSIDE_POLY;
173
        }
174
        
175
        if (sextanteInputLayer instanceof FlyrVectIVectorLayer)
176
            inputStore = ((FlyrVectIVectorLayer) sextanteInputLayer).getFeatureStore();
177
        else
178
            return false;
179
        
180

  
181
        try {
182
            // Object to compute the distance
183
            IDistance distance = null;
184
            if (distanceValue == 0) {
185
                //int featureAttributePosition = ((FlyrVectIVectorLayer) sextanteInputLayer).getFeatureIndexByFieldIndex(attributePosition);
186
                distance = new FieldDistance(attributeName);//featureAttributePosition);
187
            } else {
188
                distance = new ConstantDistance(distanceValue);
189
            }
190
            // Object to compute the buffer operation
191
            BufferOperation operation = null;
192
            switch (inflArea) {
193
            case BUFFER_OUTSIDE_POLY:
194
                operation = new OutBufferOperation(distance, inputStore, this, getTableFieldsStructure());
195
                break;
196
            case BUFFER_INSIDE_POLY:
197
                operation = new InBufferOperation(distance, inputStore, this, getTableFieldsStructure());
198
                break;
199
            case BUFFER_INSIDE_OUTSIDE_POLY:
200
                operation = new InOutBufferOperation(distance, inputStore, this, getTableFieldsStructure());
201
                break;
202
            }
203
            operation.setTypeOfCap(round_border ? BufferOperation.CAP_ROUND : BufferOperation.CAP_SQUARE);
204
            operation.setGeoProcess(this, 100);
205
            
206
        	// Builds the output FeatureStore
207
            outputStore = buildOutPutStore(IVectorLayer.SHAPE_TYPE_POLYGON,
208
        					getTranslation("Buffer"), RESULT);
209
        	
210
        	if(!dissolve) {
211
        		computesBufferAlgWithoutDissolve(operation);
212
        	} else {
213
        		computesBufferAlgWithDissolve(operation);
214
        	}
215
        	
216
        } catch (DataException e) {
217
            Sextante.addErrorToLog(e);
218
            return false;
219
        }
220
        
221
		if(getTaskMonitor().isCanceled())
222
			return false;
223

  
224
        return true;
225
    }
226
    
227
    private void computesOneRingBufferWithDissolve(
228
    		BufferOperation operation, 
229
    		FuseOperation fuseOp, 
230
    		String idFile,
231
    		int initialPosition,
232
    		int ringPosition) throws ValidateDataParametersException, DataException {
233
    	String file = System.getProperty("java.io.tmpdir") + File.separator + (idFile) + ".shp";
234
		FeatureStore outAuxFeatStore = buildTemporalStore(org.gvsig.fmap.geom.Geometry.TYPES.SURFACE, file, 
235
				inputStore.getDefaultFeatureType().getDefaultSRS());
236
		
237
		operation.getDistance().setNumberOfRings(ringPosition + 1);
238
		
239
		operation.setNumberOfRadialBuffers(1);
240
		operation.setTaskStatus(getStatus());
241
		m_Task.setProgressText(getTranslation("calc_buffer") + " [Ring:" + (rings - ringPosition) + "]");
242
		operation.computesGeometryOperation(inputStore, outAuxFeatStore,
243
				attrNames, selectedGeom, false, true);
244
		
245
		outAuxFeatStore = open(file, inputStore.getDefaultFeatureType().getDefaultSRS());
246
		
247
		m_Task.setProgressText(getTranslation("fuse_spatially") + " [Ring:" + (rings - ringPosition) + "]");
248
		fuseOp.computesGeometryOperation(outAuxFeatStore, outputStore, attrNames, ringPosition == initialPosition ? true : false);
249
		outAuxFeatStore.dispose();
250
    }
251
    
252
    protected void computesBufferAlgWithDissolve(BufferOperation operation) throws DataException {
253
    	long fileTmpId = System.currentTimeMillis();
254
    	FuseOperation fuseOp = new FuseOperation(this);
255
    	
256
    	if(inflArea == BUFFER_OUTSIDE_POLY || inflArea == BUFFER_INSIDE_OUTSIDE_POLY) {
257
    		try {
258
    			for (int i = rings; i >= 0 ; i--) {
259
    				computesOneRingBufferWithDissolve(
260
    						operation, 
261
    						fuseOp, 
262
    						fileTmpId + i + "",
263
    						rings,
264
    						i);
265
    			}
266
    		} catch (ValidateDataParametersException e) {
267
    			Sextante.addErrorToLog(e);
268
    		}
269
    	}
270
    	
271
    	if(inflArea == BUFFER_INSIDE_POLY) {
272
    		try {
273
    			for (int i = 0; i < rings + 1 ; i++) {
274
    				computesOneRingBufferWithDissolve(
275
    						operation, 
276
    						fuseOp, 
277
    						fileTmpId + i + "",
278
    						0,
279
    						i);
280
    			}
281
    		} catch (ValidateDataParametersException e) {
282
    			Sextante.addErrorToLog(e);
283
    		}
284
    	}
285
    	
286
    	fuseOp.end();
287
    }
288
    
289
    protected void computesBufferAlgWithoutDissolve(BufferOperation operation) throws DataException {
290
    	operation.setNumberOfRadialBuffers(rings + 1);
291
    	operation.setTaskStatus(getStatus());
292
    	operation.computesGeometryOperation(inputStore, 
293
    			outputStore,
294
    			attrNames, 
295
    			selectedGeom, 
296
    			false, 
297
    			true);
298
    }
299
    
300
    
301
    /**
302
     * Gets the constant with the table structure 
303
     * @return
304
     */
305
    protected byte getTableFieldsStructure() {
306
    	if(tableFields == -1) {
307
            if(!dissolve) {
308
            	tableFields = SOURCE_FIELDS;
309
        	} else {
310
                if (inflArea == BUFFER_INSIDE_OUTSIDE_POLY) 
311
                	tableFields = FID_FROM_TO_FIELDS;
312
                else
313
                	tableFields = FID_DIST_FIELDS;
314
        	}
315
    	}
316
    	return tableFields;
317
    }
318
    
319
    /**
320
     * Open a <code>DataStore</code>
321
     * @param file
322
     * @param proj
323
     * @return
324
     * @throws InitializeException
325
     * @throws ProviderNotRegisteredException
326
     * @throws ValidateDataParametersException
327
     */
328
    private FeatureStore open(String file, IProjection proj) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
329
    	DataManager manager = DALLocator.getDataManager();
330
    	DataStoreParameters params = manager.createStoreParameters("Shape");
331
    	params.setDynValue("shpfile", file);
332
    	params.setDynValue("crs", proj);
333
    	FeatureStore featureStore = (FeatureStore) manager.openStore(params.getDataStoreName(), params);
334
    	return featureStore;
335
    }
336

  
337
    /**
338
     * Builds the output FeatureStore
339
     * 
340
     * @param featureType
341
     * @return FeatureStore
342
     * @throws DataException 
343
     */
344
    protected FeatureStore buildOutPutStore(int shapeType, 
345
    		String sextanteLayerName, 
346
    		String sextanteLayerLabel) throws DataException {
347
    	FeatureType featureType = inputStore.getDefaultFeatureType();
348
    	
349
    	if(getTableFieldsStructure() == SOURCE_FIELDS) {
350
    		return super.buildOutPutStore(featureType, shapeType,sextanteLayerName, sextanteLayerLabel);
351
    	} 
352
    	Class<?>[] types = null;
353
    	if (getTableFieldsStructure() == FID_FROM_TO_FIELDS) {
354
    		types = new Class[] { Integer.class, Double.class, Double.class };
355
    		attrNames = new String[] { "FID", "FROM", "TO" };
356
    	} 
357
    	if (getTableFieldsStructure() == FID_DIST_FIELDS) {
358
    		types = new Class[] { Integer.class, Double.class };
359
    		attrNames = new String[] { "FID", "DIST" };
360
    	}
361
    	try {
362
    		IVectorLayer output =
363
    				getNewVectorLayer(sextanteLayerLabel, sextanteLayerName,
364
    						shapeType, types, attrNames);
365
    		return ((FlyrVectIVectorLayer) output).getFeatureStore();
366
    	} catch (UnsupportedOutputChannelException e) {
367
    		Sextante.addErrorToLog(e);
368
    	} catch (GeoAlgorithmExecutionException e) {
369
    		Sextante.addErrorToLog(e);
370
    	}
371
    	
372
    	return null;
373
    }
374

  
375
    /**
376
     * Builds the output FeatureStore
377
     * 
378
     * @param featureType
379
     * @return FeatureStore
380
     * @throws DataException 
381
     * @throws ValidateDataParametersException 
382
     */
383
    protected FeatureStore buildTemporalStore(int shapeType, 
384
    		String file, 
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff