A mappyfile plugin to convert GeoJSON to inline Mapfile features. Useful for adding dynamically created features (from web services, user created features, and other external data sources) to a map, or to quickly visualise a geometry.
Note - to display entire GeoJSON files MapServer can be configured to read GeoJSON as an input OGR source using the GeoJSON driver.
import geojson
import mappyfile
# import directly
import mappyfile_geojson
# can also be imported as plugin using
from mappyfile.plugins import mappyfile_geojson
gj = geojson.load(fn)
l = mappyfile_geojson.convert(gj)
print(mappyfile.dumps(l))
Converts the following JSON:
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[ 102.0, 0.0 ],
[ 103.0, 1.0 ],
[ 104.0, 0.0 ],
[ 105.0, 1.0 ]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
}
to the following Mapfile LAYER
:
LAYER
EXTENT 102 0 105 1
STATUS ON
TYPE LINE
PROCESSING "ITEMS=prop0,prop1"
FEATURE
ITEMS "value0;0.0"
POINTS
102.0 0.0
103.0 1.0
104.0 0.0
105.0 1.0
END
END
END
An example of using the plugin with mappyfile
can be found in example.py
along with an example.map.
A further example, creating images for each of the test cases using mapscript is available at create_images.py.
The sample output images are in the images folder.
- Python 3.8+
- mappyfile (the plugin can be used on its own but will create a dictionary object structured to use within mappyfile). Installing mappyfile should be done separately.
Note installing the mappyfile-geojson
plugin will automatically install the required dependency geojson
.
pip install mappyfile
pip install mappyfile-geojson
Can calculate extent of input features, with an optional buffer (by passing an
extent_buffer
to theconvert
function)Multipart features are supported
Coordinate sequences with Z values are supported, but Z values are ignored as they are not supported in Mapserver inline features.
As a MapServer
LAYER
only supports a single geometry type, all features in the GeoJSON file should also be of the same type (however a mix of multipart and non-multipart features is supported e.g. LineString and MultiLineString)Nested JSON properties are not supported:
"properties": { "prop0": "value0", "prop1": { "this": "that" } }
Will become:
ITEMS "value0;{u'this': u'that'}"
- Drop support for Python 2.7
- Update of GeoJSON and mappyfile dependencies
- Code reformatted using
black
- Automated Windows testing
- Automated release process
- Set
geojson
dependency version - Fix failing tests due to precision issue differences between py2 and py3
- Use integers for layer
EXTENT
where possible e.g. 5 instead of 5.0
- Add support for MultiPoint, MultiLineString, and MultiPolygon
- Allow coordinates with Z values (previously these would crash the script)
- Updated README
- Unicode support
- Initial release
- Seth Girvin @geographika