[DebianGIS-dev] r919 - in packages/openev/trunk: . CVS debian pymod tools
frankie at alioth.debian.org
frankie at alioth.debian.org
Sat Jun 23 22:27:40 UTC 2007
Author: frankie
Date: 2007-06-23 22:27:39 +0000 (Sat, 23 Jun 2007)
New Revision: 919
Added:
packages/openev/trunk/debian/
packages/openev/trunk/debian/README.Debian
packages/openev/trunk/debian/changelog
packages/openev/trunk/debian/compat
packages/openev/trunk/debian/control
packages/openev/trunk/debian/copyright
packages/openev/trunk/debian/libgview-dev.dirs
packages/openev/trunk/debian/libgview-dev.install
packages/openev/trunk/debian/libgview1.dirs
packages/openev/trunk/debian/libgview1.install
packages/openev/trunk/debian/openev-doc.dirs
packages/openev/trunk/debian/openev-doc.doc-base
packages/openev/trunk/debian/openev-doc.docs
packages/openev/trunk/debian/openev-doc.install
packages/openev/trunk/debian/openev.dirs
packages/openev/trunk/debian/openev.in
packages/openev/trunk/debian/openev.install
packages/openev/trunk/debian/openev.menu
packages/openev/trunk/debian/rules
packages/openev/trunk/debian/watch.ex
packages/openev/trunk/pymod/Makefile
packages/openev/trunk/tools/fusion.py
packages/openev/trunk/tools/histoEnhance.py
packages/openev/trunk/tools/maps.dat
packages/openev/trunk/tools/projection.py
packages/openev/trunk/tools/services.txt
packages/openev/trunk/tools/wmstool.py
packages/openev/trunk/version.config
Modified:
packages/openev/trunk/CVS/Entries.Log
packages/openev/trunk/Makefile.in
packages/openev/trunk/configure
packages/openev/trunk/configure.in
packages/openev/trunk/gvshapeslayer.c
packages/openev/trunk/gvviewarea.c
packages/openev/trunk/pymod/Makefile.in
packages/openev/trunk/pymod/filedlg.py
packages/openev/trunk/pymod/gtkmissing.py
packages/openev/trunk/pymod/gvclassification.py
packages/openev/trunk/pymod/gvclassifydlg.py
packages/openev/trunk/pymod/gvhtml.py
packages/openev/trunk/pymod/gview.py
packages/openev/trunk/pymod/gviewapp.py
packages/openev/trunk/pymod/gvlabeledit.py
packages/openev/trunk/pymod/gvlegenddlg.py
packages/openev/trunk/pymod/gvmaptools.py
packages/openev/trunk/pymod/gvogrdlg.py
packages/openev/trunk/pymod/gvogrfsgui.py
packages/openev/trunk/pymod/gvpquerypropdlg.py
packages/openev/trunk/pymod/gvprint.py
packages/openev/trunk/pymod/gvrasterpropdlg.py
packages/openev/trunk/pymod/gvsdsdlg.py
packages/openev/trunk/pymod/gvselbrowser.py
packages/openev/trunk/pymod/gvutils.py
packages/openev/trunk/pymod/gvvectorpropdlg.py
packages/openev/trunk/pymod/gvviewwindow.py
packages/openev/trunk/pymod/ibrowse.py
packages/openev/trunk/pymod/layerdlg.py
packages/openev/trunk/pymod/oe_about.py
packages/openev/trunk/pymod/oeattedit.py
packages/openev/trunk/pymod/openev.py
packages/openev/trunk/pymod/pgu.py
packages/openev/trunk/pymod/pgucolor.py
packages/openev/trunk/pymod/pgucolorsel.py
packages/openev/trunk/pymod/pgucolourswatch.py
packages/openev/trunk/pymod/pgucombo.py
packages/openev/trunk/pymod/pguentry.py
packages/openev/trunk/pymod/pgufilesel.py
packages/openev/trunk/pymod/pgufont.py
packages/openev/trunk/pymod/pgugrid.py
packages/openev/trunk/pymod/pgumenu.py
packages/openev/trunk/pymod/pguprogress.py
packages/openev/trunk/pymod/pgushapesgrid.py
packages/openev/trunk/pymod/pgutextarea.py
packages/openev/trunk/pymod/pgutogglebutton.py
packages/openev/trunk/pymod/pyshell.py
packages/openev/trunk/pymod/testmain.py
packages/openev/trunk/pymod/toolexample.py
packages/openev/trunk/pymod/vecplot.py
packages/openev/trunk/tools/Tool_DriverList.py
packages/openev/trunk/tools/Tool_Export.py
packages/openev/trunk/tools/Tool_ShapesGrid.py
packages/openev/trunk/tools/Tool_autopan.py
packages/openev/trunk/tools/calculator.py
packages/openev/trunk/tools/compose.py
packages/openev/trunk/tools/fft.py
packages/openev/trunk/tools/gvrastertools.py
packages/openev/trunk/tools/imgproctemplate.py
packages/openev/trunk/tools/isodata.py
packages/openev/trunk/tools/mil_symbols.py
packages/openev/trunk/tools/open_raw.py
packages/openev/trunk/tools/open_subarea.py
packages/openev/trunk/tools/rendertest.py
Log:
[svn-inject] Applying Debian modifications to trunk
Modified: packages/openev/trunk/CVS/Entries.Log
===================================================================
--- packages/openev/trunk/CVS/Entries.Log 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/CVS/Entries.Log 2007-06-23 22:27:39 UTC (rev 919)
@@ -7,3 +7,4 @@
A D/symbols////
A D/tools////
A D/xmlconfig////
+A D/openev////
Modified: packages/openev/trunk/Makefile.in
===================================================================
--- packages/openev/trunk/Makefile.in 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/Makefile.in 2007-06-23 22:27:39 UTC (rev 919)
@@ -29,6 +29,7 @@
CFLAGS = $(OPTFLAGS) @C_WFLAGS@ @CFLAGS@
LDFLAGS = @LDFLAGS@
+include version.config
LIBS = $(LDFLAGS) @LIBS@
@@ -36,7 +37,7 @@
INSTALL_LIB = ./install-sh -c
INSTALL_DIR = ./install-sh -d
-default: configure libgv.a gvtest
+default: configure libgview.a libgview.so.$(major).$(minor) gvtest gvtest2
(cd pymod; $(MAKE))
all: default
@@ -44,45 +45,61 @@
%.o : %.c
$(CC) $(CFLAGS) -c $<
-libgv.a: $(OBJ)
+libgview.a: $(OBJ)
rm -f $@
ar cq $@ $(OBJ)
@RANLIB@ $@
-gvtest: testmain.o libgv.a
- $(CXX) -g -o $@ testmain.o libgv.a $(LIBS)
+libgview.so.$(major).$(minor): $(OBJ)
+ $(CC) -shared -Wl,-soname,libgview.so.$(major) $(OBJ) -lgtk -lgtkgl -lgdal -lGL -o $@
+ ln -sf $@ libgview.so.$(major)
+ ln -sf $@ libgview.so
+gvtest: testmain.o libgview.a
+ $(CC) -g -o $@ testmain.o libgview.a $(LIBS)
+
+gvtest2: testmain.o libgview.so
+ $(CC) -g -o $@ testmain.o -L. -lgview $(LIBS)
+
clean:
- rm -f gvtest *.o *.so *.a
+ rm -f gvtest gvtest2 *.o *.so* *.a gv_config.h
(cd pymod; $(MAKE) clean)
distclean: dist-clean
dist-clean: clean
- rm Makefile config.log config.cache config.status
+ rm -f Makefile config.log config.cache config.status
configure: configure.in
-autoconf
-install:
+install: all
$(INSTALL_DIR) $(INST_PREFIX)/bin
+ $(INSTALL_DIR) $(INST_PREFIX)/lib
$(INSTALL_DIR) $(INST_PREFIX)/ramps
$(INSTALL_DIR) $(INST_PREFIX)/tools
$(INSTALL_DIR) $(INST_PREFIX)/pymod
- $(INSTALL_DIR) $(INST_PREFIX)/html
+ $(INSTALL_DIR) $(INST_PREFIX)/html/developer_info
$(INSTALL_DIR) $(INST_PREFIX)/pics
$(INSTALL_DIR) $(INST_PREFIX)/symbols
$(INSTALL_DIR) $(INST_PREFIX)/xmlconfig
$(INSTALL) gvtest $(INST_PREFIX)/bin
+ $(INSTALL) gvtest2 $(INST_PREFIX)/bin
$(INSTALL_LIB) pymod/_gvmodule.so $(INST_PREFIX)/pymod
$(INSTALL_LIB) pymod/_gtkmissing.so $(INST_PREFIX)/pymod
+ cp -P libgview.* $(INST_PREFIX)/lib
+ $(INSTALL_LIB) libgview.a $(INST_PREFIX)/lib
+ -$(INSTALL_LIB) libgview.la $(INST_PREFIX)/lib
+ $(INSTALL_LIB) libgview.so.$(major).$(minor) $(INST_PREFIX)/lib
cp pymod/*.py $(INST_PREFIX)/pymod
cp pymod/*.so $(INST_PREFIX)/pymod
chmod a+x $(INST_PREFIX)/pymod/openev.py
chmod a+x $(INST_PREFIX)/pymod/ibrowse.py
chmod a+x $(INST_PREFIX)/pymod/gvplot.py
cp tools/*.* $(INST_PREFIX)/tools
+ cp pics/*.* $(INST_PREFIX)/pics
cp ramps/*.* $(INST_PREFIX)/ramps
cp html/*.* $(INST_PREFIX)/html
+ cp html/developer_info/*.* $(INST_PREFIX)/html/developer_info
cp symbols/*.* $(INST_PREFIX)/symbols
cp xmlconfig/*.* $(INST_PREFIX)/xmlconfig
Modified: packages/openev/trunk/configure
===================================================================
--- packages/openev/trunk/configure 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/configure 2007-06-23 22:27:39 UTC (rev 919)
@@ -965,7 +965,7 @@
else
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi
- cd $ac_popdir
+ cd "$ac_popdir"
done
fi
@@ -1883,8 +1883,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -1942,8 +1941,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2059,8 +2057,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2114,8 +2111,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2160,8 +2156,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2205,8 +2200,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2390,8 +2384,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2449,8 +2442,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2521,8 +2513,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2566,8 +2557,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_cxx_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2726,8 +2716,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3045,8 +3034,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3216,8 +3204,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3289,8 +3276,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3441,8 +3427,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3484,8 +3469,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3542,8 +3526,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3705,8 +3688,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3800,8 +3782,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4344,8 +4325,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4458,8 +4438,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4517,8 +4496,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4576,8 +4554,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4654,8 +4631,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4776,8 +4752,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4849,8 +4824,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4923,8 +4897,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5028,8 +5001,7 @@
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag"
- || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5213,7 +5185,7 @@
if test "$with_render_plugin" == "yes" ; then
# Will enable g_module_* code.
CFLAGS="$CFLAGS -malign-double -fPIC -DGV_USE_RENDER_PLUGIN"
- # This is needed to access stuff inside libgv.a from the plugin.
+ # This is needed to access stuff inside libgview.a from the plugin.
LDFLAGS="$LDFLAGS -rdynamic"
echo "$as_me:$LINENO: result: yes" >&5
@@ -6082,11 +6054,6 @@
- if test x"$ac_file" != x-; then
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
- rm -f "$ac_file"
- fi
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
@@ -6125,6 +6092,12 @@
fi;;
esac
done` || { (exit 1); exit 1; }
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
sed "$ac_vpsub
Modified: packages/openev/trunk/configure.in
===================================================================
--- packages/openev/trunk/configure.in 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/configure.in 2007-06-23 22:27:39 UTC (rev 919)
@@ -165,7 +165,7 @@
if test "$with_render_plugin" == "yes" ; then
# Will enable g_module_* code.
CFLAGS="$CFLAGS -malign-double -fPIC -DGV_USE_RENDER_PLUGIN"
- # This is needed to access stuff inside libgv.a from the plugin.
+ # This is needed to access stuff inside libgview.a from the plugin.
LDFLAGS="$LDFLAGS -rdynamic"
AC_MSG_RESULT([yes])
Added: packages/openev/trunk/debian/README.Debian
===================================================================
--- packages/openev/trunk/debian/README.Debian (rev 0)
+++ packages/openev/trunk/debian/README.Debian 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,33 @@
+openev for Debian
+-----------------
+
+this is my first attempt to make a python package.
+the upstream source files are not available for direct download.
+i have downloaded them from cvs (see later).
+
+in addition, there are a few tools by Mario Beauchamp (starged at videotron.ca)
+downloadable from http://pages.infinit.net/starged/openev, specifically:
+* a wms client to access wms services, documented at
+ http://pages.infinit.net/starged/openev/wmstool/home.htm
+* a fusion tool for pansharpening, pan merging of panchromatic and RGB images.
+* Image enhancement (AKA contrast stretching, scaling) using histograms
+ and statistical analysis.
+ see http://pages.infinit.net/starged/openev/histogram/home.htm
+* an Early version of a raster reprojection utility.
+
+to get the source, run the following:
+mkdir openev-cvs
+cd openev-cvs
+cvs -d:pserver:anonymous at cvs.sourceforge.net:/cvsroot/openev login
+cvs -z3 -d:pserver:anonymous at cvs.sourceforge.net:/cvsroot/openev co openev
+
+#in addition, please download newer versions of the following:
+http://pages.infinit.net/starged/openev/wmstool/wmstool.py
+http://pages.infinit.net/starged/openev/wmstool/maps.dat
+http://pages.infinit.net/starged/openev/wmstool/services.txt
+http://pages.infinit.net/starged/openev/fusion.py
+http://pages.infinit.net/starged/openev/histogram/histoEnhance.py
+http://pages.infinit.net/starged/openev/projection.py
+these files should go into tools/*
+
+ -- Alex Bodnaru <alexbodn at 012.net.il>, Thu, 20 Oct 2005 00:51:18 +0200
Added: packages/openev/trunk/debian/changelog
===================================================================
--- packages/openev/trunk/debian/changelog (rev 0)
+++ packages/openev/trunk/debian/changelog 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,6 @@
+openev (1.9.0-cvs20051112-1) unstable; urgency=low
+
+ * Initial release Closes: #291562
+
+ -- Alex Bodnaru <alexbodn at 012.net.il> Thu, 20 Oct 2005 00:51:18 +0200
+
Added: packages/openev/trunk/debian/compat
===================================================================
--- packages/openev/trunk/debian/compat (rev 0)
+++ packages/openev/trunk/debian/compat 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+4
Added: packages/openev/trunk/debian/control
===================================================================
--- packages/openev/trunk/debian/control (rev 0)
+++ packages/openev/trunk/debian/control 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,48 @@
+Source: openev
+Section: science
+Priority: optional
+Maintainer: Alex Bodnaru <alexbodn at 012.net.il>
+Build-Depends: debhelper (>= 4.0.0), autotools-dev, python, python-gtk-1.2, python-gdal, gtkglarea5-dev, libgdal1-dev, findutils
+Standards-Version: 3.6.2
+
+Package: openev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, python, python-numeric, python-numeric-ext, python-gdal, proj (>= 4.0.0), python-gtk-1.2, python-gtkextra
+Recommends: openev-doc (= ${Source-Version})
+Description: Application for viewing and analysing geospatial data
+ OpenEV is a library, and reference application for viewing and analysing
+ raster and vector geospatial data.
+ Objectives
+ * Run on popular platforms (Linux, Windows, Solaris, IRIX).
+ * Handle raster and vector data.
+ * Support 2d and 3d display.
+ * Gracefully handle very large (gigabyte) raster datasets.
+ * Support multi-channel, and complex raster datasets.
+ * Understand and interpret georeferencing information, and provide on-the-fly
+ reprojection of datasets.
+ * Provide view manipulation functions (pan, zoom, rotate) at interactive frame
+ rates.
+ * Provide a powerful image analysis tool.
+ * Serve as a component in a variety of image analysis applications.
+
+Package: libgview-dev
+Section: libdevel
+Architecture: any
+Depends: libgview1 (= ${Source-Version})
+Description: Library for analysing geospatial data. static libs and headers
+ libgview is a library, and reference application (openev) for viewing
+ and analysing raster and vector geospatial data.
+
+Package: libgview1
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, xlibmesa-gl
+Description: Library for viewing and analysing geospatial data
+ libgview is a library, and reference application (openev) for viewing
+ and analysing raster and vector geospatial data.
+
+Package: openev-doc
+Architecture: all
+Description: Application for analysing geospatial data. Documentation
+ OpenEV is a library, and reference application for viewing and analysing
+ raster and vector geospatial data.
Added: packages/openev/trunk/debian/copyright
===================================================================
--- packages/openev/trunk/debian/copyright (rev 0)
+++ packages/openev/trunk/debian/copyright 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,10 @@
+This package was debianized by Alex Bodnaru <alexbodn at 012.net.il> on
+Thu, 20 Oct 2005 00:51:18 +0200.
+
+It was downloaded from http://openev.sourceforge.net
+
+Upstream Authors: See documentation and site.
+
+This code is released under the terms of the GNU Lesser GENERAL PUBLIC LICENSE.
+On Debian GNU/Linux systems, the complete text of the GNU Lesser General
+Public License can be found in `/usr/share/common-licenses/LGPL'.
Added: packages/openev/trunk/debian/libgview-dev.dirs
===================================================================
--- packages/openev/trunk/debian/libgview-dev.dirs (rev 0)
+++ packages/openev/trunk/debian/libgview-dev.dirs 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+usr/lib
+usr/include
Added: packages/openev/trunk/debian/libgview-dev.install
===================================================================
--- packages/openev/trunk/debian/libgview-dev.install (rev 0)
+++ packages/openev/trunk/debian/libgview-dev.install 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,3 @@
+usr/lib/libgview.*a
+usr/lib/libgview.so
+usr/include/*
Added: packages/openev/trunk/debian/libgview1.dirs
===================================================================
--- packages/openev/trunk/debian/libgview1.dirs (rev 0)
+++ packages/openev/trunk/debian/libgview1.dirs 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/lib
Added: packages/openev/trunk/debian/libgview1.install
===================================================================
--- packages/openev/trunk/debian/libgview1.install (rev 0)
+++ packages/openev/trunk/debian/libgview1.install 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/lib/libgview.so.*
Added: packages/openev/trunk/debian/openev-doc.dirs
===================================================================
--- packages/openev/trunk/debian/openev-doc.dirs (rev 0)
+++ packages/openev/trunk/debian/openev-doc.dirs 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/share/doc/openev-doc/html
Added: packages/openev/trunk/debian/openev-doc.doc-base
===================================================================
--- packages/openev/trunk/debian/openev-doc.doc-base (rev 0)
+++ packages/openev/trunk/debian/openev-doc.doc-base 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,11 @@
+Document: openev
+Title: Debian openev Manual
+Author: <insert document author here>
+Abstract: This manual describes what openev is
+ and how it can be used to
+ manage online manuals on Debian systems.
+Section: unknown
+
+Format: HTML
+Index: /usr/share/doc/openev-doc/html/openevmain.html
+Files: /usr/share/doc/openev-doc/html/*.html
Added: packages/openev/trunk/debian/openev-doc.docs
===================================================================
--- packages/openev/trunk/debian/openev-doc.docs (rev 0)
+++ packages/openev/trunk/debian/openev-doc.docs 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,3 @@
+TODO
+debian/README.Debian
+ChangeLog
Added: packages/openev/trunk/debian/openev-doc.install
===================================================================
--- packages/openev/trunk/debian/openev-doc.install (rev 0)
+++ packages/openev/trunk/debian/openev-doc.install 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/share/doc/openev-doc/html/*
Added: packages/openev/trunk/debian/openev.dirs
===================================================================
--- packages/openev/trunk/debian/openev.dirs (rev 0)
+++ packages/openev/trunk/debian/openev.dirs 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+usr/share/openev
+usr/bin
Added: packages/openev/trunk/debian/openev.in
===================================================================
--- packages/openev/trunk/debian/openev.in (rev 0)
+++ packages/openev/trunk/debian/openev.in 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+OPENEVHOME=/usr/share/openev
+
+if [ ! -d $HOME/openev ]; then
+ mkdir $HOME/openev
+ cd $HOME/openev
+ for DIR in html pics pymod ramps tools symbols ; do
+ if [ ! -d $DIR -a ! -h $DIR ]; then
+ ln -s $OPENEVHOME/$DIR $DIR
+ fi
+ done
+else
+ cd $HOME/openev
+fi
+for DIR in xmlconfig ; do
+ if [ ! -d $DIR -a ! -h $DIR ]; then
+ cp -r $OPENEVHOME/$DIR $HOME/openev/$DIR
+ fi
+done
+
+OPENEVHOME=${HOME}/openev
+PYTHONPATH=${OPENEVHOME}/pymod:${PYTHONPATH}
+export OPENEVHOME PYTHONPATH
+
+if [ ! -d ${OPENEVHOME}/wms/services -a ! -h ${OPENEVHOME}/wms/services ]; then
+ if [ ! -d ${OPENEVHOME}/wms -a ! -h ${OPENEVHOME}/wms ]; then
+ mkdir ${OPENEVHOME}/wms
+ fi
+ cd ${OPENEVHOME}/wms
+ for file in services.txt maps.dat ; do
+ if [ ! -f $file -a ! -h $file ]; then
+ cat ../tools/$file | awk '{gsub("\r", ""); print;}' > $file
+ fi
+ done
+ if [ -f services.txt -o -h services.txt ]; then
+ PYTHONPATH=${OPENEVHOME}/tools:${PYTHONPATH} python ../tools/wmstool.py services.txt
+ else
+ echo "services.txt not found in ${OPENEVHOME}/wms, nor in ${OPENEVHOME}/tools"
+ fi
+fi
+
+cd ${OPENEVHOME}
+pymod/openev.py "$@"
Added: packages/openev/trunk/debian/openev.install
===================================================================
--- packages/openev/trunk/debian/openev.install (rev 0)
+++ packages/openev/trunk/debian/openev.install 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+usr/share/openev/*
+usr/bin/openev
Added: packages/openev/trunk/debian/openev.menu
===================================================================
--- packages/openev/trunk/debian/openev.menu (rev 0)
+++ packages/openev/trunk/debian/openev.menu 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+?package(openev):needs="X11" section="Apps"\
+ title="OpenEv" command="/usr/bin/openev"
Added: packages/openev/trunk/debian/rules
===================================================================
--- packages/openev/trunk/debian/rules (rev 0)
+++ packages/openev/trunk/debian/rules 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,177 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+#
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+#
+# Modified to make a template file for a multi-binary package with separated
+# build-arch and build-indep targets by Bill Allombert 2001
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This has to be exported to make some magic below work.
+export DH_OPTIONS
+
+include version.config
+
+prefix=/usr
+
+version=$(major).$(minor).$(micro)
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+DESTDIR=$(CURDIR)/debian/tmp
+OPENEVHOME=usr/share/openev
+AWK_INC_GVIEW=\
+{\
+ if ($$1=="\#include")\
+ {\
+ gsub("\"","",$$2); $$2="<gview/" $$2 ">";\
+ }\
+ else if ($$1=="\#" && $$2=="include")\
+ {\
+ gsub("\"","",$$3); $$3="<gview/" $$3 ">";\
+ }\
+ print;\
+}
+CURDIR:=`pwd`
+
+CFLAGS = -Wall -g
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+config.status: configure
+ dh_testdir
+ # Add here commands to configure the package.
+ #CFLAGS="$(CFLAGS) -Wl,-z,defs"
+ autoconf2.50
+ CFLAGS=-DATLANTIS_BUILD ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --with-render-plugin=no --prefix=$(prefix) --mandir=$(prefix)/share/man --infodir=$(prefix)/share/info --with-ogr --with-gdal=$(prefix) #--with-double-geocoord
+
+#Architecture
+build: build-arch build-indep
+
+build-arch: build-arch-stamp
+build-arch-stamp: config.status
+
+ # Add here commands to compile the arch part of the package.
+ $(MAKE)
+ touch build-arch-stamp
+
+build-indep: build-indep-stamp
+build-indep-stamp: config.status
+
+ # Add here commands to compile the indep part of the package.
+# #making doc needs transfig and latex2html (huge and non-free)
+# $(MAKE) -C doc html
+ touch build-indep-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
+
+ # Add here commands to clean up after the build process.
+ -$(MAKE) distclean
+#ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+# cp -f /usr/share/misc/config.sub config.sub
+#endif
+#ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+# cp -f /usr/share/misc/config.guess config.guess
+#endif
+ dh_clean
+
+install: install-indep install-arch
+
+# Must not depend on anything. This is to be called by
+# install-arch/install-indep
+# in another 'make' thread.
+install-common:
+ # Add here commands to install the files of the package into debian/tmp.
+ $(MAKE) install INST_PREFIX=$(DESTDIR)/$(OPENEVHOME)
+ mkdir -p $(DESTDIR)/usr
+ mv $(DESTDIR)/$(OPENEVHOME)/bin/ $(DESTDIR)/usr
+ install --mode=755 debian/openev.in $(DESTDIR)/usr/bin/openev
+ mv $(DESTDIR)/$(OPENEVHOME)/lib/ $(DESTDIR)/usr
+ mkdir -p $(DESTDIR)/usr/include/gview
+ cp *.h $(DESTDIR)/usr/include/gview
+ rm -f $(DESTDIR)/usr/include/gview/gview.h
+ cat gview.h | awk '$(AWK_INC_GVIEW)' > $(DESTDIR)/usr/include/gview.h
+ mkdir -p $(DESTDIR)/usr/share/doc/openev-doc
+ mv $(DESTDIR)/$(OPENEVHOME)/html/ $(DESTDIR)/usr/share/doc/openev-doc
+ ln -sf /usr/share/doc/openev-doc/html $(DESTDIR)/$(OPENEVHOME)
+
+install-indep: build-indep
+ dh_testdir
+ dh_testroot
+ dh_clean -k -i
+ $(MAKE) -f debian/rules DH_OPTIONS=-a install-common
+ dh_installdirs -i
+
+ # Add here commands to install the indep part of the package into
+ # debian/<package>-doc.
+ #INSTALLDOC#
+
+ dh_install -i --sourcedir=$(CURDIR)/debian/tmp
+
+install-arch: build-arch
+ dh_testdir
+ dh_testroot
+ dh_clean -k -s
+ $(MAKE) -f debian/rules DH_OPTIONS=-a install-common
+ dh_installdirs -s
+
+ dh_install -s --sourcedir=$(CURDIR)/debian/tmp
+# Must not depend on anything. This is to be called by
+# binary-arch/binary-indep
+# in another 'make' thread.
+binary-common:
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs
+ dh_installdocs
+# dh_installexamples
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installemacsen
+# dh_installpam
+# dh_installmime
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+# dh_installman
+ dh_link
+ dh_strip
+ dh_compress -Xhtml
+ dh_fixperms
+# dh_perl
+# dh_python
+ dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+# Build architecture independant packages using the common target.
+binary-indep: build-indep install-indep
+ $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
+
+# Build architecture dependant packages using the common target.
+binary-arch: build-arch install-arch
+ $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
+
+binary: binary-arch binary-indep
+ find debian -name CVS -exec rm -d '{}' ';'
+
+.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch
Property changes on: packages/openev/trunk/debian/rules
___________________________________________________________________
Name: svn:executable
+ *
Added: packages/openev/trunk/debian/watch.ex
===================================================================
--- packages/openev/trunk/debian/watch.ex (rev 0)
+++ packages/openev/trunk/debian/watch.ex 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,9 @@
+# Example watch control file for uscan
+# Rename this file to "watch" and then you can run the "uscan" command
+# to check for upstream updates and more.
+# See uscan(1) for format
+
+# Compulsory line, this is a version 3 file
+version=3
+
+#see README.Debian for details on getting upstream source.
Modified: packages/openev/trunk/gvshapeslayer.c
===================================================================
--- packages/openev/trunk/gvshapeslayer.c 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/gvshapeslayer.c 2007-06-23 22:27:39 UTC (rev 919)
@@ -504,6 +504,7 @@
{
gvgeocoord x_offset; /* for shadow and halo effects */
gvgeocoord y_offset;
+
/* -------------------------------------------------------------------- */
/* Apply any offsets. */
/* -------------------------------------------------------------------- */
@@ -1885,7 +1886,6 @@
if (bAntialiased)
glEnable( GL_LINE_SMOOTH );
-
/* -------------------------------------------------------------------- */
/* Draw all shapes that are not scale dependent, potentially */
/* using a display list. */
Modified: packages/openev/trunk/gvviewarea.c
===================================================================
--- packages/openev/trunk/gvviewarea.c 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/gvviewarea.c 2007-06-23 22:27:39 UTC (rev 919)
@@ -1582,11 +1582,13 @@
{
gint font;
GvBMFontInfo new_finfo;
+ gchar *name1 = name;
+ name = bmfontmap[0].gvname;
/* translate aliases */
for (font=0; bmfontmap[font].gvname != NULL; font++)
{
- if (strcmp(name, bmfontmap[font].gvname) == 0)
+ if (strcmp(name1, bmfontmap[font].gvname) == 0)
{
name = bmfontmap[font].gdkname;
break;
@@ -1610,7 +1612,7 @@
return -1;
}
- new_finfo.listbase = glGenLists(96);
+ new_finfo.listbase = glGenLists(127);
if (new_finfo.listbase == 0)
{
g_warning("gv_view_area_bmfont_load(): font allocation failed");
@@ -1652,7 +1654,7 @@
{
GvBMFontInfo *finfo;
- if (font < 0 || font >= view->bmfonts->len )
+ if (text == NULL || font < 0 || font >= view->bmfonts->len )
return;
finfo = &(g_array_index( view->bmfonts, GvBMFontInfo, font ));
Added: packages/openev/trunk/pymod/Makefile
===================================================================
--- packages/openev/trunk/pymod/Makefile (rev 0)
+++ packages/openev/trunk/pymod/Makefile 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,44 @@
+all: _gvmodule.so _gtkmissing.so
+
+CC = i486-linux-gnu-gcc
+CXX = i486-linux-gnu-g++
+
+OPTFLAGS = -O2 -g
+CFLAGS = $(OPTFLAGS) -Wall -I.. -I/usr/ogr/ogrsf_frmts -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -D_REENTRANT -DATLANTIS_BUILD -I/usr/local/include -I/usr/include/python2.3 -I/usr/include/python2.3
+
+LIBS = -lgdal -L/usr/lib -lgtkgl -lGLU -lGL -L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lgthread -lglib -lpthread -ldl -lXi -lXext -lX11 -lm -ldl -L/usr/local/lib -L.. -lgview
+
+PYLINK = -o $@
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $<
+
+gvmodule.o: gvmodule.c gvmodule_impl.c gv_ciet.c
+
+_gvmodule.so: gvmodule.o
+ $(CC) -shared -o $@ $^ $(LIBS)
+
+_gtkmissing.so: gtkmissing.o
+ $(CC) -shared -o $@ $^ $(LIBS)
+
+gvmodule_impl.c: gv.defs mkgv.py
+ python mkgv.py
+
+clean:
+ rm -f *.o gvmodule_*.c *.so *.pyc
+
+doc:
+ @if test \! -d html ; then \
+ mkdir html; \
+ else \
+ rm -f html/*; \
+ fi
+ pythondoc -f HTML4 -i -d html _gv gview gvbitlayerlut
+
+install-doc: doc
+ @if test -d ~/wwwgv/gv_python ; then \
+ cp html/* ~/wwwgv/gv_python; \
+ echo cp html/* ~/wwwgv/gv_python; \
+ else \
+ echo "~/wwwgv/gv_python doesn't exist ... install fails."; \
+ fi
Modified: packages/openev/trunk/pymod/Makefile.in
===================================================================
--- packages/openev/trunk/pymod/Makefile.in 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/Makefile.in 2007-06-23 22:27:39 UTC (rev 919)
@@ -6,7 +6,7 @@
OPTFLAGS = @OPTFLAGS@
CFLAGS = $(OPTFLAGS) @C_WFLAGS@ -I.. @CFLAGS@ @PYTHON_INCLUDES@
-LIBS = @LDFLAGS@ @LIBS@
+LIBS = @LDFLAGS@ @LIBS@ -L.. -lgview
PYLINK = @PYTHON_LINK@
@@ -15,11 +15,11 @@
gvmodule.o: gvmodule.c gvmodule_impl.c gv_ciet.c
-_gvmodule.so: gvmodule.o ../libgv.a
- $(CXX) -shared -o $@ $^ $(LIBS)
+_gvmodule.so: gvmodule.o
+ $(CC) -shared -o $@ $^ $(LIBS)
_gtkmissing.so: gtkmissing.o
- $(CXX) -shared -o $@ $^ $(LIBS)
+ $(CC) -shared -o $@ $^ $(LIBS)
gvmodule_impl.c: gv.defs mkgv.py
python mkgv.py
Modified: packages/openev/trunk/pymod/filedlg.py
===================================================================
--- packages/openev/trunk/pymod/filedlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/filedlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -185,6 +185,12 @@
#
import os
+
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import TRUE, FALSE
from gvsignaler import Signaler
Modified: packages/openev/trunk/pymod/gtkmissing.py
===================================================================
--- packages/openev/trunk/pymod/gtkmissing.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gtkmissing.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -1,3 +1,8 @@
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk; _gtk = gtk; del gtk
import _gtkmissing
import _gv
Modified: packages/openev/trunk/pymod/gvclassification.py
===================================================================
--- packages/openev/trunk/pymod/gvclassification.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvclassification.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -792,7 +792,6 @@
class_id = class_id + 1
-
###########################################################################
def set_title(self, title):
"""Set new title (for Legend)
Modified: packages/openev/trunk/pymod/gvclassifydlg.py
===================================================================
--- packages/openev/trunk/pymod/gvclassifydlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvclassifydlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -128,6 +128,11 @@
import gview
import gvutils
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import GDK
from gvsignaler import Signaler
@@ -770,7 +775,8 @@
def apply_ramp_cb(self, n, color):
self.classification.set_color(n, color)
- self.color_buttons[n].set_color(color)
+ if len(self.color_buttons) > n:
+ self.color_buttons[n].set_color(color)
def apply_ramp(self, ramp, *args):
ramp.apply_ramp(self.apply_ramp_cb, self.classification.count)
Modified: packages/openev/trunk/pymod/gvhtml.py
===================================================================
--- packages/openev/trunk/pymod/gvhtml.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvhtml.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -73,6 +73,11 @@
import os.path
import string
import _gv
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import GDK
import gview
Modified: packages/openev/trunk/pymod/gview.py
===================================================================
--- packages/openev/trunk/pymod/gview.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gview.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -310,6 +310,11 @@
# added get_height and build_skirt on GvRasterLayer
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk; _gtk = gtk; del gtk
import _gtkmissing
import _gv
Modified: packages/openev/trunk/pymod/gviewapp.py
===================================================================
--- packages/openev/trunk/pymod/gviewapp.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gviewapp.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -130,6 +130,11 @@
#
from gvsignaler import Signaler
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import FALSE, TRUE
from GDK import *
Modified: packages/openev/trunk/pymod/gvlabeledit.py
===================================================================
--- packages/openev/trunk/pymod/gvlabeledit.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvlabeledit.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -52,6 +52,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
import string
Modified: packages/openev/trunk/pymod/gvlegenddlg.py
===================================================================
--- packages/openev/trunk/pymod/gvlegenddlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvlegenddlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -93,6 +93,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
import gvclassification
Modified: packages/openev/trunk/pymod/gvmaptools.py
===================================================================
--- packages/openev/trunk/pymod/gvmaptools.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvmaptools.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -39,6 +39,11 @@
import gview
import Numeric
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import os
import gvogrfs
Modified: packages/openev/trunk/pymod/gvogrdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvogrdlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvogrdlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -45,6 +45,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
import os.path
Modified: packages/openev/trunk/pymod/gvogrfsgui.py
===================================================================
--- packages/openev/trunk/pymod/gvogrfsgui.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvogrfsgui.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -46,6 +46,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from string import *
from gvsignaler import *
@@ -160,6 +165,7 @@
table.attach(self.field_label, 0, 1, 0, 1,
xoptions=SHRINK, yoptions=SHRINK)
self.label_field = pgucombo.pguCombo()
+
self.label_field.set_popdown_strings( fnlist )
self.label_field.entry.connect('changed', self.label_change_cb)
table.attach(self.label_field, 1, 3, 0, 1,
Modified: packages/openev/trunk/pymod/gvpquerypropdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvpquerypropdlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvpquerypropdlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -47,6 +47,11 @@
# added standard headers
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from string import *
Modified: packages/openev/trunk/pymod/gvprint.py
===================================================================
--- packages/openev/trunk/pymod/gvprint.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvprint.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -73,6 +73,11 @@
# added standard headers
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from gvconst import *
Modified: packages/openev/trunk/pymod/gvrasterpropdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvrasterpropdlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvrasterpropdlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -124,6 +124,11 @@
# don't show scaling min for complex layers
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from string import *
import gvutils
Modified: packages/openev/trunk/pymod/gvsdsdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvsdsdlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvsdsdlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -42,6 +42,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
import os.path
Modified: packages/openev/trunk/pymod/gvselbrowser.py
===================================================================
--- packages/openev/trunk/pymod/gvselbrowser.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvselbrowser.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -40,6 +40,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from string import *
from gvsignaler import *
Modified: packages/openev/trunk/pymod/gvutils.py
===================================================================
--- packages/openev/trunk/pymod/gvutils.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvutils.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -118,6 +118,11 @@
# added standard headers
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk; _gtk = gtk; del gtk
import GtkExtra
import string
Modified: packages/openev/trunk/pymod/gvvectorpropdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvvectorpropdlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvvectorpropdlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
# added standard headers
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from string import *
import gvutils
Modified: packages/openev/trunk/pymod/gvviewwindow.py
===================================================================
--- packages/openev/trunk/pymod/gvviewwindow.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvviewwindow.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -103,6 +103,11 @@
# Fix goto dialog for raw layer case with row/col coordinates.
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import FALSE, TRUE
from GDK import *
Modified: packages/openev/trunk/pymod/ibrowse.py
===================================================================
--- packages/openev/trunk/pymod/ibrowse.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/ibrowse.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -2,6 +2,11 @@
import gviewapp
import gview
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import FALSE, TRUE
import GDK
Modified: packages/openev/trunk/pymod/layerdlg.py
===================================================================
--- packages/openev/trunk/pymod/layerdlg.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/layerdlg.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -92,6 +92,11 @@
# added standard headers
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
import os.path
Modified: packages/openev/trunk/pymod/oe_about.py
===================================================================
--- packages/openev/trunk/pymod/oe_about.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/oe_about.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -32,6 +32,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import FALSE, TRUE
from GDK import *
Modified: packages/openev/trunk/pymod/oeattedit.py
===================================================================
--- packages/openev/trunk/pymod/oeattedit.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/oeattedit.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
import string
Modified: packages/openev/trunk/pymod/openev.py
===================================================================
--- packages/openev/trunk/pymod/openev.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/openev.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -79,6 +79,11 @@
import gviewapp
import gview
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import sys
import os
Modified: packages/openev/trunk/pymod/pgu.py
===================================================================
--- packages/openev/trunk/pymod/pgu.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgu.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk; _gtk = gtk; del gtk
from string import *
Modified: packages/openev/trunk/pymod/pgucolor.py
===================================================================
--- packages/openev/trunk/pymod/pgucolor.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucolor.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -68,6 +68,11 @@
MIN_COLOR=0
MAX_COLOR = 65535
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import TRUE, FALSE
import GDK
Modified: packages/openev/trunk/pymod/pgucolorsel.py
===================================================================
--- packages/openev/trunk/pymod/pgucolorsel.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucolorsel.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from string import *
import pgu
Modified: packages/openev/trunk/pymod/pgucolourswatch.py
===================================================================
--- packages/openev/trunk/pymod/pgucolourswatch.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucolourswatch.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -39,6 +39,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gvsignaler import Signaler
Modified: packages/openev/trunk/pymod/pgucombo.py
===================================================================
--- packages/openev/trunk/pymod/pgucombo.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucombo.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -49,6 +49,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
try:
from pygtkextra import GtkComboBox
Modified: packages/openev/trunk/pymod/pguentry.py
===================================================================
--- packages/openev/trunk/pymod/pguentry.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pguentry.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -1,3 +1,8 @@
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
class pguEntry( gtk.GtkEntry ):
Modified: packages/openev/trunk/pymod/pgufilesel.py
===================================================================
--- packages/openev/trunk/pymod/pgufilesel.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgufilesel.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk; _gtk = gtk; del gtk
from string import *
import os.path
Modified: packages/openev/trunk/pymod/pgufont.py
===================================================================
--- packages/openev/trunk/pymod/pgufont.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgufont.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -40,6 +40,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import TRUE, FALSE
import gview
Modified: packages/openev/trunk/pymod/pgugrid.py
===================================================================
--- packages/openev/trunk/pymod/pgugrid.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgugrid.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -128,6 +128,11 @@
# THIS SHOULD BE REVISITED IF OPENEV IS UPGRADED TO GTK2, AS GTK2 MAY
# NOT SUFFER THESE PROBLEMS.
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import gvsignaler
import Numeric
Modified: packages/openev/trunk/pymod/pgumenu.py
===================================================================
--- packages/openev/trunk/pymod/pgumenu.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgumenu.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -37,6 +37,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import TRUE, FALSE
import string
Modified: packages/openev/trunk/pymod/pguprogress.py
===================================================================
--- packages/openev/trunk/pymod/pguprogress.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pguprogress.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -31,6 +31,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
class PGUProgressDialog(GtkDialog):
Modified: packages/openev/trunk/pymod/pgushapesgrid.py
===================================================================
--- packages/openev/trunk/pymod/pgushapesgrid.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgushapesgrid.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
"""
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk,GDK
import gview
import Numeric
Modified: packages/openev/trunk/pymod/pgutextarea.py
===================================================================
--- packages/openev/trunk/pymod/pgutextarea.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgutextarea.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -82,6 +82,11 @@
documentation ;)
"""
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
class pguTextArea( gtk.GtkTable ):
Modified: packages/openev/trunk/pymod/pgutogglebutton.py
===================================================================
--- packages/openev/trunk/pymod/pgutogglebutton.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgutogglebutton.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
# new file
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
from gtk import TRUE, FALSE
import gview
Modified: packages/openev/trunk/pymod/pyshell.py
===================================================================
--- packages/openev/trunk/pymod/pyshell.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pyshell.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -79,6 +79,11 @@
MAX_COMMAND_PATHS = 15
MAX_MODULE_PATHS = 15
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import GtkExtra, GDK
import code, string, sys, os
Modified: packages/openev/trunk/pymod/testmain.py
===================================================================
--- packages/openev/trunk/pymod/testmain.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/testmain.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -1,4 +1,9 @@
#!/usr/bin/env python
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk, gtkmissing, gview
import layerdlg
Modified: packages/openev/trunk/pymod/toolexample.py
===================================================================
--- packages/openev/trunk/pymod/toolexample.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/toolexample.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -5,6 +5,11 @@
# roi and poi tools, a layer manager, and view manager.
import gviewapp
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import os
import gdal, gdalnumeric
Modified: packages/openev/trunk/pymod/vecplot.py
===================================================================
--- packages/openev/trunk/pymod/vecplot.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/vecplot.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -99,6 +99,11 @@
import gview
import Numeric
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import GtkExtra
import os
Modified: packages/openev/trunk/tools/Tool_DriverList.py
===================================================================
--- packages/openev/trunk/tools/Tool_DriverList.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_DriverList.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -36,6 +36,11 @@
import gviewapp
import gdal
import gvhtml
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
class ToolDriverList(gviewapp.Tool_GViewApp):
Modified: packages/openev/trunk/tools/Tool_Export.py
===================================================================
--- packages/openev/trunk/tools/Tool_Export.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_Export.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -49,6 +49,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import gview, gdal, gdalconst, layerdlg, gvutils
import GtkExtra
Modified: packages/openev/trunk/tools/Tool_ShapesGrid.py
===================================================================
--- packages/openev/trunk/tools/Tool_ShapesGrid.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_ShapesGrid.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -48,6 +48,11 @@
import gviewapp
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import gview
import pgugrid
Modified: packages/openev/trunk/tools/Tool_autopan.py
===================================================================
--- packages/openev/trunk/tools/Tool_autopan.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_autopan.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -65,6 +65,11 @@
import gviewapp
import Numeric
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import time
import gview
Modified: packages/openev/trunk/tools/calculator.py
===================================================================
--- packages/openev/trunk/tools/calculator.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/calculator.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -42,6 +42,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import Numeric
Modified: packages/openev/trunk/tools/compose.py
===================================================================
--- packages/openev/trunk/tools/compose.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/compose.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -54,6 +54,11 @@
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import gview
import string
Modified: packages/openev/trunk/tools/fft.py
===================================================================
--- packages/openev/trunk/tools/fft.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/fft.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -33,6 +33,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
Added: packages/openev/trunk/tools/fusion.py
===================================================================
--- packages/openev/trunk/tools/fusion.py (rev 0)
+++ packages/openev/trunk/tools/fusion.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,465 @@
+##############################################################################
+# fusion.py, v2.2b 2005/06/07
+#
+# Project: OpenEV
+# Purpose: Perform fusion (aka:pan merging, pansharpening) of panchromatic and RGB.
+# Author: Mario Beauchamp
+# TODO: add preview window, fix progress, use the NIR band
+###############################################################################
+#
+# Version 2.2b 2005/06/07
+# Now works with Quickbird imagery.
+# Removed ROI support.
+# Warped VRT replaced with gdal.ReprojectImage()
+# Added block read/write support (enabled by default)
+#
+# Version 2.11b 2005/04/29
+# Fixed prob when recent_directory is None.
+#
+# Version 2.1b 2005/04/27
+# Replaced R,G,B blend with single blend.
+# Added Grain Merge Blending.
+# Added Create Options Entry.
+# Added a few tooltips.
+#
+# Version 2.0b 2005/04/24
+# This will be the "official" version... forget about previous ones :)
+#
+###############################################################################
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
+import gtk
+from gtk import TRUE,FALSE
+import gview
+import gvutils
+import gviewapp
+import gdal
+import pguprogress
+import time
+import os
+import vrtutils
+
+# set to 1 to save pan filtered VRT
+saveVrt = 0
+
+def getLayersDict():
+ dict = {}
+ for curview in gview.app.view_manager.view_list:
+ for curlayer in curview.viewarea.list_layers():
+ curname = curlayer.get_name()
+ dict[curname] = (curview,curlayer)
+ if dict is None:
+ return None
+ return dict
+
+class FusionTool(gviewapp.Tool_GViewApp):
+ def __init__(self,app=None):
+ gviewapp.Tool_GViewApp.__init__(self,app)
+ self.init_menu()
+
+ def launch_dialog(self,*args):
+ self.win = FusionDialog()
+ if self.win is None:
+ return
+ else:
+ self.win.show()
+
+ def init_menu(self):
+ self.menu_entries.set_entry("Image/Fusion",4,self.launch_dialog)
+
+class FusionDialog(gtk.GtkWindow):
+ def __init__(self,app=None):
+ gtk.GtkWindow.__init__(self)
+ self.set_title('Image Fusion')
+ self.set_policy(FALSE, TRUE, TRUE)
+ self.layersDict = getLayersDict()
+ self.layersKeys = self.layersDict.keys()
+ self.XSize = 0
+ self.YSize = 0
+ self.blockX = 0
+ self.blockY = 0
+ self.tips = gtk.GtkTooltips()
+
+ gui_OK = self.createGUI()
+ if gui_OK is FALSE:
+ return None
+ else:
+ self.show_all()
+
+ def close(self,*args):
+ rgbx = os.path.join(os.curdir,'rgbx.tif')
+ if os.path.exists(rgbx):
+ os.remove(rgbx)
+ self.destroy()
+ return TRUE
+
+ def createGUI(self):
+ mainbox = gtk.GtkVBox(spacing=5)
+ mainbox.set_border_width(5)
+ self.add(mainbox)
+
+ # RGB source
+ frame = gtk.GtkFrame("Select Layers")
+ mainbox.add(frame,expand=FALSE)
+
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('RGB Source:'),expand=FALSE)
+ self.rgbOM = gvutils.GvOptionMenu(self.layersKeys)
+ box.add(self.rgbOM)
+
+ # Pan source
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Pan Source:'),expand=FALSE)
+
+ self.panOM = gvutils.GvOptionMenu(self.layersKeys)
+ box.add(self.panOM)
+
+ # output
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Output file:'),expand=FALSE)
+ self.outTE = gtk.GtkEntry()
+ txt = 'fused.tif'
+ curdir = gview.get_preference('recent_directory')
+ if curdir is not None:
+ txt = os.path.join(curdir,txt)
+ else:
+ txt = os.path.join(os.curdir,txt)
+ self.outTE.set_text(txt)
+ box.add(self.outTE)
+
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Create options:'),expand=FALSE)
+ self.coptTE = gtk.GtkEntry()
+ self.coptTE.set_text('tiled=yes')
+ box.add(self.coptTE)
+
+ # Params
+ frame = gtk.GtkFrame('Fusion Method')
+ mainbox.add(frame,expand=FALSE)
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box)
+
+ self.met0RB = gtk.GtkRadioButton(label='IHS')
+ tipTxt = 'Standard Intensity-Hue-Saturation merging. '
+ tipTxt+='Blend setting has no effect. '
+ tipTxt+='Not recommended for Landsat and Quickbird imagery.'
+ self.tips.set_tip(self.met0RB,tipTxt)
+ box.add(self.met0RB)
+
+ self.met1RB = gtk.GtkRadioButton(label='Kernel Blend',group=self.met0RB)
+ tipTxt = 'Pan is run through a convolution kernel and blended with RGB. '
+ tipTxt+='A blend setting of 0.7 is recommended. '
+ tipTxt+='Used for Landsat imagery.'
+ self.tips.set_tip(self.met1RB,tipTxt)
+ box.add(self.met1RB)
+ self.met1RB.set_active(TRUE)
+
+ self.met2RB = gtk.GtkRadioButton(label='Kernel Grain Merge',group=self.met0RB)
+ tipTxt = 'Same kernel filtering but with Grain Merge blend. '
+ tipTxt+='A blend setting of 0.5 is recommended. '
+ tipTxt+='Used for Landsat and Quickbird imagery.'
+ self.tips.set_tip(self.met2RB,tipTxt)
+ box.add(self.met2RB)
+
+ # blend params
+ vbox2 = gtk.GtkVBox(spacing=5)
+ vbox2.set_border_width(5)
+ vbox.add(vbox2)
+
+ box = gtk.GtkHBox(spacing=5)
+ vbox2.add(box)
+ box.add(gtk.GtkLabel('Blend:'),expand=FALSE)
+ self.adjBlend = gtk.GtkAdjustment(0.7,0.0,1.0,0.01,0.1)
+ slider = gtk.GtkHScale(self.adjBlend)
+ slider.set_digits(2)
+ box.add(slider)
+
+ box = gtk.GtkHBox(spacing=5)
+ vbox2.add(box)
+
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box)
+
+ self.sat0RB = gtk.GtkRadioButton(label='Landsat')
+ box.add(self.sat0RB)
+ self.sat1RB = gtk.GtkRadioButton(label='Quickbird',group=self.sat0RB)
+ box.add(self.sat1RB)
+
+ # Not working yet...
+ self.satRGB = gtk.GtkCheckButton('Replace Saturated RGB with Pan')
+ self.satRGB.set_state(gtk.STATE_INSENSITIVE)
+ vbox.add(self.satRGB,expand=FALSE)
+
+ # Buttons
+ box = gtk.GtkHBox(homogeneous=1,spacing=5)
+ mainbox.add(box,expand=FALSE)
+
+ mergeBT = gtk.GtkButton("Merge")
+ mergeBT.connect("clicked",self.compute)
+ self.tips.set_tip(mergeBT,'Proceed with merging')
+ box.add(mergeBT)
+
+ closeBT = gtk.GtkButton("Close")
+ closeBT.connect("clicked",self.close)
+ box.add(closeBT)
+
+ return TRUE
+
+ def constructFilteredVRT(self,ds):
+ vrtStr = '<VRTDataset rasterXSize=\"'+str(self.XSize)+'\" rasterYSize=\"'+str(self.YSize)+'\">\n'
+ vrtStr += ' <VRTRasterBand dataType="Float32" band="1">\n'
+ vrtStr += ' <KernelFilteredSource>\n <SourceFilename relativeToVRT=\"0\">'
+ vrtStr += ds.GetDescription()+'</SourceFilename>\n <SourceBand>1</SourceBand>\n'
+ vrtStr += ' <Kernel normalized=\"0\">\n <Size>3</Size>\n'
+ vrtStr += ' <Coefs>-1 -1 -1 -1 8 -1 -1 -1 -1</Coefs>\n </Kernel>'
+ vrtStr += ' </KernelFilteredSource>\n </VRTRasterBand>\n</VRTDataset>\n'
+
+ return gdal.Open(vrtStr,gdal.GA_Update)
+
+ def compute(self,*args):
+ rgbName = self.layersKeys[self.rgbOM.get_history()]
+ panName = self.layersKeys[self.panOM.get_history()]
+ if rgbName == panName:
+ gvutils.error("RGB Source and Pan Source have to differ!")
+ return FALSE
+
+ # uncomment to time
+ # t0 = time.clock()
+ self.progress = pguprogress.PGUProgressDialog('Merging images',cancel=TRUE)
+ rgbLayer = self.layersDict[rgbName][1]
+ panLayer = self.layersDict[panName][1]
+
+ srcpan = panLayer.get_parent().get_dataset()
+ geoTr = srcpan.GetGeoTransform()
+ xRez = geoTr[1]
+ yRez = geoTr[5]
+ self.XSize = srcpan.RasterXSize
+ self.YSize = srcpan.RasterYSize
+ ulx = geoTr[0]
+ uly = geoTr[3]
+
+ # create Pan Vrt
+ if self.met0RB.active:
+ panDS = srcpan
+ else:
+ panDS = self.constructFilteredVRT(srcpan)
+
+ if self.satRGB.active:
+ origPanDS = srcpan
+ else:
+ origPanDS = None
+
+ panDS.SetProjection(srcpan.GetProjection())
+ panDS.SetGeoTransform(srcpan.GetGeoTransform())
+
+ if saveVrt:
+ drv = panDS.GetDriver()
+ ds = drv.CreateCopy(os.path.join(os.curdir,'panfiltered.vrt'),panDS)
+ del ds
+ # create warped RGB
+ srcrgb = rgbLayer.get_parent().get_dataset()
+ rgbGeoTr = srcrgb.GetGeoTransform()
+ ratio = rgbGeoTr[1]/xRez
+ if ratio == 1:
+ rgbDS = srcrgb
+ else:
+ prog = self.progress.ProgressCB(0.0,'resized (progress not working...)')
+ xfile = os.path.join(os.curdir,'rgbx.tif')
+ if os.path.exists(xfile):
+ os.remove(xfile)
+ dtype = srcrgb.GetRasterBand(1).DataType
+ rgbDS = gdal.GetDriverByName('GTiff').Create(xfile,self.XSize,self.YSize,bands=3,datatype=dtype,options=['tiled=yes'])
+ rgbDS.SetProjection(srcrgb.GetProjection())
+ rgbDS.SetGeoTransform((ulx,xRez,0,uly,0,yRez))
+ gdal.ReprojectImage(srcrgb,rgbDS,eResampleAlg=gdal.GRA_CubicSpline)
+ rgbDS.FlushCache()
+
+ # create output DS and initialize
+ outfile = self.outTE.get_text()
+ drv = gdal.GetDriverByName('GTiff')
+ copts = [self.coptTE.get_text()]
+ if 'tiled=yes' in copts:
+ self.blockX = 256
+ self.blockY = 256
+ outDS = drv.Create(outfile,self.XSize,self.YSize,bands=3,datatype=gdal.GDT_Byte,options=copts)
+ outDS.SetGeoTransform(panDS.GetGeoTransform())
+ outDS.SetProjection(panDS.GetProjection())
+
+ result = self.fuseBands(rgbDS,panDS,outDS,origPanDS)
+ # uncomment to time
+ # print time.clock() - t0
+
+ del outDS
+ if result:
+ gview.app.open_gdal_dataset(gdal.Open(outfile))
+ else:
+ os.remove(outfile)
+ gvutils.error("Error merging images.")
+ return FALSE
+
+ def fuseBands(self,rgbDS,panDS,outDS,origPanDS=None):
+ from Numeric import clip,maximum
+
+ if self.sat1RB.active:
+ redBand = rgbDS.GetRasterBand(3)
+ blueBand = rgbDS.GetRasterBand(1)
+ else:
+ redBand = rgbDS.GetRasterBand(1)
+ blueBand = rgbDS.GetRasterBand(3)
+ greenBand = rgbDS.GetRasterBand(2)
+ panBand = panDS.GetRasterBand(1)
+ if origPanDS is not None:
+ origPanBand = origPanDS.GetRasterBand(1)
+ redBandOut = outDS.GetRasterBand(1)
+ greenBandOut = outDS.GetRasterBand(2)
+ blueBandOut = outDS.GetRasterBand(3)
+ blend = self.adjBlend.value
+
+ def ihsMergePix(R,G,B,I):
+ I = clip(I+128.0,0.0,255.0)
+ scale = 3.0*I/(R+G+B+1.0)
+ return R*scale, G*scale, B*scale
+
+ def ihsMergePixQB(R,G,B,I):
+ scale = 3.0*I/(R+G+B+1.0)
+ return R*scale*0.124573, G*scale*0.124573, B*scale*0.124573
+
+ def blendPix(R,G,B,I):
+ I = clip(I+128.0,0.0,255.0)
+ I = I*(1-blend)
+ return I+R*blend, I+G*blend, I+B*blend
+
+ def blendPixQB(R,G,B,I): # not working... why??
+ I = clip(I+128.0,0.0,2047.0)
+ I = I*(1.0-blend)
+ return I+R*blend*0.124573, I+G*blend*0.124573, I+B*blend*0.124573
+
+ def grainMergePix(R,G,B,I):
+ I = clip(I+128.0,0.0,255.0)
+ I = maximum(I,I+128.0)*blend
+ return I+R-128.0, I+G-128.0, I+B-128.0
+
+ def grainMergePixQB(R,G,B,I):
+ I = clip(I+128.0,0.0,2047.0)
+ I = maximum(I,I+128.0)*blend
+ return (I+R-128.0)*0.124573, (I+G-128.0)*0.124573, (I+B-128.0)*0.124573
+
+ def getMask(r,g,b): # not used for now
+ from Numeric import equal,logical_and
+ mskR = equal(r,255)
+ mskG = equal(g,255)
+ mskB = equal(b,255)
+ return logical_and(logical_and(mskR,mskG),mskB)
+
+ def mergePan(pan,r,g,b,outR,outG,outB): # not used for now
+ from Numeric import putmask
+ whiteMsk = getMask(r,g,b)
+## mrgR,mrgG,mrgB = mergePix(r,g,b,pan)
+ putmask(outR,whiteMsk,pan*0.7+r*0.3)
+ putmask(outG,whiteMsk,pan*0.7+g*0.3)
+ putmask(outB,whiteMsk,pan*0.7+b*0.3)
+
+ def writeBands(outR,outG,outB,xoff,yoff):
+ redBandOut.WriteArray(clip(outR,0,255).astype('b'),xoff,yoff)
+ greenBandOut.WriteArray(clip(outG,0,255).astype('b'),xoff,yoff)
+ blueBandOut.WriteArray(clip(outB,0,255).astype('b'),xoff,yoff)
+
+ def readBands(xoff,yoff,xsz,ysz):
+ red = redBand.ReadAsArray(xoff,yoff,xsz,ysz).astype('f')
+ green = greenBand.ReadAsArray(xoff,yoff,xsz,ysz).astype('f')
+ blue = blueBand.ReadAsArray(xoff,yoff,xsz,ysz).astype('f')
+ pan = panBand.ReadAsArray(xoff,yoff,xsz,ysz)
+ return red,green,blue,pan
+
+ def processBands(xoff,yoff,xsz,ysz):
+ red,green,blue,pan = readBands(xoff,yoff,xsz,ysz)
+ outR,outG,outB = mergeFn(red,green,blue,pan)
+ writeBands(outR,outG,outB,xoff,yoff)
+
+
+ if self.met0RB.active:
+ if self.sat1RB.active:
+ mergeFn = ihsMergePixQB
+ else:
+ mergeFn = ihsMergePix
+ elif self.met1RB.active:
+ if self.sat1RB.active:
+ mergeFn = blendPixQB
+ else:
+ mergeFn = blendPix
+ elif self.met2RB.active:
+ if self.sat1RB.active:
+ mergeFn = grainMergePixQB
+ else:
+ mergeFn = grainMergePix
+
+ self.progress.SetDefaultMessage("merged")
+ prog = 1
+ if self.blockX == 0:
+ denom = self.YSize - 1
+ for line in range(self.YSize):
+ processBands(0,line,self.XSize,1)
+ prog = self.progress.ProgressCB(float(line)/denom,'')
+ if prog == 0:
+ progress.destroy()
+ return 0
+ else:
+ fullX = int(self.XSize/self.blockX)
+ fullY = int(self.YSize/self.blockY)
+ for yblk in range(0,fullY):
+ ybloff = yblk*self.blockY
+ for xblk in range(0,fullX):
+ xbloff = xblk*self.blockX
+ processBands(xbloff,ybloff,self.blockX,self.blockY)
+
+ # deal with last Xblock, if any
+ xbloff = fullX*self.blockX
+ if self.XSize > xbloff:
+ xsz = self.XSize - xbloff
+ ysz = max(self.blockY,self.YSize - fullY*self.blockY)
+ processBands(xbloff,ybloff,xsz,ysz)
+
+ prog = self.progress.ProgressCB(float(ybloff)/self.YSize,'')
+ if prog == 0:
+ self.progress.destroy()
+ return 0
+
+ # deal with last Yblock, if any
+ ybloff = fullY*self.blockY
+ if self.YSize > ybloff:
+ ysz = self.YSize - ybloff
+ for xblk in range(0,fullX):
+ xbloff = xblk*self.blockX
+ processBands(xbloff,ybloff,self.blockX,ysz)
+
+ # deal with last Xblock, if any
+ xbloff = fullX*self.blockX
+ if self.XSize > xbloff:
+ xsz = self.XSize - xbloff
+ processBands(xbloff,ybloff,xsz,ysz)
+
+ prog = self.progress.ProgressCB(float(ybloff)/self.YSize,'')
+ if prog == 0:
+ self.progress.destroy()
+ return 0
+
+ self.progress.destroy()
+ return 1
+
+TOOL_LIST = ['FusionTool']
Modified: packages/openev/trunk/tools/gvrastertools.py
===================================================================
--- packages/openev/trunk/tools/gvrastertools.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/gvrastertools.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -44,6 +44,11 @@
#
import gviewapp
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
import gtk
import os
import gdal
Added: packages/openev/trunk/tools/histoEnhance.py
===================================================================
--- packages/openev/trunk/tools/histoEnhance.py (rev 0)
+++ packages/openev/trunk/tools/histoEnhance.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,679 @@
+###############################################################################
+# histoEnhance.py,v 1.21 2005/05/31
+#
+# Project: OpenEV
+# Purpose: Interactive tool for layer scaling with histogram(s)
+# Author: Mario Beauchamp
+# Functions: Left-Click in the markers display to set the min scale.
+# Right-Click to set the max scale.
+# 'Refresh': rebuilds the histogram (from layer, not file).
+# '+'/'-': zoomin/zoomout y axis from 10 preset zooms (10.0 to 0.001).
+# 'Load': load histogram from file.
+# 'Save': save histogram to file. Name of the file defaults to layer's
+# file name with '.his' extension.
+# If an histogram file already exists for the layer when the window
+# is launched, it's loaded automatically. The tool will check in image
+# dir and in dir defined by histos_directory preference.
+# 'Autoscale': automatic scaling.
+# 'Min tail'/'Max tail': adjust the amount of tail trimming.
+# Scaling algorithms can be selected in Combo.
+# Caution: building histograms for large images may take a while...
+# TODO: add histogram manipulation functions
+# Thanks to Frank W. for helping me with the drawing w/colors!
+###############################################################################
+#
+# Revision 1.21 2005/05/31
+# Added primary support for dynamic range 0-2047.
+# Added histos_directory preference. Directories scanned for histofiles also
+# include current image directory.
+#
+# Version 1.20 2005/04/26
+# Changed module name to histoEnhance and tool name to HistoEnhance.
+# Changed default scaling to 'None'.
+# Added statistics (mean, std dev).
+# Added scaled histogram display.
+# Removed bug that was causing rescaling.
+# More internal maintenance.
+#
+# Version 1.10 2005/04/05
+# Moved the min/max markers under the histogram display.
+# Added an extra zoom level (2.5).
+# Added no enhancement option.
+# Added option to remove blacks and whites.
+# Removed Auto-Refresh as it was too slow to be of any use.
+# Lot of internal maintenance to improve efficiency and readability.
+#
+# Revision 1.02 2005/03/30
+# Moved the percentages building code into a method so it can be reused.
+# Added drawing in black when raster is grayscale.
+###############################################################################
+
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
+import gtk
+from gtk import TRUE,FALSE
+import gview
+import gviewapp
+import os
+from Numeric import array,add
+from math import sqrt
+
+hisDir = gview.get_preference('histos_directory')
+zooms = [10.0,5.0,2.5,1.0,0.5,0.1,0.05,0.01,0.005,0.001]
+class HistoEnhance(gviewapp.Tool_GViewApp):
+ def __init__(self,app=None):
+ gviewapp.Tool_GViewApp.__init__(self,app)
+ self.init_menu()
+
+ def launch_window(self,*args):
+ layer = gview.app.active_layer()
+ if layer is None:
+ return
+
+ self.win = HistogramWindow(layer)
+ if self.win is None:
+ return
+ else:
+ self.win.show()
+
+ def init_menu(self):
+ self.menu_entries.set_entry("Image/Histogram Enhance",1,self.launch_window)
+
+class HistogramFrame(gtk.GtkFrame):
+ def __init__(self,name,srcIdx,hisSrc,master):
+ gtk.GtkFrame.__init__(self,name)
+ self.name = name
+ self.srcIdx = srcIdx
+ self.master = master
+ self.updating = TRUE
+ self.connect('destroy',self.cleanup)
+
+ self.min = self.master.layer.min_get(srcIdx)
+ self.max = self.master.layer.max_get(srcIdx)
+
+ self.createGUI()
+ self.setHisto(hisSrc)
+ self.scaledHisSrc = []
+
+ self.updating = FALSE
+
+ def createGUI(self):
+ vbox = gtk.GtkVBox()
+ vbox.set_border_width(3)
+ self.add(vbox)
+
+ self.histoDA = gtk.GtkDrawingArea()
+ self.histoDA.size(256,100)
+ self.histoDA.connect('expose-event',self.exposeHisto)
+ vbox.add(self.histoDA,expand=FALSE)
+
+ self.markersDA = gtk.GtkDrawingArea()
+ self.markersDA.size(256,8)
+ self.markersDA.set_events(gtk.GDK.BUTTON_PRESS_MASK)
+ self.markersDA.connect('expose-event',self.exposeMarkers)
+ self.markersDA.connect('button-press-event',self.click)
+ vbox.add(self.markersDA,expand=FALSE)
+
+ vbox.add(gtk.GtkHSeparator())
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box)
+
+ box.add(gtk.GtkLabel('Mean:'),expand=FALSE)
+ self.meanLB = gtk.GtkLabel()
+ box.add(self.meanLB,expand=FALSE)
+ box.add(gtk.GtkLabel(' Std Dev:'),expand=FALSE)
+ self.stdLB = gtk.GtkLabel()
+ box.add(self.stdLB,expand=FALSE)
+
+ def cleanup(self,*args):
+ # is that really necessary?
+ self.hisSrc = None
+
+ def refreshHisto(self,*args):
+ self.drawHisto()
+ self.buildPercents()
+
+ def buildPercents(self):
+ self.hiPct = []
+ self.hisSrc.reverse()
+ tot = 0
+ start = 0
+ lo = self.master.lo
+ if self.master.hi == 254:
+ self.hiPct.append(0)
+ start = 1
+ for bin in self.hisSrc[start:-1]:
+ tot+=bin
+ self.hiPct.append(tot/self.master.pixCnt*100)
+ self.hiPct.append(0)
+ self.hiPct.reverse()
+
+ self.hisSrc.reverse()
+ tot = 0
+ start = 0
+ self.lowPct = []
+ if self.master.lo == 1:
+ self.lowPct.append(0)
+ start = 1
+ for bin in self.hisSrc[start:-1]:
+ tot+=bin
+ self.lowPct.append(tot/self.master.pixCnt*100)
+ self.lowPct.append(0)
+
+ def drawHisto(self):
+ if self.get_window() is None:
+ return
+
+ gc = self.get_window().new_gc()
+ cm = self.histoDA.get_colormap()
+ style = self.histoDA.get_style()
+ w,h = self.histoDA.size_request()
+ self.histoDA.draw_rectangle(style.white_gc,TRUE,0,0,w,h)
+ zoom = zooms[self.master.zoomindex]
+ if len(self.scaledHisSrc) > 0:
+ if self.name == "Red":
+ gc.foreground = cm.alloc(65535,49150,49150)
+ elif self.name == "Green":
+ gc.foreground = cm.alloc(49150,65535,49150)
+ elif self.name == "Blue":
+ gc.foreground = cm.alloc(49150,49150,65535)
+ else:
+ gc.foreground = cm.alloc(49150,49150,49150)
+
+ self.histoDA.draw_lines(gc,self.getScaledBins(zoom))
+
+ if self.name == "Red":
+ gc.foreground = cm.alloc(65535,0,0)
+ elif self.name == "Green":
+ gc.foreground = cm.alloc(0,65535,0)
+ elif self.name == "Blue":
+ gc.foreground = cm.alloc(0,0,65535)
+ else:
+ gc = style.black_gc
+
+ self.histoDA.draw_lines(gc,self.getBins(zoom))
+
+ def exposeHisto(self,*args):
+ self.drawHisto()
+
+ def drawMarkers(self):
+ min = int(self.min)
+ max = int(self.max)
+ style = self.markersDA.get_style()
+ self.markersDA.draw_rectangle(style.bg_gc[gtk.STATE_NORMAL],TRUE,0,0,256,8)
+ self.markersDA.draw_string(style.font,style.black_gc,min-1,6,'|')
+ self.markersDA.draw_string(style.font,style.black_gc,max-1,6,'|')
+
+ def exposeMarkers(self,*args):
+ self.drawMarkers()
+
+ def updateStats(self,mean,std):
+ self.meanLB.set_text(str(mean))
+ self.stdLB.set_text(str(std))
+
+ def getHisto(self):
+ return self.hisSrc
+
+ def setHisto(self,histo):
+ self.hisSrc = histo
+ self.buildPercents()
+
+ def setScaledHisto(self,histo):
+ self.scaledHisSrc = histo
+ self.drawHisto()
+
+ def click(self, widget, event):
+ value = event.x
+ if event.button == 3:
+ self.max = value
+ pct = self.hiPct[int(value)]
+ self.master.setMax(self.srcIdx,value,pct)
+ else:
+ self.min = value
+ pct = self.lowPct[int(value)]
+ self.master.setMin(self.srcIdx,value,pct)
+
+ self.drawMarkers()
+
+ def getMinMax(self,tail=None):
+ if self.updating:
+ return
+
+ if tail == 'min':
+ self.min = self.getMinBin()
+ elif tail == 'max':
+ self.max = self.getMaxBin()
+ elif tail == 'both':
+ self.min = self.getMinBin()
+ self.max = self.getMaxBin()
+ else:
+ self.min = 0.0
+ self.max = 255.0
+
+ self.drawMarkers()
+## print self.lowPct[int(self.min)],self.hiPct[int(self.max)]
+ return self.min,self.max
+
+ def getMinBin(self):
+ for pct in self.lowPct[1:]:
+ if pct > self.master.mintail:
+ return self.lowPct.index(pct)
+ return 0
+
+ def getMaxBin(self):
+ for pct in self.hiPct[1:]:
+ if pct < self.master.maxtail:
+ return self.hiPct.index(pct)
+ return 255
+
+ def getBins(self,zoom):
+ bins = []
+ w,h = self.histoDA.size_request()
+ lo = self.master.lo
+ hi = self.master.hi
+ maxVal = max(self.hisSrc[lo:hi+1]) * zoom
+ if lo == 1:
+ bins.append((0,99))
+ for x in range(lo,hi+1):
+ y = min(int(h - h * self.hisSrc[x]/maxVal),h-1)
+ y = max(0,y)
+ bins.append((x,y))
+ if hi == 254:
+ bins.append((255,99))
+ return bins
+
+ def getScaledBins(self,zoom):
+ bins = []
+ w,h = self.histoDA.size_request()
+ maxVal = max(self.scaledHisSrc[1:]) * zoom
+ bins.append((0,99))
+ for x in range(1,256):
+ y = min(int(h - h * self.scaledHisSrc[x]/maxVal),h-1)
+ y = max(0,y)
+ bins.append((x,y))
+ return bins
+
+class HistogramWindow(gtk.GtkWindow):
+ def __init__(self,layer):
+ gtk.GtkWindow.__init__(self)
+ self.layer = layer
+ self.gdt = self.layer.get_data(0).get_band().DataType
+ self.teardown_id = self.layer.connect('teardown',self.close)
+
+ self.zoomindex = 3
+ self.mintail = 0.1
+ self.maxtail = 1.0
+ self.lo = 1
+ self.hi = 254
+ self.lut = None
+ self.histoDisplays = []
+
+ self.updating = TRUE
+ self.createGUI()
+ self.show_all()
+ self.updating = FALSE
+ self.autoScale()
+
+ def createGUI(self):
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ self.add(vbox)
+ histoBox = gtk.GtkVBox(spacing=3)
+ vbox.add(histoBox)
+ histoList = []
+
+ hisdir,f = os.path.split(self.layer.get_parent().get_dataset().GetDescription())
+ name,ext = os.path.splitext(f)
+ self.set_title(name+' Histogram')
+ hisfile = os.path.join(hisdir,name+'.his')
+ if os.path.exists(hisfile): # histofile is in same dir
+ histoList = self.loadHistos(hisfile)
+ elif hisDir is not None:
+ hisfile = os.path.join(hisDir,name+'.his')
+ if os.path.exists(hisfile): # histofile is in histos dir
+ histoList = self.loadHistos(self.hisFile)
+ self.hisFile = hisfile
+
+ if self.layer.get_mode() == gview.RLM_RGBA:
+ if len(histoList) == 0:
+ for isrc in range(3):
+ histoList.append(self.buildHisto(isrc))
+
+ self.pixCnt = self.getPixCount(histoList)
+ histoDisp = HistogramFrame('Red',0,histoList[0],self)
+ histoBox.add(histoDisp,expand=FALSE)
+ self.histoDisplays.append(histoDisp)
+
+ histoDisp = HistogramFrame('Green',1,histoList[1],self)
+ histoBox.add(histoDisp,expand=FALSE)
+ self.histoDisplays.append(histoDisp)
+
+ histoDisp = HistogramFrame('Blue',2,histoList[2],self)
+ histoBox.add(histoDisp,expand=FALSE)
+ self.histoDisplays.append(histoDisp)
+ else:
+ if len(histoList) == 0:
+ histoList.append(self.buildHisto(0))
+ self.pixCnt = self.getPixCount(histoList)
+ histoDisp = HistogramFrame('Raster',0,histoList[0],self)
+ histoBox.add(histoDisp,expand=FALSE)
+ self.histoDisplays.append(histoDisp)
+
+ ctrlbox = gtk.GtkHBox(homogeneous=1,spacing=3)
+ vbox.add(ctrlbox,expand=FALSE)
+
+ refreshBT = gtk.GtkButton("Refresh")
+ refreshBT.connect("clicked",self.refresh)
+ ctrlbox.add(refreshBT)
+ zoominBT = gtk.GtkButton("+")
+ zoominBT.connect("clicked",self.zoom,'in')
+ ctrlbox.add(zoominBT)
+ zoomoutBT = gtk.GtkButton("-")
+ zoomoutBT.connect("clicked",self.zoom,'out')
+ ctrlbox.add(zoomoutBT)
+ loadBT = gtk.GtkButton("Load")
+ loadBT.connect("clicked",self.load)
+ ctrlbox.add(loadBT)
+ saveBT = gtk.GtkButton("Save")
+ saveBT.connect("clicked",self.save)
+ ctrlbox.add(saveBT)
+
+ scalefrm = gtk.GtkFrame('Autoscale')
+ vbox.add(scalefrm,expand=FALSE)
+ scalebox = gtk.GtkVBox(spacing=5)
+ scalebox.set_border_width(5)
+ scalefrm.add(scalebox)
+
+ box = gtk.GtkHBox(spacing=5)
+ scalebox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Remove: '),expand=FALSE)
+ blackCK = gtk.GtkCheckButton('Black')
+ blackCK.set_active(TRUE)
+ blackCK.connect('toggled',self.setLimits,'lo')
+ box.add(blackCK,expand=FALSE)
+ whiteCK = gtk.GtkCheckButton('White')
+ whiteCK.set_active(TRUE)
+ whiteCK.connect('toggled',self.setLimits,'hi')
+ box.add(whiteCK,expand=FALSE)
+
+ box = gtk.GtkHBox(spacing=5)
+ scalebox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Min tail:'),expand=FALSE)
+ minAdj = gtk.GtkAdjustment(self.mintail,0.0,99.9,0.01,0.1)
+ self.minSpin = gtk.GtkSpinButton(minAdj,0.1,2)
+ self.minSpin.set_usize(55,-1)
+ self.minSpin.connect('changed',self.adjustMin)
+ box.add(self.minSpin,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Max tail:'),expand=FALSE)
+ maxAdj = gtk.GtkAdjustment(self.maxtail,0.0,99.9,0.01,0.1)
+ self.maxSpin = gtk.GtkSpinButton(maxAdj,0.1,2)
+ self.maxSpin.set_usize(55,-1)
+ self.maxSpin.connect('changed',self.adjustMax)
+ box.add(self.maxSpin,expand=FALSE)
+
+ algCB = gtk.GtkCombo()
+ algCB.set_popdown_strings(['None','linear','log','root','square'])
+ algCB.entry.connect('changed',self.setAlg)
+ algCB.set_usize(70,-1)
+ scalebox.add(algCB,expand=FALSE)
+
+ def close(self, *args):
+ self.layer.disconnect(self.teardown_id)
+
+ del self.histoDisplays
+ self.layer = None
+ self.destroy()
+
+ def refresh(self,bt):
+ histoList = []
+ for histoDisp in self.histoDisplays:
+ histo = self.buildHisto(histoDisp.srcIdx)
+ histoDisp.setHisto(histo)
+ histoList.append(histo)
+
+ self.pixCnt = self.getPixCount(histoList)
+ self.update()
+ self.autoScale()
+
+ def update(self):
+ for histoDisp in self.histoDisplays:
+ histoDisp.refreshHisto()
+
+ def updateSpins(self,lo=None,hi=None):
+ self.updating = TRUE
+ if lo is not None:
+ self.minSpin.set_value(lo)
+ if hi is not None:
+ self.maxSpin.set_value(hi)
+ self.updating = FALSE
+
+ def updateScaled(self,histoDisp):
+ scaledHisto = self.buildScaledHisto(histoDisp)
+ histoDisp.setScaledHisto(scaledHisto)
+ mean,std = self.getStats(scaledHisto)
+ histoDisp.updateStats(round(mean,1),round(std,1))
+
+ def zoom(self,bt,id):
+ if id == 'in':
+ self.zoomindex = min(self.zoomindex+1,8)
+ else:
+ self.zoomindex = max(self.zoomindex-1,0)
+
+ for histoDisp in self.histoDisplays:
+ histoDisp.drawHisto()
+
+ def load(self,bt):
+ import filedlg
+ hisdir,hisfile = os.path.split(self.hisFile)
+ dlg = filedlg.FileDialog('Open Histogram',cwd=hisdir,filter='Histogram files|*.his',multiselect=0)
+ dlg.ok_button.connect('clicked',self.loadHistoFile,dlg)
+ dlg.set_filename(hisfile)
+ dlg.show()
+
+ def loadHistoFile(self,bt,dlg):
+ hisFile = dlg.get_filename()
+ histoList = self.loadHistos(hisFile)
+
+ self.pixCnt = self.getPixCount(histoList)
+ for histoDisp in self.histoDisplays:
+ histoDisp.setHisto(histoList[histoDisp.srcIdx])
+ histoDisp.drawHisto()
+
+ self.autoScale()
+ self.hisFile = hisFile
+
+ def loadHistos(self,filename):
+ import pickle
+ f = file(filename,'r')
+ histoList = pickle.load(f)
+ f.close()
+ return histoList
+
+ def save(self,*args):
+ import filedlg
+ hisdir,hisfile = os.path.split(self.hisFile)
+ dlg = filedlg.FileDialog('Save Histogram as...',cwd=hisdir,dialog_type=filedlg.FILE_SAVE,filter='Histogram files|*.his')
+ dlg.ok_button.connect('clicked', self.saveHistoFile, dlg)
+ dlg.set_filename(hisfile)
+ dlg.show()
+
+ def saveHistoFile(self,bt,dlg):
+ import pickle
+ histoList = []
+ for histoDisp in self.histoDisplays:
+ histoList.append(histoDisp.getHisto())
+ hisFile = dlg.get_filename()
+ f = file(hisFile,'w')
+ pickle.dump(histoList, f)
+ f.close()
+ self.hisFile = hisFile
+
+ def setAlg(self,entry):
+ alg = entry.get_text()
+ self.lut = self.getLut(alg)
+ if alg == 'None':
+ self.autoScale()
+ alg = 'none_lut'
+ else:
+ self.autoScale('both')
+
+ self.layer.set_property('last_stretch',alg)
+
+ def adjustMin(self,spin):
+ if self.updating:
+ return
+ self.mintail = spin.get_value_as_float()
+ self.autoScale('min')
+
+ def adjustMax(self,spin):
+ if self.updating:
+ return
+ self.maxtail = spin.get_value_as_float()
+ self.autoScale('max')
+
+ def setMin(self,isrc,value,pct):
+ if self.gdt == 2:
+ value/=0.124573
+ self.layer.min_set(isrc,value)
+ self.updateSpins(lo=pct)
+ self.mintail = pct
+ self.updateScaled(self.histoDisplays[isrc])
+
+ def setMax(self,isrc,value,pct):
+ if self.gdt == 2:
+ value/=0.124573
+ self.layer.max_set(isrc,value)
+ self.updateSpins(hi=pct)
+ self.maxtail = pct
+ self.updateScaled(self.histoDisplays[isrc])
+
+ def setLimits(self,ck,id):
+ if id == 'hi':
+ if ck.active:
+ self.hi = 254
+ else:
+ self.hi = 255
+ else:
+ if ck.active:
+ self.lo = 1
+ else:
+ self.lo = 0
+
+ histoList = []
+ for histoDisp in self.histoDisplays:
+ histoList.append(histoDisp.getHisto())
+ self.pixCnt = self.getPixCount(histoList)
+ self.update()
+ self.autoScale('both')
+ self.updateSpins(self.mintail,self.maxtail)
+
+ def buildHisto(self,isrc):
+ band = self.layer.get_data(isrc).get_band()
+ if self.gdt == 2:
+ return band.GetHistogram(min=-0.5,max=2047.5,buckets=256)
+ else:
+ return band.GetHistogram()
+
+ def buildScaledHisto(self,histoDisp):
+ histo = histoDisp.getHisto()
+ ratio = 255.0/(histoDisp.max-histoDisp.min)
+ offset = -(histoDisp.min*ratio)
+ scaledHisto = []
+ for i in range(256):
+ scaledHisto.append(0)
+ for i in range(256):
+ value = int(i*ratio+offset)
+ if self.lut is not None:
+ if value < 0:
+ value = 0
+ elif value > 255:
+ value = 255
+ scaled = ord(self.lut[value])
+ else:
+ scaled = value
+ if scaled < 0:
+ scaledHisto[0] += histo[i]
+ elif scaled > 255:
+ scaledHisto[255] += histo[i]
+ else:
+ scaledHisto[scaled] += histo[i]
+
+ return scaledHisto
+
+ def autoScale(self,tail=None):
+ for histoDisp in self.histoDisplays:
+ min,max = histoDisp.getMinMax(tail)
+ if self.gdt == 2:
+ min/=0.124573
+ max/=0.124573
+ isrc = histoDisp.srcIdx
+
+ self.layer.set_source(isrc,self.layer.get_data(isrc),min,max,
+ self.layer.get_const_value(isrc),self.lut,
+ self.layer.nodata_get(isrc))
+
+ self.updateScaled(histoDisp)
+
+ def getLut(self,alg):
+ from math import log,pow
+ def root(value):
+ return int(255 * sqrt(i/255.0))
+ def loga(value):
+ return int((255 * (log(1.0+i) / log(256.0)))+0.5)
+ def square(value):
+ return int(255 * pow(i/255.0,2.0))
+
+ if alg == 'root':
+ fn = root
+ elif alg == 'log':
+ fn = loga
+ elif alg == 'square':
+ fn = square
+ else:
+ return None
+
+ lut = ''
+ for i in range(256):
+ value = fn(i)
+ if value < 0 :
+ value = 0
+ elif value >= 255:
+ value = 255
+ lut = lut + chr(value)
+
+ return lut
+
+ def getPixCount(self,hisLst):
+ from operator import add
+ cnt = reduce(add,hisLst[0])
+ if self.lo == 1:
+ blkLst = []
+ for histo in hisLst:
+ blkLst.append(histo[0])
+ cnt -= min(blkLst)
+ elif self.hi == 254:
+ whtLst = []
+ for histo in hisLst:
+ whtLst.append(histo[255])
+ cnt -= min(whtLst)
+
+ return float(cnt)
+
+ def getStats(self,histo):
+ m = array(histo[1:])
+ sum = 0.0
+ sum2 = 0.0
+ n = float(add.reduce(m))
+ for j in range(len(m)):
+ sum = sum + j * m[j]
+ sum2 = sum2 + (j ** 2) * float(m[j])
+ var = (sum2-(sum**2.0)/n)/n
+ return sum/n,sqrt(var)
+
+TOOL_LIST = ['HistoEnhance']
Modified: packages/openev/trunk/tools/imgproctemplate.py
===================================================================
--- packages/openev/trunk/tools/imgproctemplate.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/imgproctemplate.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
Modified: packages/openev/trunk/tools/isodata.py
===================================================================
--- packages/openev/trunk/tools/isodata.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/isodata.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -33,6 +33,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
from Numeric import *
Added: packages/openev/trunk/tools/maps.dat
===================================================================
--- packages/openev/trunk/tools/maps.dat (rev 0)
+++ packages/openev/trunk/tools/maps.dat 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,213 @@
+(dp0
+S'Daily MODIS'
+p1
+(dp2
+S'URL'
+p3
+S'http://wms.jpl.nasa.gov/wms.cgi?LAYERS=daily_terra&STYLES=default&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.1&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p4
+sS'Server'
+p5
+S'OnEarth'
+p6
+sS'Name'
+p7
+S'modis_daily'
+p8
+sS'Title'
+p9
+g1
+ssS'SRTM30Plus auto'
+p10
+(dp11
+g3
+S'http://maps.gdal.org/cgi-bin/mapserv_dem?LAYERS=srtmplus_autoscale&STYLES=&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p12
+sg5
+S'GDAL SRTM30Plus'
+p13
+sg7
+S'srtm30_auto'
+p14
+sg9
+g10
+ssS'Blue Marble Modis'
+p15
+(dp16
+g3
+S'http://wms.jpl.nasa.gov/wms.cgi?LAYERS=modis&STYLES=default&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.1&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p17
+sg5
+S'OnEarth'
+p18
+sg7
+S'modis'
+p19
+sg9
+g15
+ssS'GNIS Civil'
+p20
+(dp21
+g3
+S'http://gisdata.usgs.net:80/servlet/com.esri.wms.Esrimap/EDC_GNIS?LAYERS=GNIS_CIVIL%2CGNIS_CIVIL_Labels&STYLES=%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p22
+sg5
+S'EDC GNIS'
+p23
+sg7
+S'gnis_civil'
+p24
+sg9
+g20
+ssS'True Color Landsat'
+p25
+(dp26
+S'URL'
+p27
+S'http://wms.jpl.nasa.gov/wms.cgi?VERSION=1.1.1&LAYERS=global_mosaic_base&STYLES=visual&FORMAT=image%2Fpng&REQUEST=GetMap&SERVICE=WMS&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p28
+sS'Title'
+p29
+g25
+sS'Name'
+p30
+S'Landsat321'
+p31
+sS'Server'
+p32
+S'OnEarth'
+p33
+ssS'Atlas of Canada 2M'
+p34
+(dp35
+g27
+S'http://atlas.gc.ca:80/cgi-bin/atlaswms_en?LAYERS=can_7.5m%2Cnat_bounds%2Cwa_2m%2Cdrain_2m%2Croads_2m%2Cplaces_symb_2m%2Cplaces_labels_7.5m%2Ccap_symb_e&STYLES=%2C%2C%2C%2C%2C%2C%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.0.8&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p36
+sg29
+g34
+sg30
+S'atlas_can2m'
+p37
+sg32
+S'Atlas of Canada'
+p38
+ssS'NRN Quebec'
+p39
+(dp40
+g3
+S'http://www.geographynetwork.ca/wmsconnector/com.esri.wsit.WMSServlet/Geobase_NRN_Quebec_I?LAYERS=allroads&STYLES=&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p41
+sg5
+S'NRN Quebec'
+p42
+sg7
+S'nrn_qc'
+p43
+sg9
+g39
+ssS'GMap demo'
+p44
+(dp45
+g3
+S'http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?LAYERS=fedlimit%2Cprov_bound%2Cdrain_fn%2Cdrainage%2Croad%2Crail%2Cpopplace&STYLES=%2C%2C%2C%2C%2C%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.0.8&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p46
+sg5
+S'DM Solutions Demo'
+p47
+sg7
+S'gmap'
+p48
+sg9
+g44
+ssS'LIBC 250K'
+p49
+(dp50
+g3
+S'http://libcwms.gov.bc.ca/wmsconnector/com.esri.wsit.WMSServlet/ogc_layer_service?LAYERS=NTS_BC_LANDCOVER_LINES_125M%2CNTS_BC_LANDFORM_LINES_125M%2CNTS_BC_RIV_LAKE_WET_POLYS_125M%2CNTS_BC_TRANSPORT_LINES_125M%2CNTS_BC_MANMADE_POINTS_125M&STYLES=%2C%2C%2C%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p51
+sg5
+S'LIBC'
+p52
+sg7
+S'libc_250k'
+p53
+sg9
+g49
+ssS'Los Angeles Ortho'
+p54
+(dp55
+g3
+S'http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Ortho_133Urban?LAYERS=Laglendale01%2CLaglendale02&STYLES=%2C&SERVICE=WMS&FORMAT=image%2Fjpeg&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p56
+sg5
+S'USGS Ortho'
+p57
+sg7
+S'la_ortho'
+p58
+sg9
+g54
+ssS'Mars'
+p59
+(dp60
+g3
+S'http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&LAYERS=SHADEDRED%3AMARS_DATA&STYLES=default&SERVICE=WMS&FORMAT=image%2Fpng%3B+PhotometricInterpretation%3DRGB&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p61
+sg5
+S'Cubewerx Mars'
+p62
+sg7
+S'mars'
+p63
+sg9
+g59
+ssS'BTS Roads'
+p64
+(dp65
+g27
+S'http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Trans_BTS_Roads?LAYERS=Roads_BTS&STYLES=&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p66
+sg29
+g64
+sg30
+S'bts_roads'
+p67
+sg32
+S'BTS Roads'
+p68
+ssS'CGNS'
+p69
+(dp70
+g27
+S'http://cgns.nrcan.gc.ca/wfs/cubeserv.cgi?LAYERS=GEONAMES%3Acgns&STYLES=GeoBase+Portal+Nameset&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p71
+sg29
+g69
+sg30
+S'cgns'
+p72
+sg32
+S'Canadian Geographical Names'
+p73
+ssS'GLOBE Cloud Cover'
+p74
+(dp75
+g3
+S'http://globe.digitalearth.gov/viz-bin/wmt.cgi?LAYERS=COCOV&STYLES=CONTOURS&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p76
+sg5
+S'GLOBE'
+p77
+sS'Extents'
+p78
+(dp79
+S'time'
+p80
+S'2005-03-17'
+p81
+ssg7
+S'globe_clouds'
+p82
+sg9
+g74
+ss.
\ No newline at end of file
Modified: packages/openev/trunk/tools/mil_symbols.py
===================================================================
--- packages/openev/trunk/tools/mil_symbols.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/mil_symbols.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -41,6 +41,11 @@
#
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
Modified: packages/openev/trunk/tools/open_raw.py
===================================================================
--- packages/openev/trunk/tools/open_raw.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/open_raw.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
# (which describe the whole file) plus line/pixel offsets and
# sizes for the subwindow.
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import GtkExtra
Modified: packages/openev/trunk/tools/open_subarea.py
===================================================================
--- packages/openev/trunk/tools/open_subarea.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/open_subarea.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -38,6 +38,11 @@
# New.
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview, gdal, gdalconst, gvutils
import gviewapp
Added: packages/openev/trunk/tools/projection.py
===================================================================
--- packages/openev/trunk/tools/projection.py (rev 0)
+++ packages/openev/trunk/tools/projection.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,704 @@
+##############################################################################
+# projection.py, v0.0b 2005/06/15
+#
+# Project: OpenEV
+# Purpose: Projection support for OpenEV.
+# Author: Mario Beauchamp
+# Comments: Very preliminary version... only works with EPSG codes for now
+###############################################################################
+
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
+import gtk
+from gtk import TRUE,FALSE
+import os
+import gdal
+import gvutils
+import gview
+import gviewapp
+import osr
+
+# those are the only drivers that work cleanly...
+drivers = ['GTiff','HFA','MEM','PCIDSK','VRT']
+
+class ProjectionTool(gviewapp.Tool_GViewApp):
+ def __init__(self,app=None):
+ gviewapp.Tool_GViewApp.__init__(self,app)
+ self.init_menu()
+ # uncomment this line if you want to create an icon entry
+## self.init_icon()
+
+ def launch_window(self,*args):
+ self.win = ProjectionDialog()
+ if self.win is None:
+ return
+ else:
+ self.win.show()
+
+ def init_menu(self):
+ self.menu_entries.set_entry("Image/Projection",1,self.launch_window)
+
+ def init_icon(self):
+ self.icon_entries.set_entry("worldrgb.xpm","Projection",1,self.launch_window)
+
+class ProjectionDialog(gtk.GtkWindow):
+ def __init__(self):
+ gtk.GtkWindow.__init__(self)
+ self.set_title('Projection Tool')
+ self.dstSRS = osr.SpatialReference()
+ self.updating = TRUE
+ self.viewwin = gview.app.view_manager.get_active_view_window()
+ self.active_change_id = self.viewwin.viewarea.connect("active-changed",self.activeChanged)
+ self.createGUI()
+ self.updating = FALSE
+ self.initParams()
+ self.initGUI()
+ self.show_all()
+
+ def initParams(self):
+ layer = self.viewwin.viewarea.active_layer()
+ if layer is None:
+ return
+ self.layer = layer
+ self.srcDrv = layer.get_parent().get_dataset().GetDriver()
+ self.dstDrv = 'GTiff'
+ self.srcSRS = self.getSRS(self.layer)
+ prj = self.layer.get_projection()
+ if prj is not None:
+ self.dstSRS.ImportFromWkt(prj)
+ self.src = self.getInfoFromLayer()
+ self.dst = self.compute()
+ self.dst.epsg = self.src[6]
+
+ def createGUI(self):
+ self.tips = gtk.GtkTooltips()
+ mainbox = gtk.GtkVBox(spacing=5)
+ mainbox.set_border_width(5)
+ self.add(mainbox)
+
+# Src params
+ frame = gtk.GtkFrame('Source')
+ mainbox.add(frame,expand=FALSE)
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ # Upper left corner
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('UL '),expand=FALSE)
+ box.add(gtk.GtkLabel('X:'),expand=FALSE)
+ self.srcULxTE = GeoEntry()
+ box.add(self.srcULxTE,expand=FALSE)
+ box.add(gtk.GtkLabel('Y:'),expand=FALSE)
+ self.srcULyTE = GeoEntry()
+ box.add(self.srcULyTE,expand=FALSE)
+
+ # Resolution
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Pixel size'),expand=FALSE)
+ box.add(gtk.GtkLabel('X:'),expand=FALSE)
+ self.srcRezxTE = gtk.GtkEntry()
+ self.srcRezxTE.set_usize(100,-1)
+ box.add(self.srcRezxTE,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Y:'), expand=FALSE)
+ self.srcRezyTE = gtk.GtkEntry()
+ self.srcRezyTE.set_usize(100,-1)
+ box.add(self.srcRezyTE,expand=FALSE)
+
+ # Size
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Width: '),expand=FALSE)
+ self.srcWidthTE = gtk.GtkEntry()
+ self.srcWidthTE.set_name('srcw')
+ self.srcWidthTE.set_usize(50,-1)
+ box.add(self.srcWidthTE,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Height:'),expand=FALSE)
+ self.srcHeightTE = gtk.GtkEntry()
+ self.srcHeightTE.set_name('srch')
+ self.srcHeightTE.set_usize(50,-1)
+ box.add(self.srcHeightTE,expand=FALSE)
+
+ # SRS
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('EPSG:'),expand=FALSE)
+ self.srcEpsgTE = gtk.GtkEntry()
+ self.srcEpsgTE.set_usize(50,-1)
+ self.srcEpsgTE.connect('activate',self.epsgSrcChanged)
+ box.add(self.srcEpsgTE,expand=FALSE)
+
+# Dst params
+ frame = gtk.GtkFrame('Destination')
+ mainbox.add(frame,expand=FALSE)
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ # Upper left corner
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('UL '),expand=FALSE)
+ box.add(gtk.GtkLabel('X:'),expand=FALSE)
+ self.dstULxTE = GeoEntry()
+ box.add(self.dstULxTE,expand=FALSE)
+ box.add(gtk.GtkLabel('Y:'),expand=FALSE)
+ self.dstULyTE = GeoEntry()
+ box.add(self.dstULyTE,expand=FALSE)
+
+ # Resolution
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Pixel size'),expand=FALSE)
+ box.add(gtk.GtkLabel('X:'),expand=FALSE)
+ self.dstRezxTE = gtk.GtkEntry()
+ self.dstRezxTE.set_usize(100,-1)
+ self.dstRezxTE.connect('activate',self.updateFromEntry,'dstx')
+ box.add(self.dstRezxTE,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Y:'), expand=FALSE)
+ self.dstRezyTE = gtk.GtkEntry()
+ self.dstRezyTE.set_usize(100,-1)
+ self.dstRezyTE.connect('activate',self.updateFromEntry,'dsty')
+ box.add(self.dstRezyTE,expand=FALSE)
+
+ # Size
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Width: '),expand=FALSE)
+ self.dstWidthTE = gtk.GtkEntry()
+ self.dstWidthTE.set_usize(50,-1)
+ self.dstWidthTE.connect('activate',self.updateFromEntry,'dstw')
+ box.add(self.dstWidthTE,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Height:'),expand=FALSE)
+ self.dstHeightTE = gtk.GtkEntry()
+ self.dstHeightTE.set_usize(50,-1)
+ self.dstHeightTE.connect('activate',self.updateFromEntry,'dsth')
+ box.add(self.dstHeightTE,expand=FALSE)
+
+ # SRS
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('EPSG:'),expand=FALSE)
+ self.dstEpsgTE = gtk.GtkEntry()
+ self.dstEpsgTE.set_usize(50,-1)
+ self.dstEpsgTE.connect('activate',self.epsgDstChanged)
+ box.add(self.dstEpsgTE,expand=FALSE)
+
+# resampling and file create options
+ frame = gtk.GtkFrame('Options')
+ mainbox.add(frame,expand=FALSE)
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ # warp options
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Resampling'),expand=FALSE)
+ self.algCB = gtk.GtkCombo()
+ box.add(self.algCB,expand=FALSE)
+ self.algCB.set_popdown_strings(['Nearest Neighbor','Bilinear','Cubic','Cubic spline'])
+
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Error threshold'),expand=FALSE)
+ self.etTE = gtk.GtkEntry()
+ self.etTE.set_text('0.125')
+ box.add(self.etTE,expand=FALSE)
+
+ # file options
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Format'),expand=FALSE)
+ self.formatCB = gtk.GtkCombo()
+## wDrvs = filter(lambda d: 'DCAP_CREATE' in d.GetMetadata(),gdal.GetDriverList())
+## drivers = map(lambda d: d.ShortName,wDrvs)
+ self.formatCB.set_popdown_strings(drivers)
+ self.formatCB.entry.connect('changed',self.formatChanged)
+ box.add(self.formatCB,expand=FALSE)
+
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Filename'),expand=FALSE)
+ self.fileTE = gtk.GtkEntry()
+ box.add(self.fileTE)
+
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel('Create options'),expand=FALSE)
+ self.coptTE = gtk.GtkEntry()
+ box.add(self.coptTE)
+
+ box = gtk.GtkHBox(homogeneous=1,spacing=5)
+ box.set_border_width(5)
+ vbox.add(box,expand=FALSE)
+ self.viewopt0RB = gtk.GtkRadioButton(label='Current view')
+ box.add(self.viewopt0RB,expand=FALSE)
+ self.viewopt1RB = gtk.GtkRadioButton(label='New view',group=self.viewopt0RB)
+ box.add(self.viewopt1RB,expand=FALSE)
+ self.viewopt2RB = gtk.GtkRadioButton(label='Save only',group=self.viewopt0RB)
+ box.add(self.viewopt2RB,expand=FALSE)
+
+# Buttons
+ box = gtk.GtkHBox(homogeneous=1,spacing=5)
+ mainbox.add(box,expand=FALSE)
+
+ assignBT = gtk.GtkButton("Assign")
+ assignBT.connect("clicked",self.assign)
+ box.add(assignBT)
+
+ reprojBT = gtk.GtkButton("Reproject")
+ reprojBT.connect("clicked",self.reproject)
+ box.add(reprojBT)
+
+ closeBT = gtk.GtkButton("Close")
+ closeBT.connect("clicked",self.close)
+ box.add(closeBT)
+
+ def initGUI(self):
+ self.updating = TRUE
+ self.updateSrcGUI()
+ self.updateDstGUI()
+ self.formatCB.entry.set_text(self.dstDrv)
+ self.setFilename()
+ self.updating = FALSE
+
+ def close(self,*args):
+ self.viewwin.viewarea.disconnect(self.active_change_id)
+ self.destroy()
+ return TRUE
+
+ def activeChanged(self,*args):
+ if self.updating:
+ return
+ self.initParams()
+ if self.layer is None:
+ return
+ self.initGUI()
+
+ def epsgDstChanged(self,entry):
+ if self.updating:
+ return
+ epsg = int(entry.get_text())
+ self.dstSRS.ImportFromEPSG(epsg)
+ self.dst = self.compute()
+ self.dst.epsg = epsg
+ self.updateDstGUI()
+
+ def epsgSrcChanged(self,entry):
+ epsg = int(entry.get_text())
+ self.srcSRS.ImportFromEPSG(epsg)
+ self.src[6] = epsg
+ self.updateSrcGUI()
+
+ def formatChanged(self,entry):
+ self.dstDrv = entry.get_text()
+ self.setFilename()
+
+ def updateSrcGUI(self):
+ self.setEntryMode(src=1)
+ parm = map(lambda p:str(p),self.src[2:])
+ self.srcULxTE.setValue(self.src[0])
+ self.srcULyTE.setValue(self.src[1])
+ self.srcRezxTE.set_text(parm[0])
+ self.srcRezyTE.set_text(parm[1])
+ self.srcWidthTE.set_text(parm[2])
+ self.srcHeightTE.set_text(parm[3])
+ self.srcEpsgTE.set_text(parm[4])
+
+ def updateDstGUI(self):
+ self.setEntryMode()
+ self.dstULxTE.setValue(self.dst.minX)
+ self.dstULyTE.setValue(self.dst.maxY)
+ self.dstRezxTE.set_text(str(self.dst.rezX))
+ self.dstRezyTE.set_text(str(self.dst.rezY))
+ self.dstWidthTE.set_text(str(self.dst.width))
+ self.dstHeightTE.set_text(str(self.dst.height))
+ self.dstEpsgTE.set_text(str(self.dst.epsg))
+
+ def updateFromEntry(self,entry,id):
+ if self.updating:
+ return
+ self.updating = TRUE
+ if id == 'dstw':
+ txt = self.dstWidthTE.get_text()
+ if not len(txt): return
+ self.dst.setRezX(int(txt))
+ self.dstRezxTE.set_text(str(self.dst.rezX))
+ elif id == 'dsth':
+ txt = self.dstHeightTE.get_text()
+ if not len(txt): return
+ self.dst.setRezY(int(txt))
+ self.dstRezyTE.set_text(str(self.dst.rezY))
+ elif id == 'dstx':
+ txt = self.dstRezxTE.get_text()
+ if not len(txt): return
+ self.dst.setWidth(float(txt))
+ self.dstWidthTE.set_text(str(self.dst.width))
+ elif id == 'dsty':
+ txt = self.dstRezyTE.get_text()
+ if not len(txt): return
+ self.dst.setHeight(float(txt))
+ self.dstHeightTE.set_text(str(self.dst.height))
+
+ self.updating = FALSE
+
+ def getInfoFromLayer(self):
+ params = [0,0,1,1,0,0,0]
+ if self.layer is None:
+ return params
+ ds = self.layer.get_parent().get_dataset()
+ if ds is None: # unlikely...
+ return params
+ params[4] = ds.RasterXSize
+ params[5] = ds.RasterYSize
+ geoTr = ds.GetGeoTransform()
+ params[0] = geoTr[0]
+ params[1] = geoTr[3]
+ params[2] = geoTr[1]
+ params[3] = abs(geoTr[5])
+ params[6] = self.getEPSG(self.srcSRS)
+ return params
+
+ def reproject(self,but):
+ Dset = self.layer.get_parent().get_dataset()
+
+ ulx = self.dstULxTE.getValue()
+ uly = self.dstULyTE.getValue()
+ rezX = float(self.dstRezxTE.get_text())
+ rezY = float(self.dstRezyTE.get_text())
+ w = int(self.dstWidthTE.get_text())
+ h = int(self.dstHeightTE.get_text())
+
+ fname = self.fileTE.get_text()
+ dstprj = self.dstSRS.ExportToWkt()
+ if self.dstDrv == 'VRT': # not working... possible bug in AutoCreateWarpedVRT
+ projDset = gdal.AutoCreateWarpedVRT(Dset,
+ dst_wkt=dstprj,
+ eResampleAlg=self.getResamplingAlg(),
+ maxerror=float(self.etTE.get_text()))
+ projDset.SetDescription(fname)
+ else:
+ drv = gdal.GetDriverByName(self.dstDrv)
+ projDset = drv.Create(fname,w,h,
+ bands=Dset.RasterCount,
+ datatype=int(self.layer.type_get(0)),
+ options=[self.coptTE.get_text()])
+ if projDset is None:
+ gvutils.error('Output file could not be created')
+ return
+
+ projDset.SetProjection(dstprj)
+ projDset.SetGeoTransform((ulx,rezX,0.0,uly,0.0,-rezY))
+
+ if self.dstDrv != 'VRT':
+ err = gdal.ReprojectImage(Dset,projDset,
+ dst_wkt=dstprj,
+ eResampleAlg=self.getResamplingAlg(),
+ maxerror=float(self.etTE.get_text()))
+ if err:
+ gvutils.error('Reprojection failed')
+ del projDset
+ return
+ projDset.FlushCache()
+
+ self.openProjected(projDset)
+
+ def assign(self,but):
+## self.updating = TRUE
+ Dset = self.layer.get_parent().get_dataset()
+
+ ulx = self.srcULxTE.getValue()
+ uly = self.srcULyTE.getValue()
+ rezX = float(self.srcRezxTE.get_text())
+ rezY = float(self.srcRezyTE.get_text())
+ w = int(self.srcWidthTE.get_text())
+ h = int(self.srcHeightTE.get_text())
+
+## self.viewwin.viewarea.remove_layer(self.layer)
+ if self.srcDrv.ShortName == self.dstDrv:
+## projDset = Dset
+## self.layer.set_read_only(FALSE)
+## else:
+ fname = Dset.GetDescription()
+## del Dset
+ projDset = gdal.OpenShared(fname,gdal.GA_Update)
+ else:
+ drv = gdal.GetDriverByName(self.dstDrv)
+ fname = self.fileTE.get_text()
+ projDset = drv.CreateCopy(fname,Dset,
+ options=[self.coptTE.get_text()])
+## del Dset
+
+ projDset.SetProjection(self.srcSRS.ExportToWkt())
+ projDset.SetGeoTransform((ulx,rezX,0.0,uly,0.0,-rezY))
+
+## self.updating = FALSE
+ self.openProjected(projDset)
+
+ def openProjected(self,projDset):
+ if self.viewopt0RB.active:
+ viewwin = self.viewwin
+ viewwin.viewarea.remove_layer(self.layer)
+ self.layer = None
+ elif self.viewopt1RB.active:
+ viewwin = self.viewwin.app.new_view()
+ else:
+ del projDset
+ return
+
+ viewwin.open_gdal_dataset(projDset)
+ del projDset
+
+ def compute(self):
+ ulx = self.src[0]
+ uly = self.src[1]
+ rezX = self.src[2]
+ rezY = self.src[3]
+ width = self.src[4]
+ height = self.src[5]
+ rx = ulx+width*rezX
+ ly = uly-height*rezY
+ corners = [(ulx,uly),(ulx,ly),(rx,uly),(rx,ly)]
+
+ if self.dstSRS.IsSame(self.srcSRS):
+ prjCorners = corners
+ else:
+ ct = osr.CoordinateTransformation(self.srcSRS,self.dstSRS)
+ prjCorners = ct.TransformPoints(corners)
+
+ return GeoInfo(prjCorners,width,height)
+
+ def getSRS(self,layer=None):
+ if layer is None:
+ return
+ srs = osr.SpatialReference()
+ prj = layer.get_projection()
+ if prj is not None:
+ srs.ImportFromWkt(prj)
+ return srs
+
+ def getEPSG(self,srs):
+ if srs.IsGeographic():
+ epsg = srs.GetAuthorityCode('GEOGCS')
+ else:
+ epsg = srs.GetAuthorityCode('PROJCS')
+ return epsg
+
+ def getResamplingAlg(self):
+ algStr = self.algCB.entry.get_text()
+ if algStr == 'Bilinear':
+ alg = gdal.GRA_Bilinear
+ elif algStr == 'Cubic':
+ alg = gdal.GRA_Cubic
+ elif algStr == 'Cubic spline':
+ alg = gdal.GRA_CubicSpline
+ else:
+ alg = gdal.GRA_NearestNeighbour
+
+ return alg
+
+ def setEntryMode(self,src=0):
+ if src:
+ isgeo = self.srcSRS.IsGeographic()
+ self.srcULxTE.setMode(isgeo)
+ self.srcULyTE.setMode(isgeo)
+ else:
+ isgeo = self.dstSRS.IsGeographic()
+ self.dstULxTE.setMode(isgeo)
+ self.dstULyTE.setMode(isgeo)
+
+ def setFilename(self):
+ meta = gdal.GetDriverByName(self.dstDrv).GetMetadata()
+ srcFname = os.path.splitext(self.layer.get_name())[0]
+ if 'DMD_EXTENSION' in meta:
+ projfn = srcFname + '-prj' + os.path.extsep + meta.get('DMD_EXTENSION')
+ else:
+ projfn = srcFname
+ self.fileTE.set_text(projfn)
+
+class GeoEntry(gtk.GtkHBox):
+ def __init__(self,dgsz=33,mnsz=22,scsz=40,mtsz=125):
+ gtk.GtkHBox.__init__(self,spacing=3)
+ self.degsz = dgsz
+ self.metsz = mtsz
+ self.minsz = mnsz
+ self.secsz = scsz
+ self.round = 2
+
+ def connect(self,signal,callback,data):
+ if self.isGeo:
+ self.degTE.connect(signal,callback,data)
+ self.minTE.connect(signal,callback,data)
+ self.secTE.connect(signal,callback,data)
+ else:
+ self.metersTE.connect(signal,callback,data)
+
+ def setRound(self,value):
+ self.round = value
+
+ def setGeoMode(self):
+ self.degTE = self.createEntry(self.degsz,'d')
+ self.minTE = self.createEntry(self.minsz,'m')
+ self.secTE = self.createEntry(self.secsz,'s')
+ self.isGeo = TRUE
+
+ def setMode(self,geo):
+ if len(self.children()):
+ for child in self.children():
+ child.destroy()
+
+ if geo:
+ self.setGeoMode()
+ else:
+ self.setProjMode()
+
+ self.show_all()
+
+ def setProjMode(self):
+ self.metersTE = self.createEntry(self.metsz,'m')
+ self.isGeo = FALSE
+
+ def createEntry(self,size,lbl):
+ te = gtk.GtkEntry()
+ te.set_usize(size,-1)
+ self.add(te,expand=FALSE)
+ self.add(gtk.GtkLabel(lbl),expand=FALSE)
+ return te
+
+ def getDegrees(self):
+ txt = self.degTE.get_text()
+ return self.validateInt(txt)
+
+ def getMinutes(self):
+ txt = self.minTE.get_text()
+ return self.validateInt(txt)
+
+ def getSeconds(self):
+ txt = self.secTE.get_text()
+ return self.validateFloat(txt)
+
+ def getMeters(self):
+ txt = self.metersTE.get_text()
+ return self.validateFloat(txt)
+
+ def validateInt(self,txt):
+ if len(txt) and txt != '-':
+ value = int(txt)
+ else:
+ value = 0
+
+ return value
+
+ def validateFloat(self,txt):
+ if len(txt) and txt != '-':
+ value = float(txt)
+ else:
+ value = 0.0
+
+ return value
+
+ def setDegrees(self,value):
+ self.degTE.set_text(str(value))
+
+ def setMinutes(self,value):
+ self.minTE.set_text(str(value))
+
+ def setSeconds(self,value):
+ self.secTE.set_text(str(round(value,self.round)))
+
+ def setMeters(self,value):
+ self.metersTE.set_text(str(value))
+
+ def setValue(self,value):
+ if self.isGeo:
+ dms = self.deg2dms(value)
+ self.setDegrees(dms[0])
+ self.setMinutes(dms[1])
+ self.setSeconds(dms[2])
+ else:
+ self.setMeters(value)
+
+ def set_text(self,txt):
+ self.setValue(float(txt))
+
+ def getValue(self):
+ dms = []
+ if self.isGeo:
+ dms.append(self.getDegrees())
+ dms.append(self.getMinutes())
+ dms.append(self.getSeconds())
+ return self.dms2deg(dms)
+ else:
+ return self.getMeters()
+
+ def get_text(self):
+ value = self.getValue()
+ return str(value)
+
+ def deg2dms(self,dd):
+ deg = int(dd)
+ dec = abs(dd-deg)
+ mn = int(dec*60)
+ sec = (dec*60 - mn)*60
+ if round(sec,self.round) >= 60.0:
+ sec = 0.0
+ mn+=1
+ return (deg,mn,sec)
+
+ def dms2deg(self,dms):
+ dd = abs(dms[0])+dms[1]/60.0+dms[2]/3600.0
+ if dms[0] < 0:
+ return -dd
+ else:
+ return dd
+
+class GeoInfo:
+ def __init__(self,pts,w,h):
+ self.minX = min(pts[0][0],pts[1][0])
+ self.maxX = max(pts[2][0],pts[3][0])
+ self.minY = min(pts[1][1],pts[3][1])
+ self.maxY = max(pts[0][1],pts[2][1])
+ self.width = w
+ self.height = h
+ self.epsg = 0
+ self.setRezX()
+ self.setRezY()
+
+ def setRezX(self,w=None):
+ if w == None:
+ w = self.width
+ self.rezX = (self.maxX-self.minX)/w
+
+ def setRezY(self,h=None):
+ if h == None:
+ h = self.height
+ self.rezY = (self.maxY-self.minY)/h
+
+ def setWidth(self,rez):
+ self.width = int((self.maxX-self.minX)/rez)
+
+ def setHeight(self,rez):
+ self.height = int((self.maxY-self.minY)/rez)
+
+TOOL_LIST = ['ProjectionTool']
Modified: packages/openev/trunk/tools/rendertest.py
===================================================================
--- packages/openev/trunk/tools/rendertest.py 2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/rendertest.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -68,6 +68,11 @@
# New
#
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
from gtk import *
import gview
Added: packages/openev/trunk/tools/services.txt
===================================================================
--- packages/openev/trunk/tools/services.txt (rev 0)
+++ packages/openev/trunk/tools/services.txt 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,13 @@
+Atlas of Canada,http://atlas.gc.ca:80/cgi-bin/atlaswms_en?
+BTS Roads,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Trans_BTS_Roads?
+Canadian Geographical Names,http://cgns.nrcan.gc.ca/wfs/cubeserv.cgi?
+Cubewerx Mars,http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&VERSION=1.1&REQUEST=GetCapabilities
+DM Solutions Demo,http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?
+EDC GNIS,http://gisdata.usgs.net:80/servlet/com.esri.wms.Esrimap/EDC_GNIS?
+EDC Hydro,http://gisdata.usgs.net:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Hydro_RAD?
+GDAL SRTM30Plus,http://maps.gdal.org/cgi-bin/mapserv_dem?
+LIBC,http://libcwms.gov.bc.ca/wmsconnector/com.esri.wsit.WMSServlet/ogc_layer_service?
+NRN Quebec,http://www.geographynetwork.ca/wmsconnector/com.esri.wsit.WMSServlet/Geobase_NRN_Quebec_I?
+USGS Ortho,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Ortho_133Urban?
+USGS Reference,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_WMS_REF?
+USGS World,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/world?
Added: packages/openev/trunk/tools/wmstool.py
===================================================================
--- packages/openev/trunk/tools/wmstool.py (rev 0)
+++ packages/openev/trunk/tools/wmstool.py 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2206 @@
+##############################################################################
+# wmstool.py, v1.07b 2005/09/14
+#
+# Project: OpenEV
+# Purpose: WMS Client support for OpenEV, tool version.
+# Author: Mario Beauchamp
+# Comments: Beta release for testing.
+# TODO: Cache management dialog. Better handling of exceptions.
+###############################################################################
+#
+# Revision 1.07b 2005/09/14
+# Added Help button.
+# Fixed for Python 2.2.
+#
+# Revision 1.06b 2005/08/16
+# Fixed proxies support so it works with Python <2.3 as well.
+#
+# Revision 1.05b 2005/06/15
+# Added support for http proxy.
+# Changed datatype in vrt files from 'Byte' to datatype of returned images.
+# This will ensure correct interpretation of elevation data, for example.
+# Service exception reports now displayed.
+#
+# Revision 1.04b 2005/03/30
+# Fixed failure to return the proper SRS in getSRS().
+#
+# Revision 1.03b 2005/03/26
+# Corrected problem when saving a new map.
+#
+# Revision 1.02b 2005/03/25
+# Fixed a problem when deleting a map or saving an existing one after edits.
+# Changed the name of the default map to "landsat321" instead of "Landsat321".
+# Added a way to put the tool in the icon bar.
+# Added a way to set a more suitable background color.
+#
+# Revision 1.01b 2005/03/25
+# Corrected a few bugs. Added way to select layers without opening Props window.
+# Added ServiceCaps.validateURL().
+#
+# Revision 1.00b 2005/03/24
+# Beta release.
+#
+###############################################################################
+try:
+ import pygtk
+ pygtk.require("1.2")
+except:
+ pass
+import gtk
+from gtk import TRUE,FALSE # for convenience...
+import os
+import osr
+import vrtutils
+import gdal
+import gvutils
+import gview
+import pickle
+import urllib
+import gvsignaler
+import pgucolor
+import gviewapp
+
+wms_dir = os.path.join(gview.home_dir,'wms')
+cachepath = os.path.join(wms_dir,'cache')
+srv_dir = os.path.join(wms_dir,'services')
+
+global servDic
+
+# set desired proxy in prefs file (.openev) as such:
+# http_proxy=http://170.222.120.200:8000/
+proxy = gview.get_preference('http_proxy')
+if proxy != None:
+ proxyDic = {'http':proxy}
+else:
+ proxyDic = None
+
+def loadServices():
+ global servDic
+ servDic = {}
+ hosts = os.listdir(srv_dir)
+ for host in hosts:
+ srvnames = os.listdir(os.path.join(srv_dir,host))
+ for name in srvnames:
+ servDic[name[:-4]] = host
+
+def openService(srvname):
+ host = servDic[srvname]
+ path = os.path.join(srv_dir,host,srvname+'.xml')
+ if servCaps.open(path):
+ # we don't need the buffer here
+ del servCaps.buffer
+ servCaps.buffer = None
+ return 1
+ else: # unlikely but just in case...
+ gvutils.error(path+' does not appear to be a valid GetCapabilities response.')
+ return 0
+
+
+def createCapsEntry(srvname,path=srv_dir):
+ host,p = urllib.splithost(urllib.splittype(servCaps.href)[1])
+ hname = host.split(':')[0]
+ newhost = os.path.join(path,hname)
+
+ if not os.path.exists(newhost):
+ os.mkdir(newhost)
+
+ newcaps = os.path.join(newhost,srvname+'.xml')
+ fd = file(newcaps,'w')
+ fd.write(servCaps.buffer)
+ fd.close()
+ return hname
+
+def buildServicesDir(lst,path=srv_dir):
+ for line in lst:
+ if not line.startswith('#'):
+ srvname,url = line.split(',')
+ if servCaps.open(url):
+ if createCapsEntry(srvname,path) is None:
+ print "Service "+url+" not saved"
+ outfile = os.path.join(path,srvname+'-tmp.xml')
+ fd = file(outfile,'w')
+ fd.write(servCaps.buffer)
+ fd.close()
+ else:
+ print "Service "+servCaps.title+" saved"
+
+ del servCaps.buffer
+ servCaps.buffer = None
+ else:
+ print "Service "+url+" not saved"
+ print "Server responded:"
+ print servCaps.buffer
+ del servCaps.buffer
+ servCaps.buffer = None
+
+def fixCaps(xmlStr):
+ idx = xmlStr.find('[')
+ if idx > 0:
+ idx2 = xmlStr.find(']>') + 1
+ return xmlStr.replace(xmlStr[idx:idx2],'')
+ return xmlStr
+
+def Element(tag, attrib={}, **extra):
+ attrib = attrib.copy()
+ attrib.update(extra)
+ return _ElementInterface(tag, attrib)
+
+def makeElement(node):
+ if hasattr(node, "tag"):
+ return node
+ attrib = {}
+ tag = ''
+ text = ''
+ children = []
+ element = None
+ if node[0] == gdal.CXT_Element:
+ tag = node[1]
+ for subnode in node[2:]:
+ if subnode[0] == gdal.CXT_Attribute:
+ attrib[subnode[1]] = subnode[2][1]
+ elif subnode[0] == gdal.CXT_Element:
+ children.append(subnode)
+ elif subnode[0] == gdal.CXT_Text:
+ text = subnode[1]
+
+ element = Element(tag,attrib)
+ element.text = text
+ element._children = children
+
+ return element
+
+class _ElementInterface:
+ tag = None
+ attrib = None
+ text = None
+ def __init__(self, tag, attrib):
+ self.tag = tag
+ self.attrib = attrib
+ self._children = []
+
+ def __getitem__(self,index):
+ return self._children[index]
+
+ def __len__(self):
+ return len(self._children)
+
+ def _find(self,path,all=0):
+ foundLst=[]
+ splitted = path.split('/',1)
+ if len(splitted) == 2:
+ component, remainder = splitted
+ else:
+ component, remainder = splitted[0], None
+ for subnode in self._children:
+ if subnode[1] == component:
+ if remainder is None:
+ foundLst.append(subnode)
+ if not all:
+ break
+ else:
+ subElem = makeElement(subnode)
+ subLst = subElem._find(remainder,all)
+ if subLst is not None:
+ if all == 1:
+ foundLst.extend(subLst)
+ else:
+ foundLst.append(subLst)
+
+ if len(foundLst) == 0:
+ return None
+ elif all == 1:
+ return foundLst
+ else:
+ return foundLst[0]
+
+ def append(self,element):
+ self._children.append(element)
+
+ def get(self,key,default=None):
+ return self.attrib.get(key,default)
+
+ def find(self,path):
+ result = self._find(path)
+ if result is None:
+ return None
+
+ return makeElement(result)
+
+ def findall(self,path):
+ result = self._find(path,all=1)
+ if result is None:
+ return None
+
+ foundLst = []
+ for child in result:
+ foundLst.append(makeElement(child))
+
+ return foundLst
+
+ def findtext(self,path,default=None):
+ result = self.find(path)
+ if result is None:
+ return default
+
+ return result.text
+
+ def getiterator(self,tag=None):
+ nodes = []
+ for node in self._children:
+ elem = makeElement(node)
+ if tag is None or elem.tag == tag:
+ nodes.append(elem)
+ return nodes
+
+ def items(self):
+ return self.attrib.items()
+
+ def keys(self):
+ return self.attrib.keys()
+
+class ElementTree:
+ def __init__(self, element=None):
+ self._root = element # first node
+
+ def getroot(self):
+ return self._root
+
+ def parse(self,capsBuf):
+ rawXML = fixCaps(capsBuf)
+ try:
+ tree = gdal.ParseXMLString(rawXML)
+ except:
+ return None
+
+ element = makeElement(tree[len(tree)-1])
+ if element is None:
+ return None
+
+ self._root = element
+
+ return rawXML
+
+ def find(self,path):
+ return self._root.find(path)
+
+ def findall(self,path):
+ return self._root.findall(path)
+
+ def findtext(self,path,default=None):
+ return self._root.findtext(path,default)
+
+ def getiterator(self,tag=None):
+ return self._root.getiterator(tag)
+
+class ServiceCaps(ElementTree):
+ def __init__(self):
+ ElementTree.__init__(self)
+ self.title = None
+ self.buffer = None
+
+ def open(self,url):
+ del self._root
+ self._root = None
+ capsBuf = self.getCapabilities(url)
+ # checks
+ if capsBuf is None:
+ self.buffer = ''
+ return 0
+ self.buffer = self.parse(capsBuf)
+ if self._root is None:
+ return 0
+ if self._root.tag != 'WMT_MS_Capabilities':
+ return 0
+
+ self.version = self._root.get('version')
+ servTree = self.find('Service')
+ self.name = servTree.findtext('Name')
+ self.abstract = servTree.findtext('Abstract')
+ self.title = servTree.findtext('Title')
+ self.layer = self.find('Capability/Layer')
+ self.layer.title = self.layer.findtext('Title')
+ res = self.find('Capability/Request/GetMap/DCPType/HTTP/Get/OnlineResource')
+ self.href = res.get('xlink:href')
+ if not '?' in self.href:
+ self.href+='?'
+ # we got here so everything is ok.
+ return 1
+
+ def getCapabilities(self,url):
+ type,path = urllib.splittype(url)
+ if path.endswith('?'):
+ # 1.1.x only
+ url+='VERSION=1.1&SERVICE=WMS&REQUEST=GetCapabilities'
+ if type == 'http':
+ try:
+ opener = urllib.URLopener(proxies=proxyDic)
+ fp = opener.open(url)
+ except:
+ return None
+ else:
+ try:
+ fp = file(url,'r')
+ except:
+ return None
+
+ return fp.read()
+
+ def getTitles(self,tree):
+ keys = []
+ for node in tree:
+ keys.append(node.findtext('Title'))
+
+ keys.sort()
+ return keys
+
+ def getLayerNode(self,title=None,name=None):
+ # check if we have the root layer
+ if name is None:
+ if title == self.layer.title:
+ return self.layer
+ else:
+ layname = self.layer.findtext('Name')
+ if layname is not None and layname == name:
+ return self.layer
+
+ # else iterate the root tree
+ rootTree = self.layer.findall('Layer')
+ return self.findLayer(rootTree,title,name)
+
+ def findLayer(self,tree,title,name):
+ if name is None:
+ laynode = self.findByTitle(tree,title)
+ else:
+ laynode = self.findByName(tree,name)
+ if laynode is not None:
+ return laynode
+ for layer in tree:
+ if layer.find('Layer'):
+ layerTree = layer.findall('Layer')
+ laynode = self.findLayer(layerTree,title,name)
+ if laynode is not None:
+ return laynode
+
+ def findByTitle(self,tree,title):
+ for node in tree:
+ ntitle = node.findtext('Title')
+ if ntitle == title:
+ return node
+
+ def findByName(self,tree,name):
+ for node in tree:
+ nname = node.findtext('Name')
+ if nname == name:
+ return node
+
+ def getPropList(self,path):
+ propTree = self.findall(path)
+ propLst = []
+ for prop in propTree:
+ propLst.append(prop.text)
+
+ propLst.sort()
+ return propLst
+
+ def getSRSList(self,tree):
+ srsLst = []
+ srsTree = tree.find('SRS')
+ if srsTree is None:
+ return None
+
+ lst = srsTree.text.split(' ')
+ if len(lst) == 1:
+ for srsElem in tree.findall('SRS'):
+ srsLst.append(srsElem.text)
+ else:
+ for srsTxt in lst:
+ srsLst.append(srsTxt)
+
+ srsLst.sort()
+ return srsLst
+
+ def sortLayerTree(self,laynode):
+ titles = []
+ layerTree = laynode.getiterator('Layer')
+ for node in layerTree:
+ titles.append(node.findtext('Title'))
+
+ titles.sort()
+ sorted = []
+ for title in titles:
+ sorted.append(self.findByTitle(layerTree,title))
+
+ return sorted
+
+ def encodeURL(self,parmDic,url=None):
+ parms = {}
+ if url is None:
+ url = self.href
+
+ for parm,value in parmDic.items():
+ if parm == 'STYLES' or parm == 'map':
+ pass
+ elif parm == 'LAYERS':
+ layerLst = []
+ styleLst = []
+ for title in parmDic['LAYERS']:
+ node = self.getLayerNode(title)
+ name = node.findtext('Name')
+ layerLst.append(name)
+ idx = parmDic['LAYERS'].index(title)
+ stitle = parmDic['STYLES'][idx]
+ if len(stitle):
+ style = self.findByTitle(node.findall('Style'),stitle)
+ sname = style.findtext('Name')
+ else:
+ sname = ''
+ styleLst.append(sname)
+ parms['LAYERS'] = ','.join(layerLst)
+ parms['STYLES'] = ','.join(styleLst)
+ elif type(value) == type([]):
+ parms[parm] = ','.join(parmDic[parm])
+ else:
+ parms[parm] = parmDic[parm]
+
+ return url + urllib.urlencode(parms)
+
+ def decodeURL(self,url):
+ splitLst = url.split('?')
+ parmLst = splitLst[1].split('&')
+ parmDic = {}
+ for parmStr in parmLst:
+ parmLst = parmStr.split('=')
+ parmDic[parmLst[0]] = urllib.unquote_plus(parmLst[1])
+
+ layerLst = parmDic['LAYERS'].split(',')
+ styleLst = parmDic['STYLES'].split(',')
+ laytitles = []
+ stytitles = []
+ for name in layerLst:
+ node = self.getLayerNode(name=name)
+ title = node.findtext('Title')
+ laytitles.append(title)
+ idx = layerLst.index(name)
+ if len(styleLst[idx]):
+ style = self.findByName(node.findall('Style'),styleLst[idx])
+ stitle = style.findtext('Title')
+ else:
+ stitle = ''
+ stytitles.append(stitle)
+
+ parmDic['LAYERS'] = laytitles
+ parmDic['STYLES'] = stytitles
+
+ return parmDic
+
+ def validateSRS(self,srs):
+ srsLst = self.getSRSList(self.layer)
+ for srsTxt in srsLst:
+ if srsTxt == srs:
+ return 1
+
+ return 0
+
+ def validateURL(self,url):
+ try:
+ params = self.decodeURL(url)
+ except:
+ return 'Invalid URL'
+
+ def getMap(self,url):
+ opener = urllib.URLopener(proxies=proxyDic)
+ f = opener.open(url)
+ h = f.info()
+ if h.getheader('Content-Type') == 'application/vnd.ogc.se_xml':
+ print 'Exception occured'
+ return f
+
+servCaps = ServiceCaps()
+
+class WMSTool(gviewapp.Tool_GViewApp):
+ def __init__(self,app=None):
+ gviewapp.Tool_GViewApp.__init__(self,app)
+ self.init_menu()
+ # uncomment this line if you want to create an icon entry
+## self.init_icon()
+
+ def launch_window(self,*args):
+ self.win = WMSDialog()
+ if self.win is None:
+ return
+ else:
+ self.win.show()
+
+ def init_menu(self):
+ self.menu_entries.set_entry("Tools/WMS maps",1,self.launch_window)
+
+ def init_icon(self):
+ self.icon_entries.set_entry("worldrgb.xpm","WMS maps",1,self.launch_window)
+
+class WMSDialog(gtk.GtkWindow):
+ def __init__(self):
+ gtk.GtkWindow.__init__(self,title='WMS Tool')
+ self.set_policy(FALSE,TRUE,TRUE)
+ self.tips = gtk.GtkTooltips()
+ self.updating = TRUE
+ loadServices()
+ self.curServ = None
+ self.loadMaps()
+ self.setMap(self.mapKeys[0])
+ self.rezX = 1.0
+ self.rezY = 1.0
+ self.extentBX = None
+ self.viewwin = gview.app.view_manager.get_active_view_window()
+ self.srs = self.getSRS()
+ # uncomment this line if you want to set the view's BG color to yellow
+## self.viewwin.viewarea.set_background_color((1,1,0.8,1))
+ self.display_change_id = self.viewwin.viewarea.connect("view-state-changed",self.viewChanged)
+ self.active_changed_id = self.viewwin.viewarea.connect("active-changed",self.layerChanged)
+
+ gui_OK = self.createGUI()
+ if gui_OK is FALSE:
+ return None
+ else:
+ self.updateGUI()
+ self.updateExtentGUI()
+ self.updating = FALSE
+ self.show_all()
+
+ def createGUI(self):
+ mainbox = gtk.GtkVBox(spacing=5)
+ mainbox.set_border_width(5)
+ self.add(mainbox)
+
+ frame = gtk.GtkFrame("Map")
+ mainbox.add(frame,expand=FALSE)
+
+# Map ctrl
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ frame.add(box)
+ self.mapCB = gtk.GtkCombo()
+ self.mapCB.set_popdown_strings(self.mapKeys)
+ self.mapCB.list.connect('selection-changed',self.mapSelected)
+ box.add(self.mapCB,expand=FALSE)
+ box.add(gtk.GtkLabel('Background color'),expand=FALSE)
+ self.colorBT = pgucolor.ColorButton((0,0,0,0))
+ box.add(self.colorBT,expand=FALSE)
+
+# Map params
+ mainbox.add(self.createCornersGUI(),expand=FALSE)
+# Resolution
+ mainbox.add(self.createResolutionGUI(),expand=FALSE)
+# Size
+ mainbox.add(self.createSizeGUI(),expand=FALSE)
+
+# Extent
+ frame = gtk.GtkFrame("Extent")
+ mainbox.add(frame,expand=FALSE)
+ self.extentBX = gtk.GtkHBox(spacing=3)
+ self.extentBX.set_border_width(3)
+ frame.add(self.extentBX)
+# Controls
+ frame = gtk.GtkFrame("Controls")
+ mainbox.add(frame,expand=FALSE)
+ vbox = gtk.GtkVBox(spacing=1)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box,expand=FALSE)
+ self.autoTO = gtk.GtkCheckButton(label='Update from')
+ self.autoTO.set_active(TRUE)
+ self.autoTO.connect('toggled',self.autoUpdateChanged)
+ box.add(self.autoTO,expand=FALSE)
+
+ self.viewModeRB = gtk.GtkRadioButton(label='view')
+ self.viewModeRB.set_active(TRUE)
+ self.viewModeRB.connect('toggled',self.autoUpdateChanged)
+ box.add(self.viewModeRB,expand=FALSE)
+ self.layerModeRB = gtk.GtkRadioButton(label='layer',group=self.viewModeRB)
+ self.layerModeRB.connect('toggled',self.autoUpdateChanged)
+ box.add(self.layerModeRB,expand=FALSE)
+
+ box.add(gtk.GtkLabel('EPSG:'),expand=FALSE)
+ self.epsgTE = gtk.GtkEntry()
+ self.epsgTE.set_usize(50,-1)
+ self.epsgTE.set_text(self.getEPSG())
+ self.epsgTE.connect('activate',self.epsgChanged)
+ box.add(self.epsgTE,expand=FALSE)
+
+
+# Buttons
+ box = gtk.GtkHBox(spacing=5)
+ mainbox.add(box,expand=FALSE)
+ getBT = gtk.GtkButton('Get map')
+ getBT.connect('clicked',self.addLayer)
+ box.add(getBT)
+
+ validBT = gtk.GtkButton('Validate')
+ self.tips.set_tip(validBT,'Validate map')
+ validBT.connect('clicked',self.validateMap)
+ box.add(validBT)
+
+ setupBT = gtk.GtkButton('Setup')
+ self.tips.set_tip(setupBT,'Setup maps and services')
+ setupBT.connect('clicked',self.setup)
+ box.add(setupBT)
+
+ closeBT = gtk.GtkButton('Close')
+ closeBT.connect('clicked',self.close)
+ box.add(closeBT)
+
+ helpBT = gtk.GtkButton('Help')
+ helpBT.connect('clicked',self.help)
+ box.add(helpBT)
+
+ def createCornersGUI(self):
+ frame = gtk.GtkFrame("Corners")
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ # create entries
+ isgeo = self.srs.IsGeographic()
+ self.ulxGE = GeoEntry(isgeo)
+ self.ulyGE = GeoEntry(isgeo)
+ self.lrxGE = GeoEntry(isgeo)
+ self.lryGE = GeoEntry(isgeo)
+
+# Upper left corner
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box)
+
+ box.add(gtk.GtkLabel('UL '))
+ box.add(gtk.GtkLabel('X:'))
+ self.ulxGE.connect('changed',self.updateFromEntry,'ulx')
+ box.add(self.ulxGE)
+
+ box.add(gtk.GtkLabel('Y:'))
+ self.ulyGE.connect('changed',self.updateFromEntry,'uly')
+ box.add(self.ulyGE)
+
+# Lower right corner
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box)
+
+ box.add(gtk.GtkLabel('LR '))
+ box.add(gtk.GtkLabel('X:'))
+ self.lrxGE.connect('changed',self.updateFromEntry,'lrx')
+ box.add(self.lrxGE)
+
+ box.add(gtk.GtkLabel('Y:'))
+ self.lryGE.connect('changed',self.updateFromEntry,'lry')
+ box.add(self.lryGE)
+
+ return frame
+
+ def createResolutionGUI(self):
+ frame = gtk.GtkFrame("Resolution")
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box)
+
+ # create entries
+ isgeo = self.srs.IsGeographic()
+ self.rezxGE = GeoEntry(isgeo,dgsz=15,scsz=48,mtsz=125)
+ self.rezxGE.setRound(3)
+ self.rezyGE = GeoEntry(isgeo,dgsz=15,scsz=48,mtsz=125)
+ self.rezyGE.setRound(3)
+ box.add(gtk.GtkLabel('X:'))
+ self.rezxGE.connect('changed',self.setResolution,'rezX')
+ box.add(self.rezxGE)
+
+ box.add(gtk.GtkLabel('-'))
+ self.linkTO = gtk.GtkCheckButton(label='-')
+ self.linkTO.set_active(TRUE)
+ box.add(self.linkTO,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Y:'))
+ self.rezyGE.connect('changed',self.setResolution,'rezY')
+ box.add(self.rezyGE)
+
+ return frame
+
+ def createSizeGUI(self):
+ frame = gtk.GtkFrame("Size")
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box,expand=FALSE)
+
+ box.add(gtk.GtkLabel('Width: '),expand=FALSE)
+ self.wTE = gtk.GtkEntry()
+ self.wTE.set_usize(50,-1)
+ self.wTE.connect('changed',self.updateFromEntry,'w')
+ box.add(self.wTE,expand=FALSE)
+ box.add(gtk.GtkLabel('px '),expand=FALSE)
+
+ isgeo = self.srs.IsGeographic()
+ self.xGE = GeoEntry(isgeo)
+ self.xGE.connect('changed',self.updateFromEntry,'x')
+ box.add(self.xGE)
+
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box)
+
+ box.add(gtk.GtkLabel('Height:'),expand=FALSE)
+ self.hTE = gtk.GtkEntry()
+ self.hTE.set_usize(50,-1)
+ self.hTE.connect('changed',self.updateFromEntry,'h')
+ box.add(self.hTE,expand=FALSE)
+ box.add(gtk.GtkLabel('px '),expand=FALSE)
+
+ self.yGE = GeoEntry(isgeo)
+ self.yGE.connect('changed',self.updateFromEntry,'y')
+ box.add(self.yGE)
+
+ return frame
+
+ def updateExtentGUI(self):
+ children = self.extentBX.children()
+ if len(children):
+ for child in children:
+ child.destroy()
+
+ if 'Extents' in self.curMap:
+ vbox = gtk.GtkVBox(spacing=3)
+ self.extentBX.add(vbox)
+ for parm,value in self.curMap['Extents'].items():
+ box = gtk.GtkHBox(spacing=2)
+ vbox.add(box,expand=FALSE)
+ box.add(gtk.GtkLabel(parm+': '),expand=FALSE)
+ box.add(gtk.GtkLabel(value),expand=FALSE)
+ editBT = gtk.GtkButton('Edit')
+ editBT.set_usize(40,18)
+ editBT.connect('clicked',self.editExtentClicked)
+ self.extentBX.add(editBT,expand=FALSE)
+ else:
+ self.extentBX.add(gtk.GtkLabel('No extents defined'))
+
+ self.extentBX.show_all()
+
+ def colorClicked(self,bt):
+ self.bgColor = bt.get_color()
+
+ def help(self,bt):
+ from gvhtml import LaunchHTML
+ LaunchHTML('http://pages.infinit.net/starged/openev/wmstool/home.htm')
+
+ def layerChanged(self,view):
+ if not self.autoTO.active or self.updating:
+ return
+
+ layer = view.active_layer()
+ if layer is None or gvutils.is_of_class(layer.__class__,'GvRasterLayer' ) == 0:
+ return
+
+ srs = self.getSRS()
+ if not srs.IsSame(self.srs):
+ self.srs = srs
+ self.epsgTE.set_text(self.getEPSG())
+ self.updateModeGUI()
+
+ self.updateGUI()
+
+ def viewChanged(self,view):
+ if not self.autoTO.active or self.updating or self.layerModeRB.active:
+ return
+
+ self.updateGUI()
+
+ def editExtentClicked(self,*args):
+ self.showEditExtentGUI()
+
+ def mapSelected(self,*args):
+ if self.updating:
+ return
+ mapKey = self.mapCB.entry.get_text()
+ self.setMap(mapKey)
+ self.updateExtentGUI()
+
+ def extentChanged(self,entry,name):
+ if self.updating: return
+ self.curMap['Extents'][name] = entry.get_text()
+
+ def autoUpdateChanged(self,*args):
+ if not self.autoTO.active:
+ return
+ if self.layerModeRB.active:
+ layer = self.viewwin.viewarea.active_layer()
+ if layer is None or gvutils.is_of_class(layer.__class__,'GvRasterLayer' ) == 0:
+ return
+
+ srs = self.getSRS()
+ if not srs.IsSame(self.srs):
+ self.srs = srs
+ self.epsgTE.set_text(self.getEPSG())
+ self.updateModeGUI()
+
+ self.updateGUI()
+
+ def epsgChanged(self,*args):
+ espgTxt = self.epsgTE.get_text()
+ self.srs = self.getSRS(int(espgTxt))
+ self.updateModeGUI()
+ self.updateGUI()
+
+ def showEditExtentGUI(self):
+ for child in self.extentBX.children():
+ child.destroy()
+ parms = servCaps.decodeURL(self.curMap['URL'])
+ layerNode = servCaps.getLayerNode(parms['LAYERS'][0])
+ extentTree = layerNode.findall('Extent')
+ vbox = gtk.GtkVBox(spacing=3)
+ self.extentBX.add(vbox,expand=FALSE)
+ for extent in extentTree:
+ name = extent.get('name')
+ extentTE = ExtentEntry(extent)
+ extentTE.connect('changed',self.extentChanged,name)
+ vbox.add(extentTE,expand=FALSE)
+ value = extent.text
+ if name in self.curMap['Extents']:
+ value = self.curMap['Extents'][name]
+ extentTE.entry.set_text(value)
+
+ self.extentBX.show_all()
+
+ def updateGUI(self,*args):
+ self.updating = TRUE
+ if self.viewModeRB.active:
+ params = self.getInfoFromView()
+ elif self.layerModeRB.active:
+ params = self.getInfoFromLayer()
+ else:
+ return
+ self.ulxGE.setValue(params[0])
+ self.ulyGE.setValue(params[1])
+ self.lrxGE.setValue(params[2])
+ self.lryGE.setValue(params[3])
+ self.rezxGE.setValue(self.rezX)
+ self.rezyGE.setValue(abs(self.rezX))
+ self.wTE.set_text(str(params[4]))
+ self.hTE.set_text(str(params[5]))
+ self.xGE.setValue(params[6])
+ self.yGE.setValue(params[7])
+ self.updating = FALSE
+
+ def updateModeGUI(self):
+ self.updating = TRUE
+ isgeo = self.srs.IsGeographic()
+ self.ulxGE.setMode(isgeo)
+ self.ulyGE.setMode(isgeo)
+ self.lrxGE.setMode(isgeo)
+ self.lryGE.setMode(isgeo)
+ self.rezxGE.setMode(isgeo)
+ self.rezyGE.setMode(isgeo)
+ self.xGE.setMode(isgeo)
+ self.yGE.setMode(isgeo)
+ self.updating = FALSE
+
+ def updateFromEntry(self,entry,id):
+ if self.updating:
+ return
+ self.updating = TRUE
+ rezX = self.rezX
+ rezY = self.rezY
+ if id == 'lrx':
+ lrx = self.lrxGE.getValue()
+ ulx = self.ulxGE.getValue()
+ x = abs(ulx - lrx)
+ self.xGE.setValue(x)
+ w = int(x/rezX)
+ self.wTE.set_text(str(w))
+ elif id == 'lry':
+ lry = self.lryGE.getValue()
+ uly = self.ulyGE.getValue()
+ y = abs(uly - lry)
+ self.yGE.setValue(y)
+ h = int(y/abs(rezY))
+ self.hTE.set_text(str(h))
+ elif id == 'w' or id == 'ulx':
+ txt = self.wTE.get_text()
+ if not len(txt): return
+ w = int(txt)
+ x = w*rezX
+ self.xGE.setValue(x)
+ ulx = self.ulxGE.getValue()
+ lrx = ulx+x
+ self.lrxGE.setValue(lrx)
+ elif id == 'h' or id == 'uly':
+ txt = self.hTE.get_text()
+ if not len(txt): return
+ h = int(txt)
+ y = h*rezY
+ self.yGE.setValue(abs(y))
+ uly = self.ulyGE.getValue()
+ lry = uly+y
+ self.lryGE.setValue(lry)
+ elif id == 'x':
+ x = self.xGE.getValue()
+ w = int(x/rezX)
+ self.wTE.set_text(str(w))
+ ulx = self.ulxGE.getValue()
+ lrx = ulx+x
+ self.lrxGE.setValue(lrx)
+ elif id == 'y':
+ y = self.yGE.getValue()
+ h = int(y/abs(rezY))
+ self.hTE.set_text(str(h))
+ uly = self.ulyGE.getValue()
+ lry = uly-y
+ self.lryGE.setValue(lry)
+
+ self.updating = FALSE
+
+ def getInfoFromView(self):
+ view = self.viewwin.viewarea
+ bbox = view.get_extents()
+ w = view.get_width()
+ h = view.get_height()
+ ulx = bbox[0]
+ uly = bbox[3]
+ lrx = bbox[2]
+ lry = bbox[1]
+ dx = abs(ulx - lrx)
+ dy = abs(uly - lry)
+ self.rezX = dx/w
+ self.rezY = -dy/h
+ return (ulx,uly,lrx,lry,w,h,dx,dy)
+
+ def getInfoFromLayer(self):
+ layer = self.viewwin.viewarea.active_layer()
+ if layer is None:
+ return
+ ds = layer.get_parent().get_dataset()
+ w = ds.RasterXSize
+ h = ds.RasterYSize
+ geoTr = ds.GetGeoTransform()
+ ulx = geoTr[0]
+ uly = geoTr[3]
+ self.rezX = geoTr[1]
+ self.rezY = geoTr[5]
+ lrx = ulx + w*self.rezX
+ lry = uly + h*self.rezY
+ dx = abs(ulx - lrx)
+ dy = abs(uly - lry)
+ return (ulx,uly,lrx,lry,w,h,dx,dy)
+
+ def addLayer(self,*args):
+ mapfn = self.checkCache(self.curMap['Name'])
+ self.updateMapURL()
+
+ wmsFile = servCaps.getMap(self.curMapURL)
+ h = wmsFile.info()
+ if h.getheader('Content-Type') == 'application/vnd.ogc.se_xml':
+## wmsFile = file('c:\\FWTools\\wms\\cache\\landsat321_23-exception.xml')
+ excepStr = ''
+ line = wmsFile.readline()
+ while len(line):
+ if line.find('<ServiceException code')>0:
+ excepStr += wmsFile.readline()
+ line = wmsFile.readline()
+ wmsFile.close()
+ gvutils.error("Error getting map. Server responded:\n\n"+excepStr)
+## excepFile = open(mapfn+'-exception.xml','wb')
+## excepFile.write(buf)
+## excepFile.close()
+ return
+
+ layerFile = open(mapfn+'.tmp','wb')
+ layerFile.write(wmsFile.read())
+ layerFile.close()
+ wmsFile.close()
+
+ ds = gdal.Open(mapfn+'.tmp',gdal.GA_ReadOnly)
+ if ds is None:
+ gvutils.error("Error opening image")
+ return
+
+ w = ds.RasterXSize
+ h = ds.RasterYSize
+ mapVrt = vrtutils.VRTDatasetConstructor(w, h)
+
+ mapVrt.SetSRS(self.srs.ExportToWkt())
+ mapVrt.SetGeoTransform(self.getGeoTransform())
+
+ nBands = ds.RasterCount
+ fname = ds.GetDescription()
+ if nBands == 1:
+ band = ds.GetRasterBand(1)
+ nodata = band.GetNoDataValue()
+ ci = band.GetRasterColorInterpretation()
+ dtype = gdal.GetDataTypeName(band.DataType)
+ if ci == gdal.GCI_PaletteIndex:
+ ct = band.GetRasterColorTable()
+ mapVrt.AddSimpleBand(fname,1,dtype,NoDataValue=nodata,ColorInterp='Palette',colortable=ct)
+ else:
+ mapVrt.AddSimpleBand(fname,1,dtype,NoDataValue=nodata,ColorInterp='Grey')
+ else:
+ for bandno in range(1,nBands+1):
+ band = ds.GetRasterBand(bandno)
+ nodata = band.GetNoDataValue()
+ dtype = gdal.GetDataTypeName(band.DataType)
+ mapVrt.AddSimpleBand(fname,bandno,dtype,NoDataValue=nodata)
+
+ mapFile = open(mapfn+'.vrt','w')
+ mapFile.writelines(mapVrt.GetVRTString())
+ mapFile.close()
+
+ self.viewwin.open_gdal_dataset(gdal.Open(mapfn+'.vrt'))
+
+ def checkCache(self,mapname):
+ count = 1
+ filtLst = filter(lambda n:n.startswith(mapname) and n.endswith('vrt'),
+ os.listdir(cachepath))
+ inLst = TRUE
+ while inLst:
+ name = mapname+'_'+str(count)
+ if name+'.vrt' in filtLst:
+ count+=1
+ else:
+ inLst = FALSE
+
+ return os.path.join(cachepath,name)
+
+ def setup(self,*args):
+ SetupDialog(self)
+
+ def loadMaps(self):
+ try:
+ maps = pickle.load(open(os.path.join(wms_dir,'maps.dat'),'r'))
+ except:
+ maps = {'True Color Landsat': {'Name':"landsat321",
+ 'Title':"True Color Landsat",
+ 'Server':'OnEarth',
+ 'URL':"http://wms.jpl.nasa.gov/wms.cgi?VERSION=1.1.1&LAYERS=global_mosaic_base"+ \
+ "&STYLES=visual&FORMAT=image%2Fpng&REQUEST=GetMap&SERVICE=WMS" + \
+ "&EXCEPTIONS=application%2Fvnd.ogc.se_xml"
+ }
+ }
+
+ self.maps = maps
+ self.mapKeys = self.maps.keys()
+ self.mapKeys.sort()
+
+ def setMap(self,mapKey):
+ self.updating = TRUE
+ self.curMap = self.maps[mapKey]
+ srvname = self.curMap['Server']
+ if self.curServ is not None:
+ if self.curServ == srvname: # don't open if it is already
+ self.updating = FALSE
+ return
+ if openService(srvname):
+ self.curServ = srvname
+ self.updating = FALSE
+
+ def validateMap(self,*args):
+ # will eventually have more checks, only SRS for now
+ result = ''
+ parms = self.addParms()
+ self.updateMapURL(parms)
+ check = servCaps.validateURL(self.curMapURL)
+ if check is not None:
+ result+=check
+ elif not servCaps.validateSRS(parms['SRS']):
+ result+='Invalid SRS\n'
+ if len(result):
+ result+='Map is invalid. Verify parameters above.\nURL:'
+ else:
+ result+='Map is valid.\nLocal file:'
+ result+=self.checkCache(self.curMap['Name'])
+ result+='\nURL:'
+
+ showValidateMapResult(result,self.curMapURL)
+
+ def addParms(self):
+ bbox = []
+ parms = {}
+ bbox.append(self.ulxGE.get_text())
+ bbox.append(self.lryGE.get_text())
+ bbox.append(self.lrxGE.get_text())
+ bbox.append(self.ulyGE.get_text())
+ parms['BBOX'] = bbox
+ parms['WIDTH'] = self.wTE.get_text()
+ parms['HEIGHT'] = self.hTE.get_text()
+ parms['SRS'] = 'EPSG:'+self.epsgTE.get_text()
+ color = self.colorBT.get_color()
+ if color[3] == 0.0:
+ parms['TRANSPARENT'] = 'TRUE'
+ else:
+ color = int(color[0]*16711425)+int(color[1]*65535)+int(color[2]*255)
+ parms['BGCOLOR'] = hex(color)
+ parms['TRANSPARENT'] = 'FALSE'
+ if 'Extents' in self.curMap:
+ for extent,value in self.curMap['Extents'].items():
+ if extent in ['time','elevation']:
+ parms[extent] = value
+ else:
+ parms['dim_'+extent] = value
+ return parms
+
+ def updateMapURL(self,parms=None):
+ if parms is None:
+ parms = self.addParms()
+ self.curMapURL = servCaps.encodeURL(parms,self.curMap['URL']+'&')
+
+ def getGeoTransform(self):
+ ulx = self.ulxGE.getValue()
+ uly = self.ulyGE.getValue()
+ rezX = self.rezX
+ rezY = self.rezY
+ return [ulx,rezX,0,uly,0,rezY]
+
+ def getSRS(self,epsg=None):
+ srs = osr.SpatialReference()
+ if epsg is None:
+ view = self.viewwin.viewarea
+ proj = view.get_projection()
+ if proj is not None:
+ srs.ImportFromWkt(proj)
+ return srs
+
+ try: # in case of epsg not recognised
+ srs.ImportFromEPSG(epsg)
+ except:
+ srs.ImportFromEPSG(4326) # default: WGS84 GEOGCS
+
+ return srs
+
+ def getEPSG(self):
+ if self.srs.IsGeographic():
+ epsg = self.srs.GetAuthorityCode('GEOGCS')
+ else:
+ epsg = self.srs.GetAuthorityCode('PROJCS')
+
+ return str(epsg)
+
+ def setResolution(self,entry,id):
+ if self.updating:
+ return
+ if id == 'rezX':
+ self.rezX = self.rezxGE.getValue()
+ self.updateFromEntry(entry,'w')
+ if self.linkTO.active:
+ self.rezY = -self.rezX
+ self.rezyGE.setValue(self.rezX)
+ elif id == 'rezY':
+ self.rezY = -self.rezyGE.getValue()
+ self.updateFromEntry(entry,'h')
+
+ def close(self,*args):
+ self.viewwin.viewarea.disconnect(self.active_changed_id)
+ self.viewwin.viewarea.disconnect(self.display_change_id)
+ self.destroy()
+
+class SetupDialog(gtk.GtkWindow):
+ def __init__(self,mapwin):
+ gtk.GtkWindow.__init__(self,title='Setup')
+ self.set_policy(FALSE,TRUE,TRUE)
+ self.tips = gtk.GtkTooltips()
+ self.curServ = None
+ self.mapDic = mapwin.maps
+ self.mapKeys = mapwin.mapKeys
+ self.mapWin = mapwin
+ self.curMap = None
+ self.updating = TRUE
+ self.editingMap = FALSE
+ self.editingSrv = FALSE
+ self.layerDlg = None
+ self.connect('delete-event',self.close)
+
+ gui_OK = self.createGUI()
+ if gui_OK is FALSE:
+ return None
+ else:
+ self.updateServiceInfo()
+ self.updateMapInfo()
+ self.show_all()
+
+ self.updating = FALSE
+ self.mapCB.entry.set_text(mapwin.curMap['Title'])
+
+ def createGUI(self):
+ mainbox = gtk.GtkVBox(spacing=5)
+ mainbox.set_border_width(5)
+ self.add(mainbox)
+
+# Maps
+ frame = gtk.GtkFrame("Maps")
+ mainbox.add(frame, expand=FALSE)
+ vbox = gtk.GtkVBox()
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box, expand=FALSE)
+ self.mapCB = gtk.GtkCombo()
+ self.mapCB.disable_activate()
+ self.mapCB.entry.connect('changed',self.mapSelected)
+ box.add(self.mapCB,expand=FALSE)
+ box.add(gtk.GtkLabel('Name:'),expand=FALSE)
+ self.mapnameTE = gtk.GtkEntry()
+ self.mapnameTE.set_usize(100,-1)
+ box.add(self.mapnameTE,expand=FALSE)
+
+ delBT = gtk.GtkButton("Del")
+ self.tips.set_tip(delBT,'Delete map')
+ delBT.connect("clicked", self.delMap)
+ box.add(delBT)
+ newBT = gtk.GtkButton("New")
+ self.tips.set_tip(newBT,'New map')
+ newBT.connect("clicked", self.enterMap)
+ box.add(newBT)
+ self.saveBT = gtk.GtkButton("Save")
+ self.tips.set_tip(self.saveBT,'Save map')
+ self.saveBT.connect("clicked", self.saveMap)
+ box.add(self.saveBT)
+
+ self.selectedCL = gtk.GtkCList(cols=2, titles=['Layer','Style'])
+ self.selectedCL.set_column_width(0,270)
+ self.selectedCL.set_column_resizeable(0,TRUE)
+ self.selectedCL.set_column_resizeable(1,TRUE)
+ self.selectedCL.connect('select-row',self.selectedRow)
+ swin = gtk.GtkScrolledWindow()
+ swin.set_usize(-1,150)
+ swin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+ swin.add_with_viewport(self.selectedCL)
+ vbox.add(swin, expand=FALSE)
+
+# Services
+ frame = gtk.GtkFrame("Services")
+ mainbox.add(frame, expand=FALSE)
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ box = gtk.GtkHBox(spacing=5)
+ box.set_border_width(5)
+ vbox.add(box, expand=FALSE)
+ self.servCB = gtk.GtkCombo()
+ self.servCB.set_usize(250,-1)
+ self.servCB.disable_activate()
+ self.servCB.entry.connect('activate',self.newService)
+ self.servCB.entry.connect('changed',self.serviceSelected)
+ box.add(self.servCB)
+
+ delBT = gtk.GtkButton("Del")
+ self.tips.set_tip(delBT,'Delete service')
+ delBT.connect("clicked", self.delService)
+ box.add(delBT)
+ newBT = gtk.GtkButton("New")
+ self.tips.set_tip(newBT,'Add new service')
+ newBT.connect("clicked", self.enterService)
+ box.add(newBT)
+ saveBT = gtk.GtkButton("Save")
+ self.tips.set_tip(saveBT,'Save service entry')
+ saveBT.connect("clicked", self.saveService)
+ box.add(saveBT)
+
+# Service caps
+ box = gtk.GtkHBox(spacing=3)
+ box.set_border_width(5)
+ vbox.add(box, expand=FALSE)
+# Image formats
+ box.add(gtk.GtkLabel('Format:'),expand=FALSE)
+ self.formatCB = gtk.GtkCombo()
+ box.add(self.formatCB)
+# Exception formats
+ box.add(gtk.GtkLabel('Except:'),expand=FALSE)
+ self.exceptCB = gtk.GtkCombo()
+ self.exceptCB.set_usize(205,-1)
+ box.add(self.exceptCB)
+
+# Layers
+ lframe = gtk.GtkFrame('Available Layers')
+ mainbox.add(lframe)
+ lboxfr = gtk.GtkVBox(spacing=5)
+ lboxfr.set_border_width(5)
+ lframe.add(lboxfr)
+ lwin = gtk.GtkScrolledWindow()
+ lwin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+ lwin.set_usize(-1,300)
+ lboxfr.add(lwin)
+ self.layersTR = gtk.GtkTree()
+ lwin.add_with_viewport(self.layersTR)
+
+# Buttons
+ box = gtk.GtkHBox(spacing=5)
+ mainbox.add(box, expand=FALSE)
+
+ getBT = gtk.GtkButton("Get map")
+ self.tips.set_tip(getBT,'Get map')
+ getBT.connect("clicked", self.getMap)
+ box.add(getBT)
+
+ validBT = gtk.GtkButton('Validate')
+ self.tips.set_tip(validBT,'Validate map')
+ validBT.connect('clicked',self.validateMap)
+ box.add(validBT)
+
+ cancelBT = gtk.GtkButton("Cancel")
+ self.tips.set_tip(cancelBT,'Exit without saving')
+ cancelBT.connect("clicked", self.close)
+ box.add(cancelBT)
+
+ doneBT = gtk.GtkButton("Done")
+ self.tips.set_tip(doneBT,'Save maps and exit')
+ doneBT.connect("clicked", self.doneClicked)
+ box.add(doneBT)
+
+ return TRUE
+
+ def doneClicked(self,*args):
+ self.saveData()
+ # update map window before closing
+ self.updateMapWindow()
+ self.close()
+
+ def selectedRow(self,lst,row,col,event):
+ if self.updating:
+ return
+
+ title = lst.get_text(row,0)
+ index = self.curMapParms['LAYERS'].index(title)
+ self.showLayerDialog(title,index)
+
+ def layerItemSelected(self,item,event):
+ self.updating = TRUE
+ title = item.children()[0].get()
+ if event.button == 3:
+ item.toggle()
+ self.showLayerDialog(title)
+ elif event.button == 1:
+ self.selectLayer(title)
+ self.updateSelectedGUI()
+ if self.layerDlg is not None:
+ if self.layerDlg.flags() & gtk.VISIBLE:
+ self.showLayerDialog(title)
+
+ self.updating = FALSE
+
+ def showLayerDialog(self,title,index=None):
+ if self.checkMap() and index is None:
+ if title in self.curMapParms['LAYERS']:
+ index = self.curMapParms['LAYERS'].index(title)
+
+ if self.layerDlg is None:
+ self.layerDlg = LayerDialog(title,self.curMapParms,index)
+ self.layerDlg.subscribe('param-changed',self.updateSelectedGUI)
+ else:
+ self.layerDlg.get_window()._raise()
+ self.layerDlg.create(title,self.curMapParms,index)
+
+ def updateServiceInfo(self):
+ self.updating = TRUE
+ servKeys = servDic.keys()
+ servKeys.sort()
+ self.servCB.set_popdown_strings(servKeys)
+ self.updating = FALSE
+
+ def updateMapInfo(self):
+ self.updating = TRUE
+ self.mapKeys = self.mapDic.keys()
+ self.mapKeys.sort()
+ self.mapCB.set_popdown_strings(self.mapKeys)
+ self.updating = FALSE
+
+ def updateMapGUI(self):
+ self.formatCB.entry.set_text(self.curMapParms['FORMAT'])
+ self.exceptCB.entry.set_text(self.curMapParms['EXCEPTIONS'])
+
+ def updateMapWindow(self):
+ self.mapWin.updating = TRUE
+ self.mapWin.mapKeys = self.mapKeys
+ self.mapWin.maps = self.mapDic
+ self.mapWin.mapCB.set_popdown_strings(self.mapWin.mapKeys)
+ self.mapWin.mapCB.entry.set_text(self.curMap['Title'])
+ self.mapWin.setMap(self.curMap['Title'])
+ self.mapWin.updating = FALSE
+
+ def mapSelected(self,*args):
+ if self.updating or self.editingMap:
+ return
+ key = self.mapCB.entry.get_text()
+ self.setMap(key)
+
+ def setMap(self,key):
+ self.updating = TRUE
+ self.curMap = self.mapDic[key]
+ self.mapnameTE.set_text(self.curMap['Name'])
+ skey = self.curMap['Server']
+ self.servCB.entry.set_text(skey)
+ self.setService(skey)
+ self.curMapParms = servCaps.decodeURL(self.curMap['URL'])
+ if 'Extents' in self.curMap:
+ self.curMapParms['Extents'] = self.curMap['Extents']
+
+ self.updateMapGUI()
+ self.updateSelectedGUI()
+ self.updating = FALSE
+ if self.layerDlg is not None:
+ if self.layerDlg.flags() & gtk.VISIBLE:
+ self.selectedCL.select_row(0,0)
+
+ def checkMap(self):
+ return self.curMap['Server'] == self.curServ \
+ and not self.curMap['Server'] == 'None'
+
+ def validateMap(self,*args):
+ if self.checkMap():
+ exmap = self.mapWin.curMap
+ self.mapWin.curMap = self.makeMap()
+ self.mapWin.validateMap()
+ self.mapWin.curMap = exmap
+
+ def enterMap(self,*args):
+ self.updating = TRUE
+ self.editingMap = TRUE
+ self.mapCB.entry.set_text('New map')
+ self.mapnameTE.set_text('newmap')
+ self.servCB.entry.set_text('Select service')
+ self.newMap()
+ self.updateSelectedGUI()
+ self.updating = FALSE
+
+ def newMap(self):
+ self.setService('Select service')
+ map = {}
+ parms = {}
+ parms['SERVICE'] = 'WMS'
+ parms['REQUEST'] = "GetMap"
+ parms['LAYERS'] = []
+ parms['STYLES'] = []
+ map['Name'] = 'newmap'
+ map['Title'] = 'New map'
+ map['Server'] = 'None'
+ self.curMap = map
+ self.curMapParms = parms
+
+ def saveMap(self,*args):
+ self.updating = TRUE
+ map = self.makeMap()
+ if 'Extents' in self.curMapParms:
+ map['Extents'] = self.curMapParms.get('Extents')
+ del self.curMapParms['Extents']
+ map['URL'] = servCaps.encodeURL(self.curMapParms)
+ mapKey = map['Title']
+ self.mapDic[mapKey] = map
+ self.updateMapInfo()
+ self.mapCB.entry.set_text(mapKey)
+ self.setMap(mapKey)
+ self.updateMapWindow()
+ self.updating = FALSE
+ self.editingMap = FALSE
+
+ def delMap(self,*args):
+ self.updating = TRUE
+ del self.mapDic[self.curMap['Title']]
+ self.updateMapInfo()
+ self.setMap(self.mapKeys[0])
+ self.updateMapWindow()
+ self.updating = FALSE
+
+ def getMap(self,*args):
+ self.mapWin.curMap = self.makeMap()
+ self.mapWin.addLayer()
+
+ def makeMap(self):
+ map = {}
+ map['Title'] = self.mapCB.entry.get_text()
+ map['Name'] = self.mapnameTE.get_text()
+ map['Server'] = self.servCB.entry.get_text()
+ self.curMapParms['FORMAT'] = self.formatCB.entry.get_text()
+ self.curMapParms['EXCEPTIONS'] = self.exceptCB.entry.get_text()
+ if 'Extents' in self.curMapParms:
+ map['Extents'] = self.curMapParms['Extents']
+ params = self.curMapParms.copy()
+ map['URL'] = servCaps.encodeURL(params)
+
+ return map
+
+ def serviceSelected(self,*args):
+ if self.updating or self.editingSrv:
+ return
+ skey = self.servCB.entry.get_text()
+ self.setService(skey)
+ if not self.curMap['Title'] in self.mapDic:
+ self.curMapParms['EXCEPTIONS'] = self.exceptCB.entry.get_text()
+ self.curMapParms['FORMAT'] = self.formatCB.entry.get_text()
+ self.curMapParms['VERSION'] = servCaps.version
+ self.curMap['Server'] = skey
+ self.curMap['URL'] = servCaps.encodeURL(self.curMapParms)
+ if servCaps.layer.find('Dimension') is not None:
+ self.curMapParms['Extents'] = {}
+
+ def setService(self,skey):
+ self.updating = TRUE
+ if skey == 'Select service':
+ self.updateServiceGUI(skey)
+ self.curServ = None
+ self.updating = FALSE
+ return
+ if skey != self.curServ:
+ if openService(skey):
+ self.curServ = skey
+ self.updateServiceGUI(skey)
+ self.updateLayersList()
+
+ self.updating = FALSE
+
+ def enterService(self,*args):
+ self.updating = TRUE
+ self.editingSrv = TRUE
+ self.servCB.entry.set_text('')
+ self.tips.set_tip(self.servCB.entry,'Enter service filename/url and hit <Return>')
+ self.updateServiceGUI('New service')
+ self.updating = FALSE
+
+ def newService(self,cb):
+ self.updating = TRUE
+ pathname = cb.get_text()
+ fname = None
+ type,p = urllib.splittype(pathname)
+ if type is None:
+ fname = pathname
+ url = os.path.join(wms_dir,pathname)
+ else:
+ url = pathname
+
+ if not servCaps.open(url):
+ txt = 'Could not open ' + url+'.\nServer responded:\n'
+ txt+=servCaps.buffer
+ message(txt,title='GetCapabilities Result')
+ del servCaps.buffer
+ servCaps.buffer = None
+ self.updating = FALSE
+ self.editingSrv = FALSE
+ return
+
+ self.curServ = servCaps.title
+ self.servCB.entry.set_text(servCaps.title)
+ self.updateServiceGUI(self.curServ)
+ self.updateLayersList()
+ self.updating = FALSE
+
+ def delService(self,*args):
+ self.updating = TRUE
+ srvname = self.servCB.entry.get_text()
+ host = servDic.get(srvname)
+ del servDic[srvname]
+ os.remove(os.path.join(srv_dir,host,srvname+'.xml'))
+ self.updateServiceInfo()
+ self.updating = FALSE
+
+ def saveService(self,*args):
+ self.updating = TRUE
+ srvKey = self.servCB.entry.get_text()
+ try:
+ host = createCapsEntry(srvKey)
+ servDic[srvKey] = host
+ self.updateServiceInfo()
+ except:
+ outfile = os.path.join(wms_dir,'caps-tmp.xml')
+ fd = file(outfile,'w')
+ fd.write(servCaps.buffer)
+ fd.close()
+ gvutils.error('The Service entry could not be created.\nSaved as '+outfile)
+ srvKey = servDic.keys()[0]
+
+ del servCaps.buffer
+ servCaps.buffer = None
+ self.editingSrv = FALSE
+ self.updating = FALSE
+ self.servCB.entry.set_text(srvKey)
+
+ def updateServiceGUI(self,key):
+ if key == 'Select service' or key == 'New service':
+ self.formatCB.entry.set_text('')
+ self.exceptCB.entry.set_text('')
+ if key == 'Select service':
+ self.tips.set_tip(self.servCB.entry,'Select the service for this map. \n Only one service per map.')
+ self.layersTR.clear_items(0,-1)
+ if key == 'New service':
+ self.selectedCL.freeze()
+ self.selectedCL.clear()
+ self.selectedCL.thaw()
+ return
+
+ frmtLst = servCaps.getPropList('Capability/Request/GetMap/Format')
+ self.formatCB.set_popdown_strings(frmtLst)
+ excLst = servCaps.getPropList('Capability/Exception/Format')
+ self.exceptCB.set_popdown_strings(excLst)
+
+ try:
+ self.tips.set_tip(self.servCB.entry,servCaps.abstract.encode('latin_1'))
+ except:
+ self.tips.set_tip(self.servCB.entry,servCaps.title)
+
+ def updateLayersList(self):
+ self.layersTR.clear_items(0,-1)
+ item = gtk.GtkTreeItem(servCaps.layer.title)
+ self.layersTR.append(item)
+ mainTree = gtk.GtkTree()
+ item.set_subtree(mainTree)
+ item.connect('button-press-event',self.layerItemSelected)
+ self.addLayerTree(servCaps.layer,mainTree)
+ item.expand()
+ item.show()
+
+ def updateSelectedGUI(self,*args):
+ self.updating = TRUE
+ self.selectedCL.freeze()
+ self.selectedCL.clear()
+ for laytitle in self.curMapParms['LAYERS']:
+ if len(self.curMapParms['STYLES']):
+ idx = self.curMapParms['LAYERS'].index(laytitle)
+ stitle = self.curMapParms['STYLES'][idx]
+ self.selectedCL.insert(0,(laytitle,stitle))
+ self.selectedCL.thaw()
+ self.updating = FALSE
+
+ def addLayerTree(self,laynode,tree):
+ for node in servCaps.sortLayerTree(laynode):
+ layItem = gtk.GtkTreeItem(node.findtext('Title'))
+ tree.append(layItem)
+ if node.find('Layer'):
+ layTree = gtk.GtkTree()
+ layItem.set_subtree(layTree)
+ layItem.connect('expand',self.expandLayerTree,node)
+
+ layItem.connect('button-press-event',self.layerItemSelected)
+ layItem.show()
+
+
+ def expandLayerTree(self,item,node):
+ tree = item.subtree
+ if len(tree.children()):
+ return
+ self.addLayerTree(node,tree)
+
+ def selectLayer(self,title):
+ if not self.checkMap():
+ return
+ layerNode = servCaps.getLayerNode(title)
+ if layerNode.find('Name') is None:
+ return
+ if title in self.curMapParms['LAYERS']:
+ index = self.curMapParms['LAYERS'].index(title)
+ del self.curMapParms['LAYERS'][index]
+ del self.curMapParms['STYLES'][index]
+ if 'Extents' in self.curMapParms and len(self.curMapParms['LAYERS']) == 0:
+ self.curMapParms['Extents'] = {}
+ else:
+ self.curMapParms['LAYERS'].append(title)
+ styleNode = layerNode.find('Style')
+ if styleNode:
+ style = styleNode.findtext('Title')
+ else:
+ style = ''
+ self.curMapParms['STYLES'].append(style)
+ if layerNode.find('Extent') is not None:
+ extents = layerNode.findall('Extent')
+ for extent in extents:
+ self.curMapParms['Extents'][extent.get('name')] = extent.get('default')
+
+ def saveData(self,*args):
+ pickle.dump(self.mapDic,open(os.path.join(wms_dir,'maps.dat'),'w'))
+
+ def close(self,*args):
+ if self.layerDlg is not None:
+ self.layerDlg.unsubscribe('param-changed',self.updateSelectedGUI)
+ self.layerDlg.destroy()
+
+ self.destroy()
+
+
+class LayerDialog(gtk.GtkWindow,gvsignaler.Signaler):
+ def __init__(self,title,params,index=None):
+ gtk.GtkWindow.__init__(self,title='Layer Properties')
+ self.set_policy(FALSE,TRUE,TRUE)
+ self.connect('delete-event',self.close)
+ self.publish('param-changed')
+ self.create(title,params,index)
+
+ def create(self,title,params,index=None):
+ self.updating = TRUE
+ self.layerNode = servCaps.getLayerNode(title)
+ self.params = params
+ self.index = index
+ self.curStyle = None
+ self.extentDic = {}
+ if len(self.children()):
+ for child in self.children():
+ child.destroy()
+ self.createGUI()
+ self.show_all()
+ self.updating = FALSE
+
+ def createGUI(self):
+ srsflag = TRUE
+ mainbox = gtk.GtkVBox(spacing=5)
+ mainbox.set_border_width(5)
+ self.add(mainbox)
+ frame = gtk.GtkFrame("Information")
+ mainbox.add(frame)
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ if self.layerNode.find('Name') is not None:
+ self.selectedTO = gtk.GtkCheckButton(label='Selected')
+ vbox.add(self.selectedTO,expand=FALSE)
+ if self.index is not None:
+ self.selectedTO.set_active(TRUE)
+ self.selectedTO.connect('toggled',self.selectedToggled)
+ for node in self.layerNode.getiterator():
+ tag = node.tag
+ if tag in ['Name','Title']:
+ box = gtk.GtkHBox()
+ vbox.add(box)
+ box.add(gtk.GtkLabel(tag+': '+node.text),expand=FALSE)
+ elif tag == 'Abstract':
+ box = gtk.GtkHBox()
+ vbox.add(box)
+ label = gtk.GtkLabel(node.text)
+ label.set_justify(gtk.JUSTIFY_FILL)
+ label.set_line_wrap(TRUE)
+ label.set_usize(400,-1)
+ box.add(label)
+ elif tag == 'SRS' and srsflag:
+ srsLst = servCaps.getSRSList(self.layerNode)
+ vbox.add(gtk.GtkHSeparator())
+ box = gtk.GtkHBox(spacing=3)
+ vbox.add(box)
+ box.add(gtk.GtkLabel('SRS:'),expand=FALSE)
+ srsCB = gtk.GtkCombo()
+ srsCB.set_usize(110,-1)
+ srsCB.set_popdown_strings(srsLst)
+ tips = gtk.GtkTooltips()
+ tips.set_tip(srsCB.entry,'For information only. Not selectable')
+ box.add(srsCB,expand=FALSE)
+ srsflag = FALSE
+ elif tag in ['LatLonBoundingBox','BoundingBox']:
+ vbox.add(self.createBBoxLabel(node),expand=FALSE)
+ elif tag in ['Dimension','ScaleHint','MetadataURL','DataURL', \
+ 'KeywordList','Attribution','AuthorityURL','Identifier','FeatureListURL']:
+ vbox.add(self.createAttrLabel(node),expand=FALSE)
+
+ vbox.add(self.createAttrLabel(self.layerNode))
+ if self.layerNode.find('Style') is not None:
+ mainbox.add(self.createStylesGUI())
+ if self.layerNode.find('Extent') is not None:
+ mainbox.add(self.createExtentGUI())
+
+ def createStylesGUI(self):
+ frame = gtk.GtkFrame("Style")
+ vbox = gtk.GtkVBox(spacing=5)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ box = gtk.GtkHBox(spacing=5)
+ vbox.add(box, expand=FALSE)
+ self.stylesCB = gtk.GtkCombo()
+ box.add(self.stylesCB)
+
+ styleTree = self.layerNode.findall('Style')
+ styleLst = servCaps.getTitles(styleTree)
+ self.stylesCB.set_popdown_strings(styleLst)
+ self.styleTX = gtk.GtkLabel()
+ vbox.add(self.styleTX,expand=FALSE)
+ if self.index is None:
+ self.setStyle(styleLst[0])
+ else:
+ self.setStyle(self.params['STYLES'][self.index])
+ self.stylesCB.entry.set_text(self.curStyle)
+ self.stylesCB.entry.connect('changed',self.styleChanged)
+
+ legend = self.getStyle(self.curStyle).find('LegendURL')
+ if legend:
+ vbox.add(gtk.GtkLabel(legend.tag+'...'),expand=FALSE)
+ return frame
+
+ def createExtentGUI(self):
+ extentTree = self.layerNode.findall('Extent')
+ frame = gtk.GtkFrame("Extent")
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.set_border_width(5)
+ frame.add(vbox)
+ for extent in extentTree:
+ extentTE = ExtentEntry(extent)
+ vbox.add(extentTE,expand=FALSE)
+ name = extent.get('name')
+ extentTE.connect('changed',self.extentChanged,name)
+ self.extentDic[name] = extentTE.entry
+ if self.index is not None:
+ extentTE.entry.set_text(self.params['Extents'][name])
+ return frame
+
+ def createBBoxLabel(self,elem):
+ vbox = gtk.GtkVBox(spacing=3)
+ vbox.add(gtk.GtkHSeparator())
+ if elem.tag == 'BoundingBox':
+ vbox.add(gtk.GtkLabel(elem.tag+' '+elem.get('SRS')),expand=FALSE)
+ else:
+ vbox.add(gtk.GtkLabel(elem.tag),expand=FALSE)
+ label = gtk.GtkLabel('maxy'+':'+elem.get('maxy'))
+ vbox.add(label,expand=FALSE)
+ box = gtk.GtkHBox(spacing=10)
+ vbox.add(box)
+ lbox = gtk.GtkHBox()
+ box.add(lbox)
+ rbox = gtk.GtkHBox()
+ box.add(rbox)
+ label = gtk.GtkLabel('minx'+':'+elem.get('minx'))
+ label.set_justify(gtk.JUSTIFY_LEFT)
+ lbox.add(label)
+ label = gtk.GtkLabel('maxx'+':'+elem.get('maxx'))
+ label.set_justify(gtk.JUSTIFY_RIGHT)
+ rbox.add(label)
+ label = gtk.GtkLabel('miny'+':'+elem.get('miny'))
+ vbox.add(label,expand=FALSE)
+ return vbox
+
+ def createAttrLabel(self,elem):
+ tag = elem.tag
+ vbox = gtk.GtkVBox(spacing=3)
+ if len(elem.items()) == 0 and tag == 'Layer':
+ return vbox
+ vbox.add(gtk.GtkHSeparator())
+ if tag in ['DataURL','MetadataURL','KeywordList','Attribution','AuthorityURL','Identifier','FeatureListURL']:
+ vbox.add(gtk.GtkLabel(tag+'...'),expand=FALSE)
+ return vbox
+ vbox.add(gtk.GtkLabel(tag),expand=FALSE)
+ for attr,value in elem.items():
+ box = gtk.GtkHBox()
+ vbox.add(box,expand=FALSE)
+ label = gtk.GtkLabel(attr+': '+value)
+ box.add(label,expand=FALSE)
+ return vbox
+
+ def selectedToggled(self,chk):
+ if self.updating:
+ return
+ self.selectLayer(chk.active)
+
+ def selectLayer(self,select):
+ title = self.layerNode.findtext('Title')
+ if select:
+ self.params['LAYERS'].append(title)
+ if self.curStyle is None:
+ style = ''
+ else:
+ style = self.curStyle
+ self.params['STYLES'].append(style)
+ if 'Extents' in self.params:
+ for extent,entry in self.extentDic.items():
+ self.params['Extents'][extent] = entry.get_text()
+ self.index = self.params['LAYERS'].index(title)
+ else:
+ del self.params['LAYERS'][self.index]
+ del self.params['STYLES'][self.index]
+ if 'Extents' in self.params and len(self.params['LAYERS']) == 0:
+ self.params['Extents'] = {}
+ self.index = None
+
+ self.notify('param-changed')
+
+ def styleChanged(self,entry):
+ if self.updating:
+ return
+ sel = entry.get_text()
+ if len(sel):
+ self.setStyle(sel)
+
+ def extentChanged(self,entry,name):
+ if self.updating:
+ return
+ sel = entry.get_text()
+ if len(sel):
+ self.params['Extents'][name] = sel
+
+ def setStyle(self,title):
+ self.curStyle = title
+ if self.index is not None:
+ self.params['STYLES'][self.index] = title
+ self.notify('param-changed')
+
+ self.updateStyleGUI()
+
+ def getStyle(self,title):
+ for style in self.layerNode.findall('Style'):
+ if style.findtext('Title') == title:
+ return style
+
+ def updateStyleGUI(self):
+ style = self.getStyle(self.curStyle)
+ abstract = style.find('Abstract')
+ if abstract is not None:
+ self.styleTX.set_text(abstract.text)
+
+ def close(self,*args):
+ self.updating = TRUE
+ self.hide()
+ return TRUE
+
+# custom widgets and dialogs
+class GeneralDialog(gtk.GtkDialog):
+ def __init__(self, widgets=[],buttons=[]):
+ gtk.GtkDialog.__init__(self)
+ self.connect("destroy", self.quit)
+ self.connect("delete_event", self.quit)
+ gtk.grab_add(self)
+ for widget in widgets:
+ hbox = gtk.GtkHBox()
+ hbox.set_border_width(3)
+ self.vbox.add(hbox)
+ hbox.add(widget)
+
+ for button in buttons:
+ self.action_area.add(button)
+
+ button = gtk.GtkButton('Close')
+ self.action_area.add(button,expand=FALSE)
+ button.connect("clicked", self.quit)
+
+ def quit(self, *args):
+ self.hide()
+ self.destroy()
+ gtk.mainquit()
+
+def message(text,title="Message Box"):
+ label = gtk.GtkLabel(text)
+ label.set_justify(gtk.JUSTIFY_LEFT)
+ label.set_line_wrap(TRUE)
+ win = GeneralDialog(widgets=[label])
+ win.set_title(title)
+ win.show_all()
+ gtk.mainloop()
+
+def showValidateMapResult(result,url):
+ label = gtk.GtkLabel(result)
+ label.set_justify(gtk.JUSTIFY_LEFT)
+
+ # just a trick to get the text length
+ urltxt = gtk.GtkLabel(url)
+ w,h = urltxt.size_request()
+
+ urlTE = gtk.GtkEntry()
+ urlTE.set_usize(w+10,-1)
+ urlTE.set_text(url)
+ urlwin = gtk.GtkScrolledWindow()
+ urlwin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+ urlwin.set_usize(-1,50)
+ urlwin.add_with_viewport(urlTE)
+ win = GeneralDialog(widgets=[label,urlwin])
+ win.set_title('Map Validation')
+ win.show_all()
+ # do this last, just in case...
+ urlTE.select_region(0,-1)
+ urlTE.copy_clipboard()
+ gtk.mainloop()
+
+class GeoEntry(gtk.GtkHBox):
+ def __init__(self,geo,dgsz=33,mnsz=22,scsz=40,mtsz=125):
+ gtk.GtkHBox.__init__(self,spacing=3)
+ self.degsz = dgsz
+ self.metsz = mtsz
+ self.minsz = mnsz
+ self.secsz = scsz
+ self.round = 2
+ self.setMode(geo)
+
+ def connect(self,signal,callback,data):
+ if self.isGeo:
+ self.degTE.connect(signal,callback,data)
+ self.minTE.connect(signal,callback,data)
+ self.secTE.connect(signal,callback,data)
+ else:
+ self.metersTE.connect(signal,callback,data)
+
+ def setRound(self,value):
+ self.round = value
+
+ def setGeoMode(self):
+ self.degTE = self.createEntry(self.degsz,'d')
+ self.minTE = self.createEntry(self.minsz,'m')
+ self.secTE = self.createEntry(self.secsz,'s')
+ self.isGeo = TRUE
+
+ def setMode(self,geo):
+ if len(self.children()):
+ for child in self.children():
+ child.destroy()
+
+ if geo:
+ self.setGeoMode()
+ else:
+ self.setProjMode()
+
+ self.show_all()
+
+ def setProjMode(self):
+ self.metersTE = self.createEntry(self.metsz,'m')
+ self.isGeo = FALSE
+
+ def createEntry(self,size,lbl):
+ te = gtk.GtkEntry()
+ te.set_usize(size,-1)
+ self.add(te,expand=FALSE)
+ self.add(gtk.GtkLabel(lbl),expand=FALSE)
+ return te
+
+ def getDegrees(self):
+ txt = self.degTE.get_text()
+ return self.validateInt(txt)
+
+ def getMinutes(self):
+ txt = self.minTE.get_text()
+ return self.validateInt(txt)
+
+ def getSeconds(self):
+ txt = self.secTE.get_text()
+ return self.validateFloat(txt)
+
+ def getMeters(self):
+ txt = self.metersTE.get_text()
+ return self.validateFloat(txt)
+
+ def validateInt(self,txt):
+ if len(txt) and txt != '-':
+ value = int(txt)
+ else:
+ value = 0
+
+ return value
+
+ def validateFloat(self,txt):
+ if len(txt) and txt != '-':
+ value = float(txt)
+ else:
+ value = 0.0
+
+ return value
+
+ def setDegrees(self,value):
+ self.degTE.set_text(str(value))
+
+ def setMinutes(self,value):
+ self.minTE.set_text(str(value))
+
+ def setSeconds(self,value):
+ self.secTE.set_text(str(round(value,self.round)))
+
+ def setMeters(self,value):
+ self.metersTE.set_text(str(value))
+
+ def setValue(self,value):
+ if self.isGeo:
+ dms = self.deg2dms(value)
+ self.setDegrees(dms[0])
+ self.setMinutes(dms[1])
+ self.setSeconds(dms[2])
+ else:
+ self.setMeters(value)
+
+ def set_text(self,txt):
+ self.setValue(float(txt))
+
+ def getValue(self):
+ dms = []
+ if self.isGeo:
+ dms.append(self.getDegrees())
+ dms.append(self.getMinutes())
+ dms.append(self.getSeconds())
+ return self.dms2deg(dms)
+ else:
+ return self.getMeters()
+
+ def get_text(self):
+ value = self.getValue()
+ return str(value)
+
+ def deg2dms(self,dd):
+ deg = int(dd)
+ dec = abs(dd-deg)
+ mn = int(dec*60)
+ sec = (dec*60 - mn)*60
+ if round(sec,self.round) >= 60.0:
+ sec = 0.0
+ mn+=1
+ return (deg,mn,sec)
+
+ def dms2deg(self,dms):
+ dd = abs(dms[0])+dms[1]/60.0+dms[2]/3600.0
+ if dms[0] < 0:
+ return -dd
+ else:
+ return dd
+
+class ExtentEntry(gtk.GtkHBox):
+ def __init__(self,extent):
+ gtk.GtkHBox.__init__(self,spacing=3)
+ name = extent.get('name')
+ label = gtk.GtkLabel(name+': ')
+ self.add(label,expand=FALSE)
+ extLst = extent.text.split(',')
+ if len(extLst) > 1:
+ extentCB = gtk.GtkCombo()
+ extentCB.entry.set_usize(75,-1)
+ self.add(extentCB,expand=FALSE)
+ extentCB.set_popdown_strings(extLst)
+ extentCB.entry.set_text(extent.get('default'))
+ self.entry = extentCB.entry
+ dimTree = servCaps.layer.findall('Dimension')
+ for elem in dimTree:
+ if elem.get('name') == name:
+ units = elem.get('unitSymbol')
+ break
+ if units is not None:
+ self.add(gtk.GtkLabel(units),expand=FALSE)
+ else:
+ extLst = extent.text.split('/')
+ if len(extLst) == 1:
+ label = gtk.GtkLabel(extent.text)
+ self.add(label,expand=FALSE)
+ self.entry = label
+ else:
+ extentTE = gtk.GtkEntry()
+ extentTE.set_text(extent.get('default'))
+ extentTE.set_usize(75,-1)
+ self.add(extentTE,expand=FALSE)
+ self.entry = extentTE
+ label = ' from '+extLst[0]+' to '+extLst[1]+' by '+extLst[2][1:]
+ self.add(gtk.GtkLabel(label),expand=FALSE)
+
+ def connect(self,signal,callback,data):
+ self.entry.connect(signal,callback,data)
+
+TOOL_LIST = ['WMSTool']
+if __name__ == '__main__':
+ import sys
+ if not os.path.exists(wms_dir):
+ os.mkdir(wms_dir)
+ if not os.path.exists(cachepath):
+ os.mkdir(cachepath)
+ if not os.path.exists(srv_dir):
+ os.mkdir(srv_dir)
+
+ if len(sys.argv)>1:
+ intxt = file(sys.argv[1],'r').read()
+ lst = intxt.splitlines()
+ else:
+ lst = ['OnEarth,http://wms.jpl.nasa.gov/wms.cgi?','GLOBE,http://globe.digitalearth.gov/viz-bin/wmt.cgi?']
+
+ if len(sys.argv)>2:
+ srvDir = os.path.join(wms_dir,sys.argv[2])
+ else:
+ srvDir = srv_dir
+ if not os.path.exists(srvDir):
+ os.mkdir(srvDir)
+
+ print "Processing list..."
+ buildServicesDir(lst,srvDir)
+ sys.exit(0)
Added: packages/openev/trunk/version.config
===================================================================
--- packages/openev/trunk/version.config (rev 0)
+++ packages/openev/trunk/version.config 2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,3 @@
+major=1
+minor=9
+micro=0-cvs20051112
More information about the Pkg-grass-devel
mailing list