Graticula

Self-hosted GIS server · v1

A GIS server and its portal, from one container and one Postgres.

Server publishes your PostGIS, Oracle, SQL Server, MySQL and MariaDB tables and GeoParquet files as feature, map, image and geometry services, and the data it holds as vector tiles. Studio does the portal's work — items, members, roles, groups and sharing. ArcGIS Pro, Field Maps and QGIS open them the way they open any ArcGIS server.

  • Speaks the ArcGIS REST API
  • One process, one database
  • Community License 1.1
The Studio map viewer: a layer panel on the left and the buildings of Istanbul's historic peninsula drawn from a GeoParquet file.

Server

Publish from PostGIS. The services look like ArcGIS services.

Register a database, choose its tables and publish them. The service directory, the JSON documents and the tokens have the shapes ArcGIS clients already expect, at /rest/services. Where a service is partial, it says which part.

Complete

Feature services

Query and edit PostGIS tables and hosted layers. Attachments, relationships, time and Z/M values. JSON, GeoJSON or PBF. A hosted layer can keep every version of its features: ArcGIS clients ask for a moment in the past, Studio puts a feature back as it was, and the owner chooses how many days to keep. Any layer can be downloaded as a GeoPackage, Shapefile, File Geodatabase, Excel workbook, KML, CSV, GeoJSON or Esri JSON file; a GeoPackage and a File Geodatabase keep the layer's domains.

query · applyEdits · attachments · queryRelatedRecords

Complete

Map services

Maps drawn on the server from each layer's stored symbology, by time where a layer has a time field.

export · identify · legend · query

Complete

Vector tile services

Tiles from the data Graticula holds itself, as ArcGIS serves them from hosted data; a registered database or file is served as features and maps. With styles, icons and a glyph set so labels draw. The cache can be seeded ahead of the first request, and an edit empties only the tiles it touched, so a seeded cache survives editing. A layer's picture markers are drawn from their own images. The glyph set covers Latin, Greek, Cyrillic, Arabic, Hebrew, Armenian, Georgian, Devanagari, Bengali, Tamil and Thai, though MapLibre draws the last three Indic scripts unshaped; Chinese, Japanese and Korean come with an optional build. Tiles can also be cut on the Turkish national grids (TUREF) and exported for offline use, as a VTPK for ArcGIS Pro and Field Maps or as a PMTiles archive.

tile · resources/styles · exportTiles

Complete

Image services

GeoTIFF, JPEG 2000, NetCDF, HDF, ERDAS Imagine and ASCII grids uploaded from Studio, or GeoTIFFs registered where they lie; a NetCDF of variables over time and depth becomes a multidimensional service of slices. Each service is a mosaic dataset's catalog: queried, ordered or composited by a mosaic rule (seamlines included), reordered in Studio, edited as ArcGIS edits one. Eleven raster functions from Hillshade and NDVI to Clip and Statistics, measurement on the ground, a raster attribute table, Download and pyramids. MrSID and ECW are refused by name: only their makers' SDKs read them.

exportImage · identify · query · measure · getSamples

Complete

Geometry service

Buffer, intersect, union, difference, cut, project, autoComplete, reshape, trimExtend and more. findTransformations lists the datum transformations between two references, and project applies the one you name.

Also

OGC interfaces

The same layers over OGC API – Features (filtered in CQL2), WFS 2.0 and 1.1 (editable through WFS-T), and WMS 1.3 and 1.1 (with a style sent as SLD), image services over WMS and WMTS and their values over WCS 2.0 and 1.0, any map in Google Earth through KML, and the vector tiles over OGC API – Tiles, WMTS and TileJSON. Each service answers at its own ArcGIS-style WMSServer and WFSServer address, and its owner turns each face on or off, states its fees and access constraints, and can make it an INSPIRE View and Download service; the View service passes the official INSPIRE validator. A layer can have its own title in these lists, and a client that cannot use a token signs in with Basic authentication over HTTPS.

GeoParquet

Serve GeoParquet files where they are.

No import step. DuckDB reads the files in place, and the server publishes them like any other layer.

  • A folder on the server, an https:// address or an s3:// prefix.
  • A DuckDB database file or a MotherDuck database.
  • Feature and map services from the same file.
  • A database file or MotherDuck is edited like any other database; GeoParquet files stay read only. No attachments or related records on these layers.
  • A registered DuckDB file is the server's while it is registered: no other program can open it meanwhile.
Browse the GeoParquet services on the demo

The same 1.27 million Istanbul buildings, two ways. One dataset published from a GeoParquet file and from a DuckDB database file, each as a feature and a map service. Open either on the demo:

Browse the city services: Istanbul and New York
A map of western Istanbul covered in a dense teal network of roads, drawn by Graticula over an OpenStreetMap basemap.
The whole file: every street is a row in a Parquet file.

Studio

If you have run ArcGIS Enterprise, you already know the shape of this.

Studio is where publishers work. Server is where the operator works. They are one process and one API, so there is no site to create, no data store to install and no portal to federate.

In ArcGIS EnterpriseIn Graticula
A GIS Server site with several machinesOne server process
ArcGIS Data Store, installed separatelyThe PostgreSQL the server already uses
An enterprise geodatabase as a data storeYour own PostGIS, Oracle, SQL Server, MySQL or MariaDB, registered, read and write — Oracle's SDO_GEOMETRY tables, SQL Server's geometry and geography tables and MySQL's and MariaDB's spatial tables as they are, no geodatabase installed
Portal for ArcGISStudio: items, members, roles, groups, sharing and saved web maps, and documents — PDF, Word, PowerPoint and pictures — as items of their own. Items carry terms of use and categories, members keep favourites, and a deleted item waits fourteen days in the recycle bin
Several ArcGIS Online organizationsSeveral organizations on one server, each at its own address: its own members, names, custom roles, groups and administrator, kept apart by the database itself. A group can admit another organization's members, who see it on their own Groups page
Partnered collaborationThe same between organizations on one server: one invites, the other accepts, each decides whether the other may find its members, and a group can be limited to partners. Ending it takes each side's members out of the other's partner groups, with the groups listed before you confirm. Collaboration coordinators are not built
Sharing with the organization or with everyoneThose two, and a level between them: all organizations on this server, read by every organization's signed-in members and by nobody anonymous. Studio's search finds such items from another organization, as ArcGIS Online's search beyond My organization does
Server ManagerServer: each organization's services, data sources and logs. With several organizations, System is the system administrator's: the organizations, the machine's status, log and settings
SAML, OpenID Connect and Active Directory sign-inThe same three, tested against providers the test suite runs
A basemap gallery and a default basemapThe same: a group whose vector tile services and web maps are the basemaps, and one of them as the default
Analysis tools (the Spatial Analysis Service)Built in: Create Buffers, Dissolve Boundaries, Overlay Layers, Merge Layers, Aggregate Points, Find Centroids, Summarize Within and Join Features, with hexagon and square bins, group-by summaries, and feature collections in and out. Each runs as a job over hosted layers and is written as a new hosted layer. Studio runs them from a layer's page and from the map, and the ArcGIS API for Python's own analysis functions run them unchanged. ArcGIS Pro's analysis toolbox reaches its server through SOAP, which is not served
Your own Python tools (GPServer)A Python toolbox (.pyt) published from Studio becomes a geoprocessing service. Its tools are written as for arcpy, import grapy as arcpy, and run in a separate process with no network, under limits on memory and time, reading hosted layers and image services and writing hosted layers. grapy keeps arcpy's documented names, and the status page counts how many of them it builds
Backing up the deploymentgraticula backup and graticula restore, and System › Backups in the console: take one, download it, and keep the newest few on a daily schedule
Moving a site's configurationgraticula tools manifest writes data sources, services, groups and styles to one JSON file and applies it to another server
Share As Web Layer to the hosting serverThe same from ArcGIS Pro: Copy all data makes a hosted feature layer, and Overwrite Web Layer replaces its data
Migrating an ArcGIS Server sitegraticula tools migrate brings layer drawing and field aliases across

Clients

Opened by the clients you already have.

Nothing to install on the desktop and no plug-in. The clients connect to Graticula the same way they connect to an ArcGIS server.

ArcGIS Pro

Add a portal connection, sign in, browse My Content, add a layer and edit it. Vector tile services draw, classified styles included. Pro lists the portal's basemap gallery, draws image services and copies one out cell for cell with Copy Raster. Share As Web Layer with Copy all data publishes a hosted feature layer into Graticula's own database, with the layer's drawing, its sharing level and its groups; Overwrite Web Layer replaces the data and keeps the item, its address and its sharing. Add the portal as https://your-server/studio: Pro offers publishing only to a portal at a path like that.

ArcGIS Field Maps

Signs in through OAuth 2.0, served by Graticula and completed by the JavaScript SDK; Field Maps itself has not yet been tried on a device. Online data collection uses the same feature services. Offline editing is not supported. A vector tile basemap can be exported as a VTPK, not yet tried in a Field Maps offline area.

ArcGIS Maps SDK for JavaScript

Web apps load the layers and sign people in through the same OAuth flow. Set the app's portal to Graticula and it opens saved web maps, the default basemap and the basemap gallery, from a page on another site too.

ArcGIS API for Python

Signs in with a user name and password, searches content and appends rows to hosted layers.

QGIS and OGC clients

Through the ArcGIS REST connection, or through OGC API – Features, WFS, WMS and WCS. Vector tiles through OGC API – Tiles, WMTS or TileJSON. Over OGC, a secured service takes a user name and password over HTTPS.

Install

Docker is the only thing you install.

No .NET SDK, no separate PostgreSQL and no openssl. The images are on the GitHub Container Registry for amd64 and arm64.

  1. Make a key

    It seals stored credentials. There is no default key.

    docker compose run --rm --no-deps server keygen
    echo "GIS_SECRET_KEY=<the value it printed>" > .env
  2. Create the schema

    Migrations are explicit, never automatic.

    docker compose run --rm server migrate --apply
  3. Start it

    It makes its own certificate on the first run and keeps it.

    docker compose up -d
  4. Claim the server

    A new server writes a single-use setup token to its log.

    docker compose logs server | grep -A2 "SETUP REQUIRED"

The full instructions are in the README

Limits

What it does not do yet.

Read this before you plan around it. Each item is a limit today.

  • PostGIS, Oracle, SQL Server, MySQL and MariaDB, for databasesNo file geodatabase is served in place, and an Esri enterprise geodatabase's own ST_GEOMETRY tables are not read. Oracle's SDO_GEOMETRY tables are read and edited in place, with Z and M, GlobalIDs and related records, and with attachments and history where an administrator switches them on, without versioning. MySQL 8.0 and MariaDB 10.6 or later are read and edited in x and y only, since neither keeps Z or M; their history is kept by triggers, so the connected user must be allowed to create them, and ArcGIS Pro reaches these layers through the FeatureServer, as it has no MySQL connection. SQL Server 2016 or later is read and edited in x and y, geometry and geography alike, with attachments, without history or related records yet, and cannot run on the demo's arm64 server. MariaDB cannot check a shape's validity or enforce a column's reference, and a publish says so. On every one of them an administrator switches on, from the console, attachments kept in the database or in Graticula, and the recording of who created and last edited each feature and when — the four columns added in one step. All of them are registered from the console; GeoParquet is read only. Vector tiles come from the datastore, not from a registered source.
  • Single sign-on is not yet proven in productionOIDC, SAML and Active Directory are tested against test providers, not yet against a real Entra ID or AD FS.
  • No offline editingNo replicas or sync, so Field Maps offline areas cannot take features offline. Vector tiles export as VTPK or PMTiles, not yet tried in Field Maps.
  • No geocoding, apps or dashboardsStudio saves web maps. It does not build apps.
  • Your tools run on grapy, not on arcpygrapy keeps arcpy's names, and every one is decided: of 2,174, 1,548 run — deep learning among them, on PyTorch, with weights you supply — and each of the other 626 refuses with its own reason, such as a format Esri does not publish or a method its page does not specify. A tool that calls one fails with that name and that reason. Tools that answer from Esri's own data or cloud services (Business Analyst, the World Geocoder) are not reproduced.
  • One machineNo clustering and no failover.
  • Not yet run in productionIt runs and it is tested. Nobody but its author has operated it in production yet.
The full list, with the reasons

See it with real data.

The demo is a running Graticula server: roads, buildings and places from PostGIS, GeoParquet and DuckDB. Open a service, draw a map, read the JSON.