This is an automated email from the ASF dual-hosted git repository.

rkk pushed a commit to branch tmp-stv
in repository https://gitbox.apache.org/repos/asf/sdap-nexus.git

commit 54ae2414cb38025bcfb4e722547d2d05022925ec
Author: rileykk <[email protected]>
AuthorDate: Mon Dec 18 16:23:02 2023 -0800

    Add basemap below tomo render
---
 analysis/webservice/algorithms/Tomogram3D.py | 95 +++++++++++++++++++++++++++-
 1 file changed, 93 insertions(+), 2 deletions(-)

diff --git a/analysis/webservice/algorithms/Tomogram3D.py 
b/analysis/webservice/algorithms/Tomogram3D.py
index f590418..1bdccb5 100644
--- a/analysis/webservice/algorithms/Tomogram3D.py
+++ b/analysis/webservice/algorithms/Tomogram3D.py
@@ -23,6 +23,8 @@ import matplotlib as mpl
 import matplotlib.pyplot as plt
 import numpy as np
 import pandas as pd
+import requests
+from mpl_toolkits.basemap import Basemap
 from PIL import Image
 from webservice.NexusHandler import nexus_handler
 from webservice.algorithms.NexusCalcHandler import NexusCalcHandler
@@ -170,6 +172,8 @@ class Tomogram3D(NexusCalcHandler):
         min_lon = bounding_poly.bounds[0]
         max_lon = bounding_poly.bounds[2]
 
+        bounds = (min_lat, min_lon, max_lat, max_lon)
+
         tile_service = self._get_tile_service()
 
         tiles = tile_service.find_tiles_in_box(
@@ -250,13 +254,14 @@ class Tomogram3D(NexusCalcHandler):
 
         logger.info(f'DataFrame:\n{df}')
 
-        return Tomogram3DResults(df, render_params)
+        return Tomogram3DResults(df, render_params, bounds=bounds)
 
 
 class Tomogram3DResults(NexusResults):
-    def __init__(self, results=None, render_params=None, meta=None, 
stats=None, computeOptions=None, status_code=200, **args):
+    def __init__(self, results=None, render_params=None, bounds=None, 
meta=None, stats=None, computeOptions=None, status_code=200, **args):
         NexusResults.__init__(self, results, meta, stats, computeOptions, 
status_code, **args)
         self.render_params = render_params
+        self.bounds = bounds
 
     def results(self):
         r: pd.DataFrame = NexusResults.results(self)
@@ -275,6 +280,49 @@ class Tomogram3DResults(NexusResults):
 
         ax.view_init(elev=view_elev, azim=view_azim)
 
+        min_lat, min_lon, max_lat, max_lon = self.bounds
+
+        m = Basemap(llcrnrlon=min_lon, llcrnrlat=min_lat, urcrnrlat=max_lat, 
urcrnrlon=max_lon,)
+
+        basemap_size = 512
+
+        params = dict(
+            bbox=f'{min_lon},{min_lat},{max_lon},{max_lat}',
+            bboxSR=4326, imageSR=4326,
+            size=f'{basemap_size},{int(m.aspect * basemap_size)}',
+            dpi=2000,
+            format='png32',
+            transparent=True,
+            f='image'
+        )
+
+        url = 
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export'
+
+        logger.info('Pulling basemap')
+
+        try:
+            elevations = self.results()[['elevation']].values
+            z_range = np.nanmax(elevations) - np.nanmin(elevations)
+            z_coord = np.nanmin(elevations) - (0.1 * z_range)
+
+            r = requests.get(url, params=params)
+            r.raise_for_status()
+
+            buf = BytesIO(r.content)
+
+            img = Image.open(buf)
+            img_data = np.array(img)
+
+            lats = np.linspace(min_lat, max_lat, num=img.height)
+            lons = np.linspace(min_lon, max_lon, num=img.width)
+
+            X, Y = np.meshgrid(lons, lats)
+            Z = np.full(X.shape, z_coord)
+
+            ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=img_data 
/ 255)
+        except:
+            logger.error('Failed to pull basemap, will not draw it')
+
         logger.info('Plotting data')
 
         s = ax.scatter(
@@ -312,6 +360,49 @@ class Tomogram3DResults(NexusResults):
 
         ax.view_init(elev=orbit_elev, azim=0)
 
+        min_lat, min_lon, max_lat, max_lon = self.bounds
+
+        m = Basemap(llcrnrlon=min_lon, llcrnrlat=min_lat, urcrnrlat=max_lat, 
urcrnrlon=max_lon, )
+
+        basemap_size = 512
+
+        params = dict(
+            bbox=f'{min_lon},{min_lat},{max_lon},{max_lat}',
+            bboxSR=4326, imageSR=4326,
+            size=f'{basemap_size},{int(m.aspect * basemap_size)}',
+            dpi=2000,
+            format='png32',
+            transparent=True,
+            f='image'
+        )
+
+        url = 
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/export'
+
+        logger.info('Pulling basemap')
+
+        try:
+            elevations = self.results()[['elevation']].values
+            z_range = np.nanmax(elevations) - np.nanmin(elevations)
+            z_coord = np.nanmin(elevations) - (0.1 * z_range)
+
+            r = requests.get(url, params=params)
+            r.raise_for_status()
+
+            buf = BytesIO(r.content)
+
+            img = Image.open(buf)
+            img_data = np.array(img)
+
+            lats = np.linspace(min_lat, max_lat, num=img.height)
+            lons = np.linspace(min_lon, max_lon, num=img.width)
+
+            X, Y = np.meshgrid(lons, lats)
+            Z = np.full(X.shape, z_coord)
+
+            ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=img_data 
/ 255)
+        except:
+            logger.error('Failed to pull basemap, will not draw it')
+
         logger.info('Plotting data')
 
         s = ax.scatter(

Reply via email to