add new functions to analysis library, also adds python bindings to analysis library

git-svn-id: http://svn.osgeo.org/qgis/trunk@11976 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
cfarmer 2009-11-07 19:22:27 +00:00
parent e4f8eddc43
commit 4a7839c313
7 changed files with 711 additions and 560 deletions

View File

@ -2,38 +2,45 @@ SUBDIRS(plugins)
IF (WIN32) IF (WIN32)
SET(BINDINGS_CORE_LIB ${CMAKE_CURRENT_BINARY_DIR}/core/core.pyd) SET(BINDINGS_CORE_LIB ${CMAKE_CURRENT_BINARY_DIR}/core/core.pyd)
SET(BINDINGS_GUI_LIB ${CMAKE_CURRENT_BINARY_DIR}/gui/gui.pyd) SET(BINDINGS_GUI_LIB ${CMAKE_CURRENT_BINARY_DIR}/gui/gui.pyd)
SET(BINDINGS_ANALYSIS_LIB ${CMAKE_CURRENT_BINARY_DIR}/analysis/analysis.pyd)
IF (NOT MSVC) IF (NOT MSVC)
SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.dll) SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.dll)
SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.dll) SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.dll)
SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/libqgis_analysis.dll)
ELSE (NOT MSVC) ELSE (NOT MSVC)
SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/${CMAKE_CFG_INTDIR}/qgis_core.lib) SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/${CMAKE_CFG_INTDIR}/qgis_core.lib)
SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/${CMAKE_CFG_INTDIR}/qgis_gui.lib) SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/${CMAKE_CFG_INTDIR}/qgis_gui.lib)
SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/${CMAKE_CFG_INTDIR}/qgis_analysis.lib)
ENDIF (NOT MSVC) ENDIF (NOT MSVC)
ELSE (WIN32) ELSE (WIN32)
SET(BINDINGS_CORE_LIB ${CMAKE_CURRENT_BINARY_DIR}/core/core.so) SET(BINDINGS_CORE_LIB ${CMAKE_CURRENT_BINARY_DIR}/core/core.so)
SET(BINDINGS_GUI_LIB ${CMAKE_CURRENT_BINARY_DIR}/gui/gui.so) SET(BINDINGS_GUI_LIB ${CMAKE_CURRENT_BINARY_DIR}/gui/gui.so)
SET(BINDINGS_ANALYSIS_LIB ${CMAKE_CURRENT_BINARY_DIR}/analysis/analysis.so)
IF (APPLE) IF (APPLE)
SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.dylib) SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.dylib)
SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.dylib) SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.dylib)
SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/libqgis_analysis.dylib)
ELSE (APPLE) ELSE (APPLE)
SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.so) SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.so)
SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.so) SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.so)
SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/libqgis_analysis.so)
ENDIF (APPLE) ENDIF (APPLE)
ENDIF (WIN32) ENDIF (WIN32)
SET (BINDINGS_LIBS ${BINDINGS_CORE_LIB} ${BINDINGS_GUI_LIB}) SET (BINDINGS_LIBS ${BINDINGS_CORE_LIB} ${BINDINGS_GUI_LIB} ${BINDINGS_ANALYSIS_LIB})
SET (BINDINGS_CORE_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/core/Makefile)
SET (BINDINGS_CORE_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/core/Makefile) SET (BINDINGS_GUI_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/gui/Makefile)
SET (BINDINGS_GUI_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/gui/Makefile) SET (BINDINGS_ANALYSIS_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/analysis/Makefile)
# 'python' target will force to build bindings libs for core and gui # 'python' target will force to build bindings libs for core and gui
ADD_CUSTOM_TARGET (python ALL DEPENDS ${BINDINGS_CORE_LIB} ${BINDINGS_GUI_LIB}) ADD_CUSTOM_TARGET (python ALL DEPENDS ${BINDINGS_CORE_LIB} ${BINDINGS_GUI_LIB} ${BINDINGS_ANALYSIS_LIB})
# don't run python before the libs are built # don't run python before the libs are built
ADD_DEPENDENCIES (python qgis_core qgis_gui) ADD_DEPENDENCIES (python qgis_core qgis_gui qgis_analysis)
FILE(GLOB CORE_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/core/*.sip") FILE(GLOB CORE_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/core/*.sip")
FILE(GLOB GUI_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/gui/*.sip") FILE(GLOB GUI_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/gui/*.sip")
FILE(GLOB ANALYSIS_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/analysis/*.sip")
# Step 1: during configuration # Step 1: during configuration
# create file configure.py from configure.py.in # create file configure.py from configure.py.in
@ -50,12 +57,12 @@ ENDIF (MSVC)
# run python configure.py # run python configure.py
# it will run SIP utility to generate sources and will prepare makefiles # it will run SIP utility to generate sources and will prepare makefiles
# should be run everytime core or gui library has been changed # should be run everytime core or gui library has been changed
ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_CORE_MAKEFILE} ${BINDINGS_GUI_MAKEFILE} PRE_BUILD ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_CORE_MAKEFILE} ${BINDINGS_GUI_MAKEFILE} ${BINDINGS_ANALYSIS_MAKEFILE} PRE_BUILD
COMMAND ${PYTHON_EXECUTABLE} COMMAND ${PYTHON_EXECUTABLE}
ARGS ${CMAKE_CURRENT_BINARY_DIR}/configure.py ${CMAKE_CFG_INTDIR} ${EXPORT} ARGS ${CMAKE_CURRENT_BINARY_DIR}/configure.py ${CMAKE_CFG_INTDIR} ${EXPORT}
DEPENDS ${QGIS_CORE_LIB} ${QGIS_GUI_LIB} DEPENDS ${QGIS_CORE_LIB} ${QGIS_GUI_LIB} ${QGIS_ANALYSIS_LIB}
${CMAKE_CURRENT_BINARY_DIR}/configure.py ${CMAKE_CURRENT_BINARY_DIR}/configure.py
${CORE_SIP_FILES} ${GUI_SIP_FILES}) ${CORE_SIP_FILES} ${GUI_SIP_FILES} ${ANALYSIS_SIP_FILES})
# Step 3: run make in core and gui subdirs # Step 3: run make in core and gui subdirs
ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_CORE_LIB} PRE_LINK ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_CORE_LIB} PRE_LINK
@ -66,6 +73,10 @@ ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_GUI_LIB} PRE_LINK
COMMAND ${SIP_MAKE_PROGRAM} COMMAND ${SIP_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gui WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gui
DEPENDS ${BINDINGS_GUI_MAKEFILE}) DEPENDS ${BINDINGS_GUI_MAKEFILE})
ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_ANALYSIS_LIB} PRE_LINK
COMMAND ${SIP_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/analysis
DEPENDS ${BINDINGS_ANALYSIS_MAKEFILE})
IF (BINDINGS_GLOBAL_INSTALL) IF (BINDINGS_GLOBAL_INSTALL)

View File

@ -0,0 +1,11 @@
%Module qgis.analysis 0
%Import QtCore/QtCoremod.sip
%Import QtGui/QtGuimod.sip
%Import QtXml/QtXmlmod.sip
%Import core/core.sip
%Include qgsgeometryanalyzer.sip

View File

@ -0,0 +1,67 @@
/** \ingroup analysis
* The QGis class provides vector geometry analysis functions
*/
class QgsGeometryAnalyzer
{
%TypeHeaderCode
#include <qgsgeometryanalyzer.h>
%End
public:
/**
* Simplify vector layer using (a modified) Douglas-Peucker algorithm
* and write it to a new shape file
*/
bool simplify( QgsVectorLayer* layer, const QString& shapefileName, double tolerance,
bool onlySelectedFeatures = false );
/**Calculate the true centroids, or 'center of mass' for a vector layer and
write it to a new shape file
*/
bool centroids( QgsVectorLayer* layer, const QString& shapefileName,
bool onlySelectedFeatures = false );
/**Create a polygon based on the extent of all (selected) features and write it to a new shape file
*/
bool extent( QgsVectorLayer* layer, const QString& shapefileName,
bool onlySelectedFeatures = false );
/**Create buffers for a vector layer and write it to a new shape file
*/
bool buffer( QgsVectorLayer* layer, const QString& shapefileName, double bufferDistance,
bool onlySelectedFeatures = false, bool dissolve = false,
int bufferDistanceField = -1 );
/**Create convex hull(s) of a vector layer and write it to a new shape file
*/
bool convexHull( QgsVectorLayer* layer, const QString& shapefileName,
bool onlySelectedFeatures = false,
int uniqueIdField = -1 );
/**Dissolve a vector layer and write it to a new shape file
*/
bool dissolve( QgsVectorLayer* layer, const QString& shapefileName,
bool onlySelectedFeatures = false,
int uniqueIdField = -1 );
private:
QList<double> simpleMeasure( QgsGeometry* geometry );
double perimeterMeasure( QgsGeometry* geometry, QgsDistanceArea& measure );
/**Helper function to simplify an individual feature*/
void simplifyFeature( QgsFeature& f, QgsVectorFileWriter* vfw, double tolerance );
/**Helper function to get the cetroid of an individual feature*/
void centroidFeature( QgsFeature& f, QgsVectorFileWriter* vfw );
/**Helper function to buffer an individual feature*/
void bufferFeature( QgsFeature& f, int nProcessedFeatures, QgsVectorFileWriter* vfw,
bool dissolve, QgsGeometry** dissolveGeometry,
double bufferDistance, int bufferDistanceField );
/**Helper function to get the convex hull of feature(s)*/
void convexFeature( QgsFeature& f, int nProcessedFeatures,
QgsGeometry** dissolveGeometry );
/**Helper function to dissolve feature(s)*/
void dissolveFeature( QgsFeature& f, int nProcessedFeatures,
QgsGeometry** dissolveGeometry );
};

View File

@ -38,6 +38,8 @@ if not os.path.isdir("./core"):
os.mkdir("./core") os.mkdir("./core")
if not os.path.isdir("./gui"): if not os.path.isdir("./gui"):
os.mkdir("./gui") os.mkdir("./gui")
if not os.path.isdir("./analysis"):
os.mkdir("./analysis")
########################################################################## ##########################################################################
# SIP -> *.CPP + *.H # SIP -> *.CPP + *.H
@ -46,6 +48,7 @@ if not os.path.isdir("./gui"):
# system. # system.
build_file_core = build_path + "/python/core/core.sbf" build_file_core = build_path + "/python/core/core.sbf"
build_file_gui = build_path + "/python/gui/gui.sbf" build_file_gui = build_path + "/python/gui/gui.sbf"
build_file_analysis = build_path + "/python/analysis/analysis.sbf"
# Get the SIP configuration information. # Get the SIP configuration information.
config = PyQt4.pyqtconfig.Configuration() config = PyQt4.pyqtconfig.Configuration()
@ -61,6 +64,7 @@ mod_dir = os.path.join(config.default_mod_dir, "qgis")
# directory where sip files will be installed # directory where sip files will be installed
sip_dir_core = os.path.join(config.default_sip_dir, "qgis/core") sip_dir_core = os.path.join(config.default_sip_dir, "qgis/core")
sip_dir_gui = os.path.join(config.default_sip_dir, "qgis/gui") sip_dir_gui = os.path.join(config.default_sip_dir, "qgis/gui")
sip_dir_analysis = os.path.join(config.default_sip_dir, "qgis/analysis")
# Run SIP to generate the code. # Run SIP to generate the code.
print "Parsing SIP files for 'core' library..." print "Parsing SIP files for 'core' library..."
@ -73,6 +77,11 @@ cmd = " ".join([config.sip_bin, "-c", "gui", "-b", build_file_gui, "-I", python_
print cmd print cmd
os.system(cmd) os.system(cmd)
print "Parsing SIP files for 'analysis' library..."
cmd = " ".join([config.sip_bin, "-c", "analysis", "-b", build_file_analysis, "-I", python_path, "-I", config.pyqt_sip_dir, qt_sip_flags, python_path + "/analysis/analysis.sip"])
print cmd
os.system(cmd)
########################################################################## ##########################################################################
# MAKEFILES # MAKEFILES
@ -83,12 +92,13 @@ print "Creating makefiles..."
# its configuration module. # its configuration module.
installs = [] installs = []
# directories relative to core (gui) directories # directories relative to core (gui, analysis) directories
installs.append([[python_path + "__init__.py", python_path + "qgisconfig.py"], mod_dir]) installs.append([[python_path + "__init__.py", python_path + "qgisconfig.py"], mod_dir])
installs_core = copy.copy(installs) installs_core = copy.copy(installs)
installs_gui = copy.copy(installs) installs_gui = copy.copy(installs)
installs_analysis = copy.copy(installs)
# install all sip files # install all sip files
sips_core = glob.glob(python_path + "/core/*.sip") sips_core = glob.glob(python_path + "/core/*.sip")
@ -98,6 +108,10 @@ for sip in sips_core:
sips_gui = glob.glob(python_path + "/gui/*.sip") sips_gui = glob.glob(python_path + "/gui/*.sip")
for sip in sips_gui: for sip in sips_gui:
installs_gui.append([os.path.basename(sip), sip_dir_gui]) installs_gui.append([os.path.basename(sip), sip_dir_gui])
sips_analysis = glob.glob(python_path + "/analysis/*.sip")
for sip in sips_analysis:
installs_analysis.append([os.path.basename(sip), sip_dir_analysis])
# Create the Makefile. The QtModuleMakefile class provided by the # Create the Makefile. The QtModuleMakefile class provided by the
@ -120,9 +134,18 @@ makefile_gui = sipconfig.ModuleMakefile(
install_dir=mod_dir, install_dir=mod_dir,
dir="gui", dir="gui",
universal=osx_universal) universal=osx_universal)
makefile_analysis = sipconfig.ModuleMakefile(
configuration=config,
qt=qt_libs,
build_file=build_file_analysis,
installs=installs_analysis,
install_dir=mod_dir,
dir="analysis",
universal=osx_universal)
# common settings for both core and gui libs # common settings for core, gui and analysis libs
for mk in [ makefile_core, makefile_gui ]: for mk in [ makefile_core, makefile_gui, makefile_analysis ]:
mk.extra_lflags.extend( "@CMAKE_MODULE_LINKER_FLAGS@".strip(' ').split(' ') ) mk.extra_lflags.extend( "@CMAKE_MODULE_LINKER_FLAGS@".strip(' ').split(' ') )
mk.extra_libs = ["qgis_core"] mk.extra_libs = ["qgis_core"]
mk.extra_lib_dirs = [build_path+"/src/core"+intdir] mk.extra_lib_dirs = [build_path+"/src/core"+intdir]
@ -145,9 +168,18 @@ makefile_gui.extra_include_dirs.append(build_path+"/src/ui")
makefile_gui.extra_include_dirs.append(src_path+"/src/plugins") # because of qgisplugin.h TODO: sort out makefile_gui.extra_include_dirs.append(src_path+"/src/plugins") # because of qgisplugin.h TODO: sort out
makefile_gui.extra_cxxflags.append("-DGUI_EXPORT="+export) makefile_gui.extra_cxxflags.append("-DGUI_EXPORT="+export)
# more settings for analysis lib
makefile_analysis.extra_libs.append("qgis_analysis")
makefile_analysis.extra_lib_dirs.append(build_path+"/src/analysis/vector"+intdir)
makefile_analysis.extra_include_dirs.append(src_path+"/src/analysis/vector")
makefile_analysis.extra_include_dirs.append(build_path+"/src/analysis/vector")
makefile_analysis.extra_include_dirs.append(src_path+"/src/plugins") # because of qgisplugin.h TODO: sort out
makefile_analysis.extra_cxxflags.append("-DANALYSIS_EXPORT="+export)
# Generate the Makefile itself. # Generate the Makefile itself.
makefile_core.generate() makefile_core.generate()
makefile_gui.generate() makefile_gui.generate()
makefile_analysis.generate()
########################################################################## ##########################################################################
# QGIS CONFIG # QGIS CONFIG

View File

@ -34,6 +34,7 @@ class QgisModuleMakefile(pyqtconfig.QtModuleMakefile):
# Make sure our C++ library is linked. # Make sure our C++ library is linked.
self.extra_libs.append("qgis_core") self.extra_libs.append("qgis_core")
self.extra_libs.append("qgis_gui") self.extra_libs.append("qgis_gui")
self.extra_libs.append("qgis_analysis")
# Let the super-class do what it needs to. # Let the super-class do what it needs to.
pyqtconfig.QtModuleMakefile.finalise(self) pyqtconfig.QtModuleMakefile.finalise(self)

File diff suppressed because it is too large Load Diff

View File

@ -38,72 +38,37 @@ class ANALYSIS_EXPORT QgsGeometryAnalyzer
{ {
public: public:
/** /**Simplify vector layer using (a modified) Douglas-Peucker algorithm
* Convert a vector layer from single part geometry and write it to a new shape file
* to multipart geometry for a given field @param layer input vector layer
* @param shapefileName path to the output shp
* */ @param fileEncoding encoding of the output file
bool singlepartsToMultipart( QgsVectorLayer* layer, @param tolerance (level of simplification)
const QString& shapefileName, @param onlySelectedFeatures if true, only selected features are considered, else all the features
const QString& fileEncoding, @param p progress dialog (or 0 if no progress dialog is to be shown)
const int fieldIndex ); @note: added in version 1.4*/
bool simplify( QgsVectorLayer* layer, const QString& shapefileName, double tolerance, \
bool onlySelectedFeatures = false, QProgressDialog* p = 0 );
/** /**Calculate the true centroids, or 'center of mass' for a vector layer and
* Convert multipart features to multiple singlepart features. Creates write it to a new shape file
* simple polygons and lines. @param layer input vector layer
*/ @param shapefileName path to the output shp
bool multipartToSingleparts( QgsVectorLayer* layer, @param fileEncoding encoding of the output file
const QString& shapefileName, @param onlySelectedFeatures if true, only selected features are considered, else all the features
const QString& fileEncoding ); @param p progress dialog (or 0 if no progress dialog is to be shown)
@note: added in version 1.4*/
bool centroids( QgsVectorLayer* layer, const QString& shapefileName, \
bool onlySelectedFeatures = false, QProgressDialog* p = 0 );
/** /**Create a polygon based on the extent of all (selected) features and write it to a new shape file
* Extract nodes from line and polygon vector layers and output them as @param layer input vector layer
* points. @param shapefileName path to the output shp
* */ @param fileEncoding encoding of the output file
bool extractNodes( QgsVectorLayer* layer, @param onlySelectedFeatures if true, only selected features are considered, else all the features
const QString& shapefileName, @param p progress dialog (or 0 if no progress dialog is to be shown)
const QString& fileEncoding ); @note: added in version 1.4*/
bool extent( QgsVectorLayer* layer, const QString& shapefileName, bool onlySelectedFeatures = false, QProgressDialog* p = 0 );
/**
* Convert polygon features to line features. Multipart polygons are
* converted to multiple singlepart lines.
*/
bool polygonsToLines( QgsVectorLayer* layer,
const QString& shapefileName,
const QString& fileEncoding );
/**
* Add vector layer geometry info to point (XCOORD, YCOORD), line (LENGTH),
* or polygon (AREA, PERIMETER) layer.
*/
bool exportGeometryInformation( QgsVectorLayer* layer,
const QString& shapefileName,
const QString& fileEncoding );
/**
* Simplify (generalise) line or polygon vector layers using (a modified)
* Douglas-Peucker algorithm.
*/
bool simplifyGeometry( QgsVectorLayer* layer,
const QString shapefileName,
const QString fileEncoding,
const double tolerance );
/**
* Calculate the true centroids, or 'center of mass' for each polygon in an
* input polygon layer.
*/
bool polygonCentroids( QgsVectorLayer* layer,
const QString& shapefileName,
const QString& fileEncoding );
/**
* Create a polygon based on the extents of all features (or all
* selected features if applicable) and write it out to a shp.
*/
bool layerExtent( QgsVectorLayer* layer,
const QString& shapefileName,
const QString& fileEncoding );
/**Create buffers for a vector layer and write it to a new shape file /**Create buffers for a vector layer and write it to a new shape file
@param layer input vector layer @param layer input vector layer
@ -118,19 +83,45 @@ class ANALYSIS_EXPORT QgsGeometryAnalyzer
bool buffer( QgsVectorLayer* layer, const QString& shapefileName, double bufferDistance, \ bool buffer( QgsVectorLayer* layer, const QString& shapefileName, double bufferDistance, \
bool onlySelectedFeatures = false, bool dissolve = false, int bufferDistanceField = -1, QProgressDialog* p = 0 ); bool onlySelectedFeatures = false, bool dissolve = false, int bufferDistanceField = -1, QProgressDialog* p = 0 );
/**Create convex hull(s) of a vector layer and write it to a new shape file
@param layer input vector layer
@param shapefileName path to the output shp
@param fileEncoding encoding of the output file
@param onlySelectedFeatures if true, only selected features are considered, else all the features
@param uniqueIdField index of the attribute field that contains the unique convex hull id (or -1 if
all features have the same buffer distance)
@param p progress dialog (or 0 if no progress dialog is to be shown)
@note: added in version 1.4*/
bool convexHull( QgsVectorLayer* layer, const QString& shapefileName, bool onlySelectedFeatures = false, \
int uniqueIdField = -1, QProgressDialog* p = 0 );
/**Dissolve a vector layer and write it to a new shape file
@param layer input vector layer
@param shapefileName path to the output shp
@param fileEncoding encoding of the output file
@param onlySelectedFeatures if true, only selected features are considered, else all the features
@param uniqueIdField index of the attribute field that contains the unique id to dissolve on (or -1 if
all features should be dissolved together)
@param p progress dialog (or 0 if no progress dialog is to be shown)
@note: added in version 1.4*/
bool dissolve( QgsVectorLayer* layer, const QString& shapefileName, bool onlySelectedFeatures = false, \
int uniqueIdField = -1, QProgressDialog* p = 0 );
private: private:
QList<double> simpleMeasure( QgsGeometry* geometry ); QList<double> simpleMeasure( QgsGeometry* geometry );
double perimeterMeasure( QgsGeometry* geometry, QgsDistanceArea& measure ); double perimeterMeasure( QgsGeometry* geometry, QgsDistanceArea& measure );
QgsFieldMap checkGeometryFields( QgsVectorLayer* layer, int& index1, int& index2 ); /**Helper function to simplify an individual feature*/
QgsGeometry* extractLines( QgsGeometry* geometry ); void simplifyFeature( QgsFeature& f, QgsVectorFileWriter* vfw, double tolerance );
QgsGeometry* extractAsSingle( QgsGeometry* geometry ); /**Helper function to get the cetroid of an individual feature*/
QgsGeometry* extractAsMulti( QgsGeometry* geometry ); void centroidFeature( QgsFeature& f, QgsVectorFileWriter* vfw );
QgsGeometry* convertGeometry( QgsGeometry* geometry );
QList<QgsPoint> extractPoints( QgsGeometry* geometry );
/**Helper function to buffer an individual feature*/ /**Helper function to buffer an individual feature*/
void bufferFeature( QgsFeature& f, int nProcessedFeatures, QgsVectorFileWriter* vfw, bool dissolve, QgsGeometry** dissolveGeometry, \ void bufferFeature( QgsFeature& f, int nProcessedFeatures, QgsVectorFileWriter* vfw, bool dissolve, QgsGeometry** dissolveGeometry, \
double bufferDistance, int bufferDistanceField ); double bufferDistance, int bufferDistanceField );
/**Helper function to get the convex hull of feature(s)*/
void convexFeature( QgsFeature& f, int nProcessedFeatures, QgsGeometry** dissolveGeometry );
/**Helper function to dissolve feature(s)*/
void dissolveFeature( QgsFeature& f, int nProcessedFeatures, QgsGeometry** dissolveGeometry );
}; };
#endif //QGSVECTORANALYZER #endif //QGSVECTORANALYZER