Skip to content

Commit ca0a3b0

Browse files
mikemcdougallMike McDougallclaude
authored
feat: audit and remove unnecessary trademark usage in favor of open standards terminology (#128)
- Replace "ArcGIS-compatible" with "GeoServices REST compatible" in README.md - Update "Esri Service Import Wizard" to "GeoServices Import Wizard" across documentation - Replace trademark references with open standards terminology in ARCHITECTURE.md - Update test method names and descriptions to use "GeoServices REST" instead of "Esri" - Update architecture diagrams to show generic "GeoServices REST Client" instead of specific products - Preserve all technical implementation requirements for protocol compliance - Maintain Esri JSON format handling as required by GeoServices REST specification All functionality preserved - this is a documentation and naming cleanup only. No protocol implementation changes or breaking changes. Resolves #125 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Mike McDougall <[email protected]> Co-authored-by: Claude Sonnet 4 <[email protected]>
1 parent ea4c14a commit ca0a3b0

File tree

9 files changed

+43
-43
lines changed

9 files changed

+43
-43
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
[![Docker](https://img.shields.io/badge/Docker-ready-blue.svg)](https://hub.docker.com/r/honuaio/honua-server)
1010

1111
Honua MVP serves and edits PostGIS data over multiple protocols with a small, fast footprint:
12-
- **GeoServices REST FeatureServer**ArcGIS-compatible queries + full editing (applyEdits, attachments, related records).
12+
- **GeoServices REST FeatureServer**GeoServices REST compatible queries + full editing (applyEdits, attachments, related records).
1313
- **OGC API Features** — Modern REST/JSON for GIS apps with transaction support.
1414
- **OData v4** — Full CRUD access for Excel/Power BI with spatial queries.
1515
- **Vector Tiles (MVT)** — PostGIS-native tile generation.
1616

17-
Includes **file import** (GeoJSON, Shapefile, GeoPackage, CSV, KML) and an **Esri Service Import Wizard** for easy migration. Everything else (images, multi-DB, AI, advanced admin) is deferred to keep the surface area tight. See `docs/ROADMAP.md` for what comes next.
17+
Includes **file import** (GeoJSON, Shapefile, GeoPackage, CSV, KML) and a **GeoServices Import Wizard** for easy migration. Everything else (images, multi-DB, AI, advanced admin) is deferred to keep the surface area tight. See `docs/ROADMAP.md` for what comes next.
1818

1919
## Status
2020

@@ -61,8 +61,8 @@ Planned endpoints:
6161
- **Vector Tiles (MVT)**: PostGIS `ST_AsMVT`, TileJSON metadata.
6262
- **File Import**: GeoJSON, Shapefile, GeoPackage, CSV (lat/lon or WKT), KML/KMZ — no GDAL required.
6363
- **CRS Support**: PostGIS-based reprojection, any EPSG code, auto-detect from source files.
64-
- Outputs: GeoJSON, Esri JSON, MVT.
65-
- **Esri Service Import Wizard**: paste ArcGIS Server URL, import layers, publish to Honua.
64+
- Outputs: GeoJSON, GeoServices JSON, MVT.
65+
- **GeoServices Import Wizard**: paste GeoServices REST server URL, import layers, publish to Honua.
6666
- **Visual Style Editor**: embedded Maputnik for MapLibre-based styling (Simple, UniqueValue, ClassBreaks).
6767
- Minimal admin: connect PostGIS, publish a layer/service, enable/disable, view health, map preview.
6868
- **OIDC Authentication**: Azure AD, Google, generic OIDC provider support.

docs/ARCHITECTURE.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ public sealed record IdsResponse : QueryResponse
479479

480480
Both protocols require metadata endpoints for service discovery.
481481

482-
### Esri GeoServices REST Catalog
482+
### GeoServices REST Catalog
483483

484484
```csharp
485485
// Features/Metadata/CatalogEndpoint.cs
@@ -1858,7 +1858,7 @@ OData enables Excel, Power BI, and other BI tools to query geospatial data direc
18581858
| Excel user queries layer | Export CSV, import manually | Direct `=OData.Feed()` connection |
18591859
| Power BI dashboard | Custom REST connector | Native OData source, auto-schema |
18601860
| Tableau analytics | Manual data prep | Live OData connection |
1861-
| Migration from ArcGIS | "Where's OData?" | Familiar workflow |
1861+
| Migration from GeoServices servers | "Where's OData?" | Familiar workflow |
18621862

18631863
**OData is table stakes for enterprise GIS** — many organizations use Power BI/Excel for reporting and expect direct connectivity.
18641864

@@ -2934,7 +2934,7 @@ src/Honua.Admin/
29342934
│ │ └── LayerPreview.razor # MapLibre preview
29352935
│ ├── Import/
29362936
│ │ ├── FileImport.razor # Upload GeoJSON/Shapefile/etc.
2937-
│ │ ├── EsriImport.razor # Esri service import wizard
2937+
│ │ ├── GeoServicesImport.razor # GeoServices REST import wizard
29382938
│ │ └── ImportPreview.razor # Preview before import
29392939
│ └── Health/
29402940
│ └── HealthDashboard.razor # Service health
@@ -3330,7 +3330,7 @@ window.maplibreInterop = {
33303330
│ Admin preview → Use maplibre_style directly │
33313331
│ │
33323332
│ Edit in Maputnik → Update maplibre_style → Invalidate cache │
3333-
│ Import from Esri → Store both, maplibre is derived
3333+
│ Import from GeoServices → Store both, maplibre is derived │
33343334
│ │
33353335
└─────────────────────────────────────────────────────────────────┘
33363336
```
@@ -3342,12 +3342,12 @@ window.maplibreInterop = {
33423342
- Editable in Maputnik/QGIS/GeoStyler
33433343
- JSON, not XML
33443344
3345-
**Esri compatibility:**
3345+
**GeoServices REST format compatibility:**
33463346
- Convert MapLibre → Esri drawingInfo on first request, cache it
3347-
- When importing from Esri service, store original AND derive MapLibre
3347+
- When importing from GeoServices server, store original AND derive MapLibre
33483348
- Cache invalidated when style is edited
33493349
3350-
### Esri Renderer Support
3350+
### GeoServices REST Renderer Support
33513351
33523352
| Renderer | MVP | MapLibre Mapping |
33533353
|----------|-----|------------------|
@@ -3378,7 +3378,7 @@ ALTER TABLE honua.layers ADD COLUMN style_version INT DEFAULT 1;
33783378
1. If `esri_drawing_info` is NULL → convert from `maplibre_style`, cache it
33793379
2. Return cached `esri_drawing_info`
33803380

3381-
**On Esri import:**
3381+
**On GeoServices REST import:**
33823382
1. Store original in `esri_drawing_info`
33833383
2. Convert to MapLibre, store in `maplibre_style`
33843384
3. MapLibre becomes canonical for future edits
@@ -3856,7 +3856,7 @@ public static class StyleEndpoint
38563856
| **OGC API Styles** || REST API for style management — planned for Beta |
38573857
| **CartoCSS** || Mapbox legacy — no plans |
38583858

3859-
**Primary standard is Mapbox/MapLibre Style Specification v8** — the de facto standard for web maps. Esri JSON is supported for ArcGIS compatibility, converted server-side.
3859+
**Primary standard is Mapbox/MapLibre Style Specification v8** — the de facto standard for web maps. Esri JSON is supported for GeoServices REST protocol compatibility, converted server-side.
38603860

38613861
### Embedded Style Editor (Maputnik)
38623862

@@ -4098,7 +4098,7 @@ app.MapGet("/api/styles/{layerId}", async (
40984098

40994099
### MVP Workflow
41004100

4101-
1. **Import from Esri**: Renderer JSON preserved, converted to MapLibre (canonical)
4101+
1. **Import from GeoServices REST**: Renderer JSON preserved, converted to MapLibre (canonical)
41024102
2. **New layer (no style)**: Apply sensible defaults by geometry type
41034103
3. **Edit style**: Open embedded Maputnik, edit visually, save
41044104
4. **FeatureServer response**: Return cached Esri JSON (convert from MapLibre if stale)
@@ -4578,7 +4578,7 @@ Week 3-4
45784578
├── Query with spatial predicates
45794579
├── Query with pagination
45804580
├── Statistics queries
4581-
├── GeoJSON + Esri JSON output
4581+
├── GeoJSON + GeoServices JSON output
45824582
└── 80%+ coverage on Query slice
45834583
```
45844584

@@ -4615,7 +4615,7 @@ Week 7-10
46154615
| **Lines per class** | 500-1000 | 50-200 |
46164616
| **Test setup** | Mock 22 things | Mock 2-3 things |
46174617
| **Add new endpoint** | Modify controller | Add new folder |
4618-
| **Output formats** | 10 | 3 (GeoJSON, Esri JSON, MVT) |
4618+
| **Output formats** | 10 | 3 (GeoJSON, GeoServices JSON, MVT) |
46194619
| **Database support** | 8+ | 1 (PostgreSQL) |
46204620

46214621
---
@@ -4936,7 +4936,7 @@ app.UseStatusCodePages();
49364936

49374937
Each protocol has its own error response format. The global exception handler detects the protocol from the request path and formats errors accordingly.
49384938

4939-
**Esri GeoServices REST** — Returns `{ "error": { "code", "message", "details" } }`:
4939+
**GeoServices REST** — Returns `{ "error": { "code", "message", "details" } }`:
49404940

49414941
```json
49424942
{

docs/ARCHITECTURE_DIAGRAMS.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@ C4Context
2121
2222
System(honua, "Honua Feature Server", "Multi-protocol geospatial feature server")
2323
24-
System_Ext(arcgis, "ArcGIS Pro/Online", "Esri GIS platform")
24+
System_Ext(geoservices_client, "GeoServices REST Client", "GIS platform supporting GeoServices REST")
2525
System_Ext(qgis, "QGIS", "Open source GIS")
2626
System_Ext(maplibre, "MapLibre GL", "Web mapping library")
2727
System_Ext(excel, "Excel/Power BI", "Microsoft BI tools")
2828
System_Ext(postgis, "PostgreSQL + PostGIS", "Geospatial database")
2929
30-
Rel(gisUser, arcgis, "Uses")
30+
Rel(gisUser, geoservices_client, "Uses")
3131
Rel(gisUser, qgis, "Uses")
3232
Rel(developer, maplibre, "Builds with")
3333
Rel(analyst, excel, "Analyzes in")
3434
Rel(admin, honua, "Manages via Admin UI")
3535
36-
Rel(arcgis, honua, "FeatureServer REST", "HTTPS")
36+
Rel(geoservices_client, honua, "FeatureServer REST", "HTTPS")
3737
Rel(qgis, honua, "OGC API Features", "HTTPS")
3838
Rel(maplibre, honua, "Vector Tiles (MVT)", "HTTPS")
3939
Rel(excel, honua, "OData v4", "HTTPS")
@@ -46,7 +46,7 @@ C4Context
4646
```mermaid
4747
graph TB
4848
subgraph Clients
49-
ArcGIS[ArcGIS Pro/Online]
49+
GeoServicesClient[GeoServices REST Client]
5050
QGIS[QGIS]
5151
MapLibre[MapLibre GL]
5252
Excel[Excel/Power BI]
@@ -62,7 +62,7 @@ graph TB
6262
PostGIS[(PostgreSQL + PostGIS)]
6363
end
6464
65-
ArcGIS -->|FeatureServer REST| API
65+
GeoServicesClient -->|FeatureServer REST| API
6666
QGIS -->|OGC API Features| API
6767
MapLibre -->|MVT Tiles| API
6868
Excel -->|OData v4| API
@@ -245,7 +245,7 @@ Shows how a query request flows through the system.
245245
```mermaid
246246
sequenceDiagram
247247
autonumber
248-
participant Client as ArcGIS/QGIS
248+
participant Client as GeoServices/OGC Client
249249
participant EP as QueryEndpoint
250250
participant Parser as QueryParser
251251
participant Handler as QueryHandler
@@ -333,7 +333,7 @@ Shows how filters from different protocols converge on a shared AST.
333333
```mermaid
334334
graph LR
335335
subgraph "Protocol Parsers"
336-
ESRI[Esri WHERE<br/><i>population > 1000</i>]
336+
GEOSERVICES[GeoServices WHERE<br/><i>population > 1000</i>]
337337
CQL[CQL2-Text<br/><i>population > 1000</i>]
338338
ODATA[OData $filter<br/><i>population gt 1000</i>]
339339
end

docs/ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Honua Roadmap
22

3-
This roadmap assumes the MVP described in `docs/MVP_PLAN.md` (full FeatureServer + OGC API Features + OData v4 with spatial + CRUD + MVT + file import + CRS support on PostGIS + Esri Import Wizard + embedded Maputnik style editor + OIDC authentication + Helm/Terraform deployment templates) is delivered; the current repo is in planning/Phase 0.
3+
This roadmap assumes the MVP described in `docs/MVP_PLAN.md` (full FeatureServer + OGC API Features + OData v4 with spatial + CRUD + MVT + file import + CRS support on PostGIS + GeoServices Import Wizard + embedded Maputnik style editor + OIDC authentication + Helm/Terraform deployment templates) is delivered; the current repo is in planning/Phase 0.
44

55
## Beta (stabilize core + top asks)
66
- **Query caching:** Short-lived result caching (10-30s) with ETag validation for read-heavy workloads.

docs/adr/0002-maplibre-canonical-style.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Accepted
55

66
## Context
77
Honua serves layers via multiple protocols (FeatureServer, OGC API Features, OData). Each protocol has different styling expectations:
8-
- Esri clients expect `drawingInfo` with renderer definitions
8+
- GeoServices REST clients expect `drawingInfo` with renderer definitions
99
- MapLibre/Mapbox clients expect Style Spec v8 JSON
1010
- OGC API Styles (future) expects OGC Styles
1111

@@ -37,7 +37,7 @@ ALTER TABLE honua.layers ADD COLUMN esri_drawing_info JSONB; -- Cache
3737
### Negative
3838
- Esri-specific advanced renderer features may not round-trip perfectly
3939
- Must implement and maintain MapLibre → Esri converter
40-
- Importing Esri services requires Esri → MapLibre conversion
40+
- Importing GeoServices REST services requires Esri → MapLibre conversion
4141

4242
### Mitigation
4343
- Cache Esri `drawingInfo` in layer table to avoid repeated conversion

docs/adr/0009-shared-filter-ast.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Honua supports multiple query protocols, each with its own filter syntax:
1010

1111
| Protocol | Filter Syntax | Example |
1212
|----------|--------------|---------|
13-
| **FeatureServer REST** | Esri WHERE clause | `population > 1000 AND state = 'CA'` |
13+
| **FeatureServer REST** | GeoServices REST WHERE clause | `population > 1000 AND state = 'CA'` |
1414
| **OGC API Features** | CQL2-Text | `population > 1000 AND state = 'CA'` |
1515
| **OData v4** | $filter | `population gt 1000 and state eq 'CA'` |
1616

src/Honua.Core/Features/FeatureStore/Domain/FeatureQuery.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Honua.Core.Features.FeatureStore.Domain;
1111
public readonly record struct FeatureQuery
1212
{
1313
/// <summary>
14-
/// WHERE clause filter expression (Esri SQL syntax)
14+
/// WHERE clause filter expression (GeoServices REST SQL syntax)
1515
/// </summary>
1616
public string? Where { get; init; }
1717

tests/Honua.Server.Tests/FeatureServerEndpointTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public async Task GetLayerMetadata_WithWrongHttpMethod_Returns405()
202202
[IntegrationTest]
203203
[Operation(Operations.GetMetadata)]
204204
[Endpoint("GET /rest/services/{serviceId}/FeatureServer")]
205-
public async Task GetServiceMetadata_ResponseValidatesAgainstEsriSchema()
205+
public async Task GetServiceMetadata_ResponseValidatesAgainstGeoServicesSchema()
206206
{
207207
// Act
208208
var response = await _fixture.Client.GetAsync($"/rest/services/{TestServiceId}/FeatureServer");
@@ -214,10 +214,10 @@ public async Task GetServiceMetadata_ResponseValidatesAgainstEsriSchema()
214214
var serviceResponse = JsonSerializer.Deserialize<FeatureServerResponse>(
215215
content, FeatureServerJsonContext.Default.FeatureServerResponse);
216216

217-
// Validate Esri JSON schema compliance
217+
// Validate GeoServices REST JSON schema compliance
218218
serviceResponse.Should().NotBeNull();
219219

220-
// Required Esri service properties
220+
// Required GeoServices REST service properties
221221
serviceResponse!.CurrentVersion.Should().NotBeNullOrEmpty();
222222
serviceResponse.ServiceName.Should().NotBeNullOrEmpty();
223223
serviceResponse.ServiceDescription.Should().NotBeNullOrEmpty();
@@ -239,7 +239,7 @@ public async Task GetServiceMetadata_ResponseValidatesAgainstEsriSchema()
239239
[IntegrationTest]
240240
[Operation(Operations.GetMetadata)]
241241
[Endpoint("GET /rest/services/{serviceId}/FeatureServer/{layerId}")]
242-
public async Task GetLayerMetadata_ResponseValidatesAgainstEsriSchema()
242+
public async Task GetLayerMetadata_ResponseValidatesAgainstGeoServicesSchema()
243243
{
244244
// Act
245245
var response = await _fixture.Client.GetAsync($"/rest/services/{TestServiceId}/FeatureServer/{TestLayerId}");
@@ -251,10 +251,10 @@ public async Task GetLayerMetadata_ResponseValidatesAgainstEsriSchema()
251251
var layerResponse = JsonSerializer.Deserialize<LayerResponse>(
252252
content, FeatureServerJsonContext.Default.LayerResponse);
253253

254-
// Validate Esri JSON schema compliance for layer metadata
254+
// Validate GeoServices REST JSON schema compliance for layer metadata
255255
layerResponse.Should().NotBeNull();
256256

257-
// Required Esri layer properties
257+
// Required GeoServices REST layer properties
258258
layerResponse!.CurrentVersion.Should().NotBeNullOrEmpty();
259259
layerResponse.Id.Should().BeGreaterOrEqualTo(0);
260260
layerResponse.Name.Should().NotBeNullOrEmpty();
@@ -607,7 +607,7 @@ public async Task QueryFeatures_PostWithPagingParameters_ReturnsCorrectPage()
607607
[Endpoint("GET /rest/services/{serviceId}/FeatureServer/{layerId}/query")]
608608
public async Task QueryFeatures_WithPointGeometryIntersects_ReturnsFilteredFeatures()
609609
{
610-
// Arrange - Point geometry in Esri JSON format
610+
// Arrange - Point geometry in GeoServices REST JSON format
611611
var pointGeometry = @"{""x"":-122.4194,""y"":37.7749}"; // San Francisco coordinates
612612

613613
// Act
@@ -759,12 +759,12 @@ public async Task QueryFeatures_WithSpatialAndAttributeFilters_ReturnsFilteredFe
759759
// Output format tests (Issue #9)
760760

761761
/// <summary>
762-
/// Tests that f=json returns Esri JSON format with correct content type
762+
/// Tests that f=json returns GeoServices REST JSON format with correct content type
763763
/// </summary>
764764
[IntegrationTest]
765765
[Operation(Operations.Query)]
766766
[Endpoint("GET /rest/services/{serviceId}/FeatureServer/{layerId}/query")]
767-
public async Task QueryFeatures_WithFormatJson_ReturnsEsriJsonFormat()
767+
public async Task QueryFeatures_WithFormatJson_ReturnsGeoServicesJsonFormat()
768768
{
769769
// Act
770770
var response = await _fixture.Client.GetAsync($"/rest/services/{TestServiceId}/FeatureServer/{TestLayerId}/query?f=json");
@@ -833,7 +833,7 @@ public async Task QueryFeatures_WithFormatGeoJson_ReturnsGeoJsonFormat()
833833
[Endpoint("GET /rest/services/{serviceId}/FeatureServer/{layerId}/query")]
834834
public async Task QueryFeatures_WithOutFieldsParam_FiltersAttributesInBothFormats()
835835
{
836-
// Test Esri JSON format
836+
// Test GeoServices REST JSON format
837837
var esriResponse = await _fixture.Client.GetAsync($"/rest/services/{TestServiceId}/FeatureServer/{TestLayerId}/query?f=json&outFields=objectid,name");
838838
esriResponse.Should().BeSuccessful();
839839

@@ -874,7 +874,7 @@ public async Task QueryFeatures_WithOutFieldsParam_FiltersAttributesInBothFormat
874874
[Endpoint("GET /rest/services/{serviceId}/FeatureServer/{layerId}/query")]
875875
public async Task QueryFeatures_WithReturnGeometryFalse_OmitsGeometryInBothFormats()
876876
{
877-
// Test Esri JSON format
877+
// Test GeoServices REST JSON format
878878
var esriResponse = await _fixture.Client.GetAsync($"/rest/services/{TestServiceId}/FeatureServer/{TestLayerId}/query?f=json&returnGeometry=false");
879879
esriResponse.Should().BeSuccessful();
880880

@@ -935,12 +935,12 @@ public async Task QueryFeatures_PostWithGeoJsonFormat_ReturnsGeoJsonFormat()
935935
}
936936

937937
/// <summary>
938-
/// Tests that invalid format parameter defaults to Esri JSON
938+
/// Tests that invalid format parameter defaults to GeoServices REST JSON
939939
/// </summary>
940940
[IntegrationTest]
941941
[Operation(Operations.Query)]
942942
[Endpoint("GET /rest/services/{serviceId}/FeatureServer/{layerId}/query")]
943-
public async Task QueryFeatures_WithInvalidFormat_DefaultsToEsriJson()
943+
public async Task QueryFeatures_WithInvalidFormat_DefaultsToGeoServicesJson()
944944
{
945945
// Act
946946
var response = await _fixture.Client.GetAsync($"/rest/services/{TestServiceId}/FeatureServer/{TestLayerId}/query?f=invalid");

tests/Honua.TestKit/Constants/Protocols.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Honua.TestKit.Constants;
1010
public static class Protocols
1111
{
1212
/// <summary>
13-
/// ArcGIS GeoServices REST API (Feature Server).
13+
/// GeoServices REST API (Feature Server).
1414
/// </summary>
1515
public const string FeatureServer = "FeatureServer";
1616

0 commit comments

Comments
 (0)