This is the motivation behind a recent enhancement to the TestBuilder to allow running external (system) commands that return geometry output. The output can be in any text format that TestBuilder recognizes (currently WKT, WKB and GeoJSON). It also provides the ability to encode the A and B TestBuilder input geometries as literal WKT or WKB values in the command. The net result is the ability to run external geometry functions just as if they were functions built into the TestBuilder.
Running PostGIS spatial functionsCombined with the versatile Postgres command-line interface psql, this allows running a SQL statement and loading the output as geometry. Here's an example of running a PostGIS spatial function. In this case a MultiPoint geometry has been digitized in the TestBuilder, and processed by the ST_VoronoiPolygons function. The SQL output geometry is displayed as the TestBuilder result.
The command run is:
/Applications/Postgres.app/Contents/Versions/latest/bin/psql -qtA -c
Things to note:
- the full path to psql is needed because the TestBuilder processes the command using a plain sh shell. (It might be possible to improve this.)
- The psql options -qtA suppress messages, table headers, and column alignment, so that only the plain WKB of the result is output
- The variable #a# has the WKT of the A input geometry substituted when the command is run. This is converted into a PostGIS geometry via the ::geometry cast. (#awkb# can be used to supply WKB, if full numeric precision is needed)
Loading data from PostGISThis also makes it easy to load data from PostGIS to make use of TestBuilder geometry analysis and visualization capabilities. The query can be any kind of SELECT statement, which makes it easy to control what data is loaded. For large datasets it can be useful to draw an Area of Interest in the TestBuilder and use that as a spatial filter for the query. The TestBuilder is able to load multiple textual geometries, so there is not need to collect the query result into a single geometry.
Loading data from the WebAnother use for commands is to load data from the Web, by using curl to retrieve a dataset. Many web spatial datasets are available in GeoJSON, which loads fine into the TestBuilder. Here's an example of loading a dataset provided by an OGC Features service (pygeoapi):
Command Panel User Interface
The Command panel provides a simple UI to make it easier to work with commands. Command text can be pasted and cleared. A history of commands run is recorded for the TestBuilder session. Recorded commands in the session can be recalled via the Previous and Next Command buttons.
Buttons are provided to insert substitution variable text.
To help debug incorrect command syntax, error output from commands is displayed.
It can happen that a command executes successfully, but returns output that cannot be parsed. This is indicated by an error in the Result panel. A common cause of this is that the command produces logging output as well as the actual geometry text, which interferes with parsing. To aid in debugging this situation the command window shows the first few hundred characters of command output. The good news is that many commands offer a "quiet mode" to provide data-only output.
Unparseable psql output due to presence of column headers. The pqsl -t option fixes this.
If you find an interesting use for the TestBuilder Command capability, post it in the comments!