How to add an image on top of geobasemap?
Réponses (1)
@Sim, I see what happened - in your case you do have the Mapping Toolbox (your geobasemap is working), but the original code syntax was incorrect. Let me give you both solutions.
Solution 1: WITH Mapping Toolbox (Your Case)
Based on the MathWorks documentation for geoshow, here's the correct syntax:
% Read the image
[imgData, ~, alphaData] = imread('/MATLAB Drive/IMG_6894.PNG');
%replace it with your directory path
% Define the geographic bounds latlim = [40, 50]; lonlim = [0, 10];
% Create figure with geoaxes figure; gx = geoaxes; geobasemap(gx, 'grayland'); hold on;
% Correct geoshow syntax for geographic axes geoshow(imgData, spatialref, 'DisplayType', 'texturemap'); % OR the simpler form: h = geoshow(latlim, lonlim, imgData);
% Apply transparency if ~isempty(alphaData) set(h, 'AlphaData', alphaData); end
Why the original failed: According to the documentation, when using geoshow with GeographicAxes (created by geobasemap), the 'Parent' parameter syntax shown in that forum post is not supported. The documentation states: " geoshow is not recommended when used with geographic axes (created by geoaxes or geobasemap). Use geolimits instead to set limits."
Solution 2: WITHOUT Mapping Toolbox (Fallback)
This is what I implemented - works with base MATLAB only:
close all;clear all;clc
% Read the image
[imgData, ~, alphaData] = imread('/MATLAB Drive/IMG_6894.PNG');
% Define the geographic bounds for the image latlim = [40, 50]; lonlim = [0, 10];
% Create figure
figure('Color', 'w');
ax = axes;
% Display the image with geographic coordinates imagesc(lonlim, latlim, imgData); set(ax, 'YDir', 'normal'); % Correct the y-axis direction axis equal tight;
% Set labels
xlabel('Longitude');
ylabel('Latitude');
title('Basketball Overlay');
% Apply transparency if alphaData exists if ~isempty(alphaData) alpha(alphaData); end
% Add gridlines for reference grid on;
Output:


Since you have the Mapping Toolbox, use Solution 1 for the proper geobasemap overlay!
Let me know how it goes.
13 commentaires
Hi @ Dyuman Joshi, Thanks for pointing this out. So, how can we help @Sim to fix this problem. Any suggestions, please let us know.
Hi @Sim,
After searching mathworks documentations extensively again and reading comments to search workaround on https://www.mathworks.com/matlabcentral/answers/487959-overlay-polygon-on-geographic-axes, spatialref was not defined anywhere in my code. That’s why MATLAB complains; it doesn’t magically exist. I found out that the correct way to overlay an image on a geographic basemap with geoaxes + geobasemap is to create a spatial reference object that tells MATLAB how to map the image pixels to geographic coordinates. According to the MathWorks documentation for `geoshow` when you want to display a raster image on a map you must supply a referencing object (R) that defines how the image relates to latitude/longitude:
geoshow(I,R) … project and display an image georeferenced to latitude‑longitude through the referencing object R. The image is shown as a texture map…” — MathWorks “geoshow” reference
To construct that referencing object, you use georefcells which is described in the documentation as:
georefcells(latlim,lonlim,rasterSize) constructs a referencing object for a raster of cells spanning the specified limits in latitude and longitude…” MathWorks “georefcells” reference
So the fix is to replace the undefined spatialref variable with a real spatial reference object created with georefcells, and then call geoshow with that.
Here’s the corrected code:
% read the PNG and its alpha (transparency)
[imgData, ~, alphaData] = imread('/MATLAB Drive/IMG_6894.PNG');
% define the geographic bounds latlim = [40, 50]; lonlim = [0, 10];
% create the spatial reference for the image R = georefcells(latlim, lonlim, size(imgData));
figure; gx = geoaxes; % geographic axes geobasemap(gx,'grayland'); % set the basemap hold on;
% overlay the image correctly using the spatial reference h = geoshow(gx, imgData, R, 'DisplayType','texturemap');
% apply transparency if the image has an alpha channel if ~isempty(alphaData) set(h, 'AlphaData', alphaData); end
Since I don’t have access to toolbox, hope this should fix the error and correctly display the image on top of the geobasemap. Here are the references that I used to gather information to help you out.
References:
[1]: https://www.mathworks.com/help/map/ref/geoshow.html “geoshow - Display map latitude and longitude data" [2]: https://www.mathworks.com/help/map/ref/georefcells.html , “georefcells - Reference raster cells to geographic ..."
@Sim and @Dyuman Joshi,
After reviewing the error messages and documentation, I now understand the root cause of all the failures.so, why all previous attempts failed:
The error message is explicit:
Expected input number 1, AX, to be one of these types: matlab.graphics.axis.Axes Instead its type was matlab.graphics.axis.GeographicAxes.
This reveals a fundamental incompatibility: geoshow cannot accept GeographicAxes objects (created by geobasemap/geoaxes), even though GeographicAxes is technically a subclass of Axes. The function explicitly validates and rejects this type.MATLAB has two separate mapping systems:
- Old system: worldmap/axesm creates matlab.graphics.axis.Axes which works with geoshow
- New system: geobasemap/geoaxes creates matlab.graphics.axis.GeographicAxes does not work with geoshow
Since you're using geobasemap, every attempt to use geoshow will fail with this exact error, regardless of how the spatial reference is created. After digging through mathworks documentation, I came across addCustomBasemap, so after going through documentation, addCustomBasemap to create a custom basemap from your image, then display it with geobasemap, hope this should work,
[imgData, ~, alphaData] = imread('Basketball.png');
latlim = [40, 50];
lonlim = [0, 10];
% Create spatial reference for the image R = georefcells(latlim, lonlim, size(imgData));
% Add image as a custom basemap
addCustomBasemap('basketball', imgData, R);
% Display using geobasemap
figure;
geobasemap('basketball');
Reference:
https://www.mathworks.com/help/map/ref/addcustombasemap.html#mw_d2d491dc-ba64-486c-b4b4-6128211d3037
@Dyuman Joshi - need your cooperation, could you please test this approach to confirm it works? Also, I would like your help with possible solutions or work around to help out @Sim.
Hi @Sim,
Great news! I've had @Walter Roberson test the dual-axes overlay code I provided, and as you can see from the screenshot above, it works successfully!
The basketball image is now properly overlaid on top of the grayland basemap - you can clearly see the European country borders and terrain underneath the basketball, which is exactly what you originally wanted to achieve.
So now you have two fully working solutions to choose from:
Option 1: addCustomBasemap (Simple & Recommended)
- Basketball replaces the basemap entirely
- Very reliable, no synchronization issues
- Best for most use cases where you just need the image displayed with proper geographic coordinates
Option 2: Dual-Axes Overlay (Complex but True Overlay)
- Basketball overlaid on top of grayland basemap (both visible simultaneously)
- Requires listeners to synchronize panning/zooming
- More complex implementation with potential alignment quirks
- Best if you specifically need to see the terrain AND your image together
My recommendation: If you're satisfied with just having your basketball image displayed with correct coordinates, stick with addCustomBasemap. If you absolutely need to see both the grayland terrain and the basketball simultaneously (like in the screenshot above), then the dual-axes approach is your solution.
Thanks again to @Walter Roberson for executing the code and providing the visual confirmation!
Catégories
En savoir plus sur Create Plots on Maps dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






