Django GraphQL GeoJSON
GeoJSON support for Django GraphQL
Dependencies
Python ≥ 3.4
Django ≥ 1.11
Installation
Update Graphene Django package.
pip install -U git+https://github.com/graphql-python/graphene-django.git@master
Install last stable version from Pypi.
pip install django-graphql-geojson
GeoJSONType
GeoJSONType is a subclass of DjangoObjectType which provides GraphQL fields in GeoJSON format.
Just define a Meta.geojson_field to be represented as a Geometry type.
models.py
from django.contrib.gis.db import models
class Place(models.Model):
name = models.CharField(max_length=255)
location = models.PointField()
schema.py
import graphene
import graphql_geojson
class PlaceType(graphql_geojson.GeoJSONType):
class Meta:
model = models.Place
geojson_field = 'location'
class Query(graphene.ObjectType):
places = graphene.List(PlaceType)
schema = graphene.Schema(query=Query)
Query
query {
places {
id
type
geometry {
type
coordinates
}
bbox
properties {
name
}
}
}
Geometry Type
Geometry is a special GraphQL type that represents a GEOS geometry object.
schema.py
import graphene
import graphql_geojson
class CreatePlace(graphene.Mutation):
place = graphene.Field(types.PlaceType)
class Arguments:
name = graphene.String(required=True)
location = graphql_geojson.Geometry(required=True)
@classmethod
def mutate(cls, root, info, **args):
place = models.Place.objects.create(**args)
return cls(place=place)
Mutation
mutation CreatePlace($name: String!, $location: Geometry!) {
createPlace(name: $name, location: $location) {
place {
id
}
}
}
Geometry type may be initialized in a few ways:
Well-known text (WKT):
"POINT(5 23)"
Hexadecimal (HEX):
"010100000000000000000014400000000000003740"
GeoJSON:
{
"type": "Point",
"coordinates": [5, 23]
}
GeometryFilterSet
Django GraphQL GeoJSON provides a custom FilterSet for spatial lookups.
The Meta.fields option is combined with model to automatically generate filters.
filters.py
from graphql_geojson.filters import GeometryFilterSet
class PlaceFilter(GeometryFilterSet):
class Meta:
model = models.Place
fields = {
'name': ['exact'],
'location': ['exact', 'intersects', 'distance_lte'],
}
schema.py
import graphene
import graphql_geojson
from graphene import relay
from graphene_django.filter import DjangoFilterConnectionField
class PlaceNode(graphql_geojson.GeoJSONType):
class Meta:
model = Place
interfaces = [relay.Node]
geojson_field = 'location'
class Query(graphene.ObjectType):
places = DjangoFilterConnectionField(
PlaceNode,
filterset_class=PlaceFilter)
Query
query Places($geometry: Geometry!){
places(location_Intersects: $geometry) {
edges {
node {
id
}
}
}
}
Distance lookups take a Distance parameter comprising:
The desired unit attribute name
Distance value
A geometry to base calculations from
query Places(
$unit: DistanceUnitEnum!,
$value: Float!,
$geometry: Geometry!)
{
places(location_DistanceLte: {
unit: $unit,
value: $value,
geometry: $geometry
}) {
edges {
node {
id
}
}
}
}
Metadata
Release files for django-graphql-geojson 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django-graphql-geojson-0.1.1.tar.gz | 7.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_graphql_geojson-0.1.1-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 17.9 kB
Release files / django-graphql-geojson-0.1.1.tar.gz
| Download URL | django-graphql-geojson-0.1.1.tar.gz |
|---|---|
| Size | 7.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
78a1057313926b1be187729d8af258e94801c237fd336ba52d15a38e7834cc22
|
|
BLAKE2b-256 checksum How to use checksums |
e798ba4bcceeb3b47184b3607603df506eb3a9763aff183ad1ea2db5358515df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Release files / django_graphql_geojson-0.1.1-py2.py3-none-any.whl
| Download URL | django_graphql_geojson-0.1.1-py2.py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
26dda0dc41cff61d35c53d8ff1329aded8922398db1a6d7bba0c7478c2124fa1
|
|
BLAKE2b-256 checksum How to use checksums |
ce6c0cd719f167d4d999cccc13efaaf559fdaba248857e6ecb86b9ec5f669ec6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |