django-geojson is a set of tools to manipulate GeoJSON with Django :
- (De)Serializer for (Geo)Django objects, querysets and lists
- Base views to serve GeoJSON map layers from models
- GeoJSON model and form fields to avoid spatial database backends (compatible with django-leaflet for map widgets)
pip install django-geojson
This package has optional extra dependencies.
If you need GeoJSON fields with map widgets :
pip install "django-geojson [field]"
Add djgeojson
to your applications :
# settings.py INSTALLED_APPS += ( 'djgeojson', )
(not required for views)
Very useful for web mapping :
# urls.py from djgeojson.views import GeoJSONLayerView ... url(r'^data.geojson$', GeoJSONLayerView.as_view(model=MushroomSpot), name='data'),
Consume the vector layer as usual, for example, with Leaflet loaded with jQuery Ajax:
# Leaflet JS var layer = L.geoJson(); map.addLayer(layer); $.getJSON("{% url 'data' %}", function (data) { layer.addData(data); });
Inherit generic views only if you need a reusable set of options :
# views.py from djgeojson.views import GeoJSONLayerView class MapLayer(GeoJSONLayerView): # Options precision = 4 # float simplify = 0.5 # generalization # urls.py from .views import MapLayer, MeetingLayer ... url(r'^mushrooms.geojson$', MapLayer.as_view(model=MushroomSpot, properties=('name',)), name='mushrooms')
Most common use-cases of reusable options are: low-fi precision, common list of fields between several views, etc.
Options are :
- properties :
list
of properties names, ordict
for mapping field names and properties - simplify : generalization of geometries (See
simplify()
) - precision : number of digit after comma
- geometry_field : name of geometry field (default:
geom
) - srid : projection (default: 4326, for WGS84)
- bbox : Allows you to set your own bounding box on feature collection level
- bbox_auto : True/False (default false). Will automatically generate a bounding box on a per feature level.
Vectorial tiles can help display a great number of objects on the map, with reasonnable performance.
# urls.py from djgeojson.views import TiledGeoJSONLayerView ... url(r'^data/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+).geojson$', TiledGeoJSONLayerView.as_view(model=MushroomSpot), name='data'),
Consume the vector tiles using Leaflet TileLayer GeoJSON, Polymaps, OpenLayers 3 or d3.js for example.
Options are :
- trim_to_boundary : if
True
geometries are trimmed to the tile boundary - simplifications : a dict of simplification values by zoom level
Mainly useful to dump features in HTML output and bypass AJAX call :
// Leaflet JS L.geoJson({{ object_list|geojsonfeature|safe}}).addTo(map);
Will work either for a model, a geometry field or a queryset.
{% load geojson_tags %} var feature = {{ object|geojsonfeature|safe }}; var geom = {{ object.geom|geojsonfeature|safe }}; var collection = {{ object_list|geojsonfeature|safe }};
Properties and custom geometry field name can be provided.
{{ object|geojsonfeature:"name,age" }} {{ object|geojsonfeature:"name,age:the_geom" }} {{ object|geojsonfeature:":geofield" }}
GeoJSON fields are based on Brad Jasper's JSONField. See INSTALL to install extra dependencies.
They are useful to avoid usual GIS stacks (GEOS, GDAL, PostGIS...) for very simple use-cases (no spatial operation yet).
from djgeojson.fields import PointField class Address(models.Model): geom = PointField() address = Address() address.geom = {'type': 'Point', 'coordinates': [0, 0]} address.save()
Form widgets are rendered with Leaflet maps automatically if django-leaflet is available.
All geometry types are supported and respectively validated : GeometryField, PointField, MultiPointField, LineStringField, MultiLineStringField, PolygonField, MultiPolygonField, GeometryCollectionField.
from djgeojson.serializers import Serializer as GeoJSONSerializer GeoJSONSerializer().serialize(Restaurants.objects.all(), use_natural_keys=True)
from djgeojson.serializers import Serializer as GeoJSONSerializer GeoJSONSerializer().deserialize('geojson', my_geojson)
You can optionally specify the model name directly in the parameters:
GeoJSONSerializer().deserialize('geojson', my_geojson, model_name=my_model_name)
Register the serializer in your project :
# settings.py SERIALIZATION_MODULES = { 'geojson' : 'djgeojson.serializers' }
Command-line dumpdata
can export files, viewable in GIS software like QGis :
python manage.py dumpdata --format=geojson yourapp.Model > export.geojson
Works with loaddata
as well, which can now import GeoJSON files.
- Mathieu Leplatre <[email protected]>
- Glen Robertson author of django-geojson-tiles at: https://github.com/glenrobertson/django-geojson-tiles/
- @jeffkistler's author of geojson serializer at: https://gist.github.com/967274
- Ben Welsh and Lukasz Dziedzia for quick test script
- Florent Lebreton http://github.com/fle
Version 1.X:
- Daniel Sokolowski, serializer snippet
- ozzmo, python 2.6 compatibility
- Lesser GNU Public License