summaryrefslogtreecommitdiffstats
path: root/api/WhatApi/Endpoints/GetPlacesEndpoint.cs
diff options
context:
space:
mode:
Diffstat (limited to 'api/WhatApi/Endpoints/GetPlacesEndpoint.cs')
-rw-r--r--api/WhatApi/Endpoints/GetPlacesEndpoint.cs57
1 files changed, 57 insertions, 0 deletions
diff --git a/api/WhatApi/Endpoints/GetPlacesEndpoint.cs b/api/WhatApi/Endpoints/GetPlacesEndpoint.cs
new file mode 100644
index 0000000..5630229
--- /dev/null
+++ b/api/WhatApi/Endpoints/GetPlacesEndpoint.cs
@@ -0,0 +1,57 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using NetTopologySuite;
+using NetTopologySuite.Features;
+using NetTopologySuite.Geometries;
+using WhatApi.Tables;
+
+namespace WhatApi.Endpoints;
+
+public class GetPlacesEndpoint(Database db) : BaseEndpoint
+{
+ [HttpGet("~/places")]
+ public async Task<ActionResult> HandleAsync(string w, string s, string e, string n, CancellationToken ct = default) {
+ var north = double.Parse(n);
+ var east = double.Parse(e);
+ var south = double.Parse(s);
+ var west = double.Parse(w);
+
+ IQueryable<Place> resultingQuery;
+
+ if (west > east) {
+ resultingQuery = db.Places
+ .FromSqlInterpolated($"""
+ SELECT * FROM "Place"
+ WHERE ST_Intersects(
+ "Location",
+ ST_MakeEnvelope({west}, {south}, 180, {north}, {Constants.Wgs84SpatialReferenceId}) || ST_MakeEnvelope(-180, {south}, {east}, {north}, {Constants.Wgs84SpatialReferenceId})
+ )
+ """);
+ } else {
+ resultingQuery = db.Places
+ .FromSqlInterpolated($"""
+ SELECT * FROM "Place"
+ WHERE ST_Intersects(
+ "Location",
+ ST_MakeEnvelope({west}, {south}, {east}, {north}, {Constants.Wgs84SpatialReferenceId})
+ )
+ """);
+ }
+
+ var gf = NtsGeometryServices.Instance.CreateGeometryFactory(srid: Constants.Wgs84SpatialReferenceId);
+ var fc = new FeatureCollection();
+
+ await foreach (var p in resultingQuery.AsAsyncEnumerable().WithCancellation(ct)) {
+ var point = gf.CreatePoint(new Coordinate(p.Location.X, p.Location.Y));
+ fc.Add(new Feature(point, new AttributesTable {
+ {
+ "id", p.Id
+ }, {
+ "cid", p.ContentId
+ }
+ }));
+ }
+
+ return Ok(fc);
+ }
+} \ No newline at end of file