Skip to content

Commit

Permalink
Merge pull request #5769 from geographika/python-mapscript-examples
Browse files Browse the repository at this point in the history
Update Python MapScript examples
  • Loading branch information
geographika committed Mar 28, 2019
2 parents 56d96ba + e8bc45c commit 3a2dac9
Show file tree
Hide file tree
Showing 8 changed files with 360 additions and 332 deletions.
59 changes: 25 additions & 34 deletions mapscript/python/CMakeLists.txt
Expand Up @@ -56,10 +56,6 @@ file(READ ${SETUP_PY_TEMP} SETUP_CONTENT)

file(GENERATE OUTPUT $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/setup.py INPUT ${SETUP_PY_TEMP})

# following not needed?
set(BUILD_TIMESTAMP "${CMAKE_CURRENT_BINARY_DIR}/build/timestamp")
set(TESTS_FOLDER ${PROJECT_SOURCE_DIR}/mapscript/python/tests/cases)

if(MSVC)
set(OUTPUT_FOLDER ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE})
else()
Expand All @@ -68,10 +64,9 @@ else()
endif()

if(WIN32)
set(PYTHON_SCRIPTS ${OUTPUT_FOLDER}/mapscriptvenv/Scripts)
# Windows venv binaries are in a different location than Linux
set(PYTHON_VENV_SCRIPTS ${OUTPUT_FOLDER}/mapscriptvenv/Scripts)
else()
set(PYTHON_SCRIPTS ${OUTPUT_FOLDER}/mapscriptvenv/Scripts)
set(PYTHON_VENV_SCRIPTS ${OUTPUT_FOLDER}/mapscriptvenv/bin)
endif()

Expand All @@ -84,59 +79,55 @@ add_custom_command(
DEPENDS ${SWIG_MODULE_pythonmapscript_REAL_NAME}
OUTPUT mapscriptvenv.stamp
WORKING_DIRECTORY ${OUTPUT_FOLDER}
COMMENT "Creating a Python virtual environment"
COMMAND ${PYTHON_EXECUTABLE} -m pip install virtualenv
COMMAND ${PYTHON_EXECUTABLE} -m virtualenv mapscriptvenv
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m pip install pip --upgrade --force-reinstall > pip_update.log
COMMAND ${PYTHON_VENV_SCRIPTS}/pip install -r ${PROJECT_SOURCE_DIR}/mapscript/python/requirements-dev.txt > requires.log
COMMENT "Creating a Python virtual environment and installing the required packages"
)

add_custom_command(
DEPENDS mapscriptvenv.stamp
OUTPUT mapscriptvenvpop.stamp
WORKING_DIRECTORY ${OUTPUT_FOLDER}
COMMENT "Installing the required packages into the virtual environment"
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m pip install pip --upgrade --force-reinstall
COMMAND ${PYTHON_VENV_SCRIPTS}/pip install -r ${PROJECT_SOURCE_DIR}/mapscript/python/requirements-dev.txt
)

add_custom_command(
DEPENDS mapscriptvenvpop.stamp
OUTPUT mapscriptlinting.stamp
WORKING_DIRECTORY ${OUTPUT_FOLDER}
COMMENT "Linting test code files with flake8"
COMMAND ${PYTHON_VENV_SCRIPTS}/flake8 $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/tests --max-line-length=120
COMMAND ${PYTHON_VENV_SCRIPTS}/flake8 $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/examples --max-line-length=120
COMMENT "Linting test suite and examples with flake8" # note only one comment is output per custom command block
)

add_custom_command(
DEPENDS mapscriptlinting.stamp
OUTPUT mapscriptwheel.stamp
WORKING_DIRECTORY ${OUTPUT_FOLDER}
# now check the Python test code with flake8
COMMENT "Linting test code files"
COMMAND ${PYTHON_VENV_SCRIPTS}/flake8 $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/tests --max-line-length=120
COMMAND ${PYTHON_VENV_SCRIPTS}/python setup.py bdist_wheel > wheel_build.log
COMMENT "Building the mapscript Python wheel"
COMMAND ${PYTHON_VENV_SCRIPTS}/python setup.py bdist_wheel
)

add_custom_command(
WORKING_DIRECTORY ${PYTHON_VENV_SCRIPTS} # make sure scripts aren't run when from the same folder as mapscript.py
DEPENDS mapscriptwheel.stamp
OUTPUT mapscripttests.stamp
COMMENT "Installing the Python wheel and testing it in the virtual environment"
COMMAND ${PYTHON_VENV_SCRIPTS}/pip install --no-index --find-links=${OUTPUT_FOLDER}/dist mapscript
COMMAND ${PYTHON_VENV_SCRIPTS}/pytest --pyargs mapscript.tests
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.project_csv ${PROJECT_SOURCE_DIR}/tests/cities.csv 2 1 EPSG:4326 EPSG:3857 > test.csv
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.shpdump ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpdump.txt
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.shpinfo ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpinfo.txt
COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.wxs ${PROJECT_SOURCE_DIR}/tests/test.map > response.xml
COMMENT "Installing the Python wheel and testing it in the virtual environment, then running tests and examples"
)

add_custom_command(
TARGET _pythonmapscript
WORKING_DIRECTORY ${OUTPUT_FOLDER}
POST_BUILD
COMMENT "Copying files required to build Mapscript"
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/mapscript/python/mapscript/__init__.py" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/__init__.py
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/mapscript.py" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/mapscript.py
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${SWIG_MODULE_pythonmapscript_REAL_NAME}>" "$<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/$<TARGET_FILE_NAME:${SWIG_MODULE_pythonmapscript_REAL_NAME}>"
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/mapscript/python/README.rst" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/README.rst
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/mapscript/python/tests/cases" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/tests
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/tests" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/tests/data
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/mapscript/python/examples" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/examples
TARGET _pythonmapscript
WORKING_DIRECTORY ${OUTPUT_FOLDER}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/mapscript/python/mapscript/__init__.py" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/__init__.py
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/mapscript.py" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/mapscript.py
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${SWIG_MODULE_pythonmapscript_REAL_NAME}>" "$<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/$<TARGET_FILE_NAME:${SWIG_MODULE_pythonmapscript_REAL_NAME}>"
COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/mapscript/python/README.rst" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/README.rst
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/mapscript/python/tests/cases" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/tests
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/tests" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/tests/data
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/mapscript/python/examples" $<TARGET_FILE_DIR:${SWIG_MODULE_pythonmapscript_REAL_NAME}>/mapscript/examples
COMMENT "Copying files required to build Mapscript"
)

install(
Expand All @@ -163,4 +154,4 @@ message(STATUS "CMake Version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}")
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Python MapScript output directory: ${OUTPUT_FOLDER}")
message(STATUS "Python Executable: ${PYTHON_EXECUTABLE}")
message(STATUS "Python site packages: ${PYTHON_SITE_PACKAGES}")
message(STATUS "Python site packages: ${PYTHON_SITE_PACKAGES}")
88 changes: 0 additions & 88 deletions mapscript/python/examples/geocode_addresses.py

This file was deleted.

120 changes: 70 additions & 50 deletions mapscript/python/examples/project_csv.py
@@ -1,50 +1,70 @@
#!/usr/bin/python
#
# Script : project_csv.py
#
# Purpose: Simple example to read a csv file and reproject point x/y data
#
# $Id$
#

import sys
import csv
import mapscript

# example invocation
# ./reproj.py ./foo.csv 2 3 EPSG:32619 EPSG:4326

# check input parameters
if (len(sys.argv) != 6):
print sys.argv[0] + \
" <csvfile> <x_col> <y_col> <epsg_code_in> <epsg_code_out>"
sys.exit(1)
else:
# set x and y indices
x = int(sys.argv[2])
y = int(sys.argv[3])

# set input and output projections
projObjIn = mapscript.projectionObj("init="+sys.argv[4].lower())
projObjOut = mapscript.projectionObj("init="+sys.argv[5].lower())

# open file
fCsv = open(sys.argv[1], 'r')

# read csv
csvIn = csv.reader(fCsv)
# setup output
csvOut = csv.writer(sys.stdout)

for aRow in csvIn: # each record
# set pointObj
point = mapscript.pointObj(float(aRow[x]), float(aRow[y]))
# project
point.project(projObjIn, projObjOut)

# update with reprojected coordinates
aRow[x] = point.x
aRow[y] = point.y

csvOut.writerow(aRow)
fCsv.close()
"""
Simple example to read a csv file and reproject point x/y data
Usage:
project_csv.py cities.csv 2 1 EPSG:4326 EPSG:3857
"""

import sys
import csv
from io import open
import mapscript


def main(input_file, x_field_idx, y_field_idx, input_proj, output_proj):

# set input and output projections
proj_in = mapscript.projectionObj(input_proj)
proj_out = mapscript.projectionObj(output_proj)

# open file
with open(input_file, encoding='utf-8') as f:
# read csv
csv_in = csv.reader(f)
headers = next(csv_in)

# setup output
csv_out = csv.writer(sys.stdout)
csv_out.writerow(headers)

for row in csv_in:
# set pointObj
point = mapscript.pointObj(float(row[x_field_idx]), float(row[y_field_idx]))
# project
point.project(proj_in, proj_out)

# update with reprojected coordinates
row[x_field_idx] = point.x
row[y_field_idx] = point.y

csv_out.writerow(row)


def usage():
"""
Display usage if program is used incorrectly
"""
print("Syntax: %s <csvfile> <x_col> <y_col> <epsg_code_in> <epsg_code_out>" % sys.argv[0])
sys.exit(2)


# check input parameters

if (len(sys.argv) != 6):
usage()


input_file = sys.argv[1]

# set x and y indices

x_field_idx = int(sys.argv[2])
y_field_idx = int(sys.argv[3])

# get projection codes

input_proj = "init="+sys.argv[4].lower()
output_proj = "init="+sys.argv[5].lower()
main(input_file, x_field_idx, y_field_idx, input_proj, output_proj)

0 comments on commit 3a2dac9

Please sign in to comment.