Image Access#

In this notebook, we show how to search for and retrieve images from VO services using the Registry and the Simple Image Access (SIA) protocol.

*Note: for all of these notebooks, the results depend on real-time queries. Sometimes there are problems, either because a given service has changed, is undergoing maintenance, or the internet connectivity is having problems, etc. Always retry a couple of times, come back later and try again, and only then send us the problem report to investigate.

import warnings

import numpy as np

import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

import pyvo as vo

from astropy.io import fits
import astropy.coordinates as coord
# For downloading files
from astropy.utils.data import download_file

from IPython.display import Image as ipImage, display

# There are a number of relatively unimportant warnings that show up, so for now, suppress them:
warnings.filterwarnings("ignore", module="astropy.io.votable.*")
warnings.filterwarnings("ignore", module="pyvo.utils.xml.*")

1. Finding SIA resources from the Registry#

First, how do we find out what services are available? These are listed in a registry at STScI (see here). Our Registry function gives a simple interface for how to search for services.

Let’s search for services providing images in the ultraviolet bands:

uv_services = vo.regsearch(servicetype='sia',waveband='uv')
uv_services.to_table()['ivoid','short_name','res_title']
Table length=18
ivoidshort_nameres_title
objectobjectobject
ivo://archive.stsci.edu/sia/galexGALEXGalaxy Evolution Explorer (GALEX)
ivo://archive.stsci.edu/siap/hlaHLAHubble Legacy Archive
ivo://irsa.ipac/mast/scrapbookMAST-ScrapbookThe MAST Image Scrapbook
ivo://mast.stsci/acsggctHST.ACSGGCTACS Galactic Globular Cluster Survey (ACSGGCT)
ivo://mast.stsci/angrrrHST.ANGRRRArchive of Nearby Galaxies: Reduce, Reuse, Recycle (ANGRRR)
ivo://mast.stsci/candelsCANDELSCosmic Assembly Near-IR Deep Extragalactic Legacy Survey (CANDELS)
ivo://mast.stsci/clashHST.CLASHCluster Lensing And Supernova survey with Hubble (CLASH)
ivo://mast.stsci/hippiesHST.HIPPIESHubble Infrared Pure Parallel Imaging Extragalactic Survey (HIPPIES)
ivo://mast.stsci/phatPHATPanchromatic Hubble Andromeda Treasury (PHAT)
ivo://mast.stsci/siap/galex_atlasGALEX_AtlasGALEX Atlas of Nearby Galaxies
ivo://mast.stsci/siap/hst.maoz_atlasHST.maoz_atlasHST Ultraviolet Atlas of Nearby Galaxies
ivo://mast.stsci/siap/udfuvHST.udfuvHubble Space Telescope Ultraviolet Images of the UDF and HDF
ivo://mast.stsci/siap/uitUITUltraviolet Imaging Telescope (UIT)
ivo://nasa.heasarc/skyview/euveEUVEExtreme Ultraviolet Explorer: 83 A
ivo://nasa.heasarc/skyview/galexGALEXGalaxy Explorer All Sky Survey: Near UV
ivo://nasa.heasarc/skyview/skyviewSkyViewSkyView Virtual Observatory
ivo://nasa.heasarc/skyview/swiftuvotSWIFTUVOTSwift UVOT Combined V Intensity Images
ivo://nasa.heasarc/skyview/wfcfWFCFROSAT Wide Field Camera: F1

This returns an astropy table containing information about the services available. We can then specify the service we want by using the corresponding row. We’ll repeat the search with additional qualifiers to isolate the row we want (note that in the keyword search the “%” character can be used as a wild card):

uvot_services = vo.regsearch(servicetype='sia',waveband='uv',keywords=['swift'])
uvot_services.to_table()['ivoid','short_name','res_title']
Table length=1
ivoidshort_nameres_title
objectobjectobject
ivo://nasa.heasarc/skyview/swiftuvotSWIFTUVOTSwift UVOT Combined V Intensity Images

This shows us that the data we are interested in comes from the HEASARC’s SkyView service, but the point of these VO tools is that you don’t need to know that ahead of time or indeed to care where it comes from.

2. Using SIA to retrieve an image#

Now we look for images of our favorite source. See the SIA definition for usage. In short, you can specify the central position and the size (degrees as one or two floats for the RA, DEC directions). It is up to the service to determine how to provide this. Optionally, you can limit it to the format you want, e.g., “image/fits” or “image/png” etc.

What is returned to you is not the image itself but a list of images available and how to access them. This is easiest shown by example:

coords = coord.SkyCoord.from_name("m51")

im_table = uvot_services[0].search(pos=coords,size=0.2,format='image/jpeg')
im_table.to_table()
Table length=6
SurveyRaDecDimSizeScaleFormatPixFlagsURLLogicalName
objectfloat64float64int32objectobjectobjectobjectobjectobject
swiftuvotvint202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/jpegFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotvint&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925032792&nofits=1&quicklook=jpeg&return=jpeg1
swiftuvotbint202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/jpegFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotbint&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925033094&nofits=1&quicklook=jpeg&return=jpeg2
swiftuvotuint202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/jpegFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotuint&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925034224&nofits=1&quicklook=jpeg&return=jpeg3
swiftuvotuvw1int202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/jpegFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotuvw1int&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925034739&nofits=1&quicklook=jpeg&return=jpeg4
swiftuvotuvw2int202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/jpegFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotuvw2int&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925035263&nofits=1&quicklook=jpeg&return=jpeg5
swiftuvotuvm2int202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/jpegFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotuvm2int&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925035812&nofits=1&quicklook=jpeg&return=jpeg6

Extract the fields you’re interested in, e.g., the URLs of the images made by skyview. Note that specifying as we did SwiftUVOT, we get a number of different images, e.g., UVOT U, V, B, W1, W2, etc. For each survey, there are two URLs, first the FITS IMAGE and second the JPEG.

Note that different services will return different column names, but all will have a column giving the URL to access the image. Though it has different column names in different services, it can always be accessed through the getdataurl function.

url = im_table[0].getdataurl()
print(url)
https://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=swiftuvotvint&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925032792&nofits=1&quicklook=jpeg&return=jpeg

3. Viewing the resulting image#

JPG images#

Since we have asked for JPEG images, we can display an image in python easily by using its URL. Each row of the result has a getdataurl() method, and you can then hand the URL to an image displayer such as IPython.display:

img = ipImage(url=im_table[0].getdataurl())
display(img)

Fits files#

Or download the FITS image and display it with imshow, or aplpy.

(This often errors off with a time out message. Just try it again, possibly a couple of times.)

#  Do the search again asking for FITS
im_table = uvot_services[0].search(pos=coords,size=0.2,format='image/fits')

#  Hand the url of the first result to fits.open()
hdu_list = fits.open(im_table[0].getdataurl())
hdu_list.info()
Filename: /home/runner/.astropy/cache/download/url/41856ae32f4e530158f97f295cfa3288/contents
No.    Name      Ver    Type      Cards   Dimensions   Format
  0  PRIMARY       1 PrimaryHDU     111   (300, 300)   float32   

Using imshow#

plt.imshow(hdu_list[0].data, cmap='gray', origin='lower',vmax=0.1)
<matplotlib.image.AxesImage at 0x7fc7758e0c10>
../../_images/7e9ed5bf8ff5bcfd4f9f516502122341030f2e901f910c989dfd4dd6b75f090f.png

4. Example of data available through multiple services#

Suppose we want Sloan DSS data. A generic query finds us a number of possibilities (note that this doesn’t work for keywords=[‘sdss’]; be flexible and try several search terms):

services = vo.regsearch(servicetype='sia', keywords=['sloan'], waveband='optical')
services.to_table()[np.where(np.isin(services.to_table()['short_name'], 'SDSSDR7'))]['ivoid', 'short_name']
Table length=2
ivoidshort_name
objectobject
ivo://nasa.heasarc/skyview/sdssdr7SDSSDR7
ivo://sdss.jhu/services/siapdr7-imagesSDSSDR7

So one of these is served by SDSS’s SkyServer and the other by HEASARC’s SkyView.

Using HEASARC#

heasarc_dr7_service = [s for s in services if 'SDSSDR7' in s.short_name and 'heasarc' in s.ivoid][0]

sdss_table_heasarc = heasarc_dr7_service.search(pos=coords,size=0.2,format='image/fits')
sdss_table_heasarc.to_table()
Table length=5
SurveyRaDecDimSizeScaleFormatPixFlagsURLLogicalName
objectfloat64float64int32objectobjectobjectobjectobjectobject
sdssdr7g202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/fitsFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=sdssdr7g&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925043355&return=FITS1
sdssdr7i202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/fitsFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=sdssdr7i&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925043815&return=FITS2
sdssdr7u202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/fitsFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=sdssdr7u&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925044370&return=FITS3
sdssdr7r202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/fitsFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=sdssdr7r&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925044873&return=FITS4
sdssdr7z202.46957547.195258332[300 300][-0.0006666666666666668 0.0006666666666666668]image/fitsFhttps://skyview.gsfc.nasa.gov/cgi-bin/images?position=202.469575%2C47.19525833&survey=sdssdr7z&pixels=300%2C300&sampler=LI&size=0.20000000000000004%2C0.20000000000000004&projection=Tan&coordinates=J2000.0&requestID=skv1730925045415&return=FITS5
## If you only run this once, you can do it in memory in one line:
##  This fetches the FITS as an astropy.io.fits object in memory
# hdu_list = sdss_table_heasarc[0].getdataobj()
## But if you might run this notebook repeatedly with limited bandwidth,
##  download it once and cache it.

#  Get the filter g version
file_name=download_file(sdss_table_heasarc[0].getdataurl(), cache=True, timeout=600)
hdu_list = fits.open(file_name)

plt.imshow(hdu_list[0].data, cmap='gray', origin='lower', vmax=1200, vmin=1010)
<matplotlib.image.AxesImage at 0x7fc7759c7e20>
../../_images/a9e1e73a130878b113739a02a6d6057811ab1854e9e5e1655a44bddacef642ab.png

Using SDSS SkyServer#

jhu_dr7_service = [s for s in services if 'SDSSDR7' in s.short_name and 'jhu' in s.ivoid][0]

# Note: jhu_dr7_service access url has hard-wired "format=image/fits".
# If you specify anythign else, it errors. If you specify nothing,
# then the search() method puts "format=all", which errors. So specify "format=None" for now.
sdss_table_jhu=jhu_dr7_service.search(pos=coords,size=0.2, format=None)
sdss_table_jhu.to_table().show_in_notebook(display_length = 5)
WARNING: AstropyDeprecationWarning: show_in_notebook() is deprecated as of 6.1 and to create
         interactive tables it is recommended to use dedicated tools like:
         - https://github.com/bloomberg/ipydatagrid
         - https://docs.bokeh.org/en/latest/docs/user_guide/interaction/widgets.html#datatable
         - https://dash.plotly.com/datatable [warnings]
Table length=30
idxTitlewidthheightsizeRADECscaleformaturlequinoxnaxesnaxiscrtypecrpixcrvalcdval
0Sloan Digital Sky Survey - Filter u204814893049472.0202.43971584011547.1222952774076[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-u6-0100.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.439715840115 47.1222952774076][3.57829352076884e-05 0.000157654334590212 0.000107291403325821\n -2.42761847386219e-05]
1Sloan Digital Sky Survey - Filter g204814893049472.0202.43876345123347.1224982411069[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-g6-0100.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.438763451233 47.1224982411069][3.57455198349534e-05 0.000157658871914506 0.000107248674325512\n -2.4298297148212e-05]
2Sloan Digital Sky Survey - Filter r204814893049472.0202.44076055152447.1223224530134[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-r6-0100.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.440760551524 47.1223224530134][3.57284422970295e-05 0.000157658504949188 0.000107285884319316\n -2.43020165047957e-05]
3Sloan Digital Sky Survey - Filter i204814893049472.0202.44028082851447.1221470640024[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-i6-0100.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.440280828514 47.1221470640024][3.57634273620044e-05 0.00015761708892598 0.000107330126376146\n -2.43196618936367e-05]
4Sloan Digital Sky Survey - Filter z204814893049472.0202.43952907982247.1222577816612[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-z6-0100.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.439529079822 47.1222577816612][3.57150015372814e-05 0.000157643765195985 0.000107288170305585\n -2.43520424844304e-05]
5Sloan Digital Sky Survey - Filter u204814893049472.0202.47105145565147.3353076054504[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-u6-0117.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.471051455651 47.3353076054504][3.59720233632108e-05 0.000158234026889022 0.000107269639460545\n -2.43685414700374e-05]
6Sloan Digital Sky Survey - Filter g204814893049472.0202.47006316721947.3355466663192[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-g6-0117.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.470063167219 47.3355466663192][3.59432847686782e-05 0.000158250992709564 0.000107232188959642\n -2.43648103577398e-05]
7Sloan Digital Sky Survey - Filter r204814893049472.0202.47213554607647.3353955051599[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-r6-0117.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.472135546076 47.3353955051599][3.59415181020478e-05 0.000158248434019201 0.000107267969211639\n -2.43568204128413e-05]
8Sloan Digital Sky Survey - Filter i204814893049472.0202.47159157033847.3352202087437[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-i6-0117.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.471591570338 47.3352202087437][3.59688512209066e-05 0.000158230937820391 0.000107320614280034\n -2.43668898148645e-05]
9Sloan Digital Sky Survey - Filter z204814893049472.0202.47084758881947.3353207915745[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-z6-0117.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.470847588819 47.3353207915745][3.59150654057983e-05 0.00015824237549979 0.000107275145174036\n -2.43601106879619e-05]
10Sloan Digital Sky Survey - Filter u204814893049472.0202.22503692857947.1551517933957[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-u6-0099.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.225036928579 47.1551517933957][3.53810815495366e-05 0.000157828787897035 0.00010735924586165\n -2.39982457876422e-05]
11Sloan Digital Sky Survey - Filter g204814893049472.0202.22409162732447.1553436740585[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-g6-0099.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.224091627324 47.1553436740585][3.53548077171863e-05 0.000157797128208248 0.000107310265876208\n -2.39869405117144e-05]
12Sloan Digital Sky Survey - Filter r204814893049472.0202.22605649291747.1551938665937[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-r6-0099.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.226056492917 47.1551938665937][3.53239854402387e-05 0.000157838092689428 0.000107350303498701\n -2.40134094050143e-05]
13Sloan Digital Sky Survey - Filter i204814893049472.0202.22560504105547.1550455961572[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-i6-0099.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.225605041055 47.1550455961572][3.53618397919858e-05 0.000157831872925887 0.000107392266900315\n -2.40224681475619e-05]
14Sloan Digital Sky Survey - Filter z204814893049472.0202.22485710594947.1551902252221[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-z6-0099.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.224857105949 47.1551902252221][3.53164061106176e-05 0.000157807630023464 0.000107345229703656\n -2.40355209382835e-05]
15Sloan Digital Sky Survey - Filter u204814893049472.0202.6541481563447.0890093294703[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-u6-0101.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.65414815634 47.0890093294703][3.6186786701617e-05 0.000157450314868615 0.000107233464444483\n -2.4630072177771e-05]
16Sloan Digital Sky Survey - Filter g204814893049472.0202.65319601781947.0891999862019[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-g6-0101.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.653196017819 47.0891999862019][3.61524039632195e-05 0.000157442085661357 0.00010717248715869\n -2.46013858407994e-05]
17Sloan Digital Sky Survey - Filter r204814893049472.0202.65520586814547.0890572388805[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-r6-0101.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.655205868145 47.0890572388805][3.61316360915276e-05 0.000157451582422518 0.000107220359933737\n -2.45849902948879e-05]
18Sloan Digital Sky Survey - Filter i204814893049472.0202.65469159878347.0888727037152[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-i6-0101.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.654691598783 47.0888727037152][3.61725026693836e-05 0.000157408759294813 0.000107256525899337\n -2.45885571257842e-05]
19Sloan Digital Sky Survey - Filter z204814893049472.0202.65395139547647.0889879470879[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3699/41/corr/6/fpC-003699-z6-0101.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.653951395476 47.0889879470879][3.61392099375964e-05 0.000157416042366347 0.000107201860921915\n -2.45540162771507e-05]
20Sloan Digital Sky Survey - Filter u204814893049472.0202.25555147795747.3682645399901[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-u6-0116.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.255551477957 47.3682645399901][3.5570382561575e-05 0.000158445038179983 0.000107353085876542\n -2.4081056610898e-05]
21Sloan Digital Sky Survey - Filter g204814893049472.0202.25458346378247.3684765773708[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-g6-0116.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.254583463782 47.3684765773708][3.55429049574138e-05 0.000158441335601828 0.0001072954627723\n -2.40523585981171e-05]
22Sloan Digital Sky Survey - Filter r204814893049472.0202.25663429892947.3683388717643[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-r6-0116.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.256634298929 47.3683388717643][3.5535391375169e-05 0.000158453355528711 0.000107333345270551\n -2.40576281698322e-05]
23Sloan Digital Sky Survey - Filter i204814893049472.0202.25612670954847.3681700486555[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-i6-0116.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.256126709548 47.3681700486555][3.55644270086165e-05 0.000158412619072351 0.000107373910671822\n -2.40626631095901e-05]
24Sloan Digital Sky Survey - Filter z204814893049472.0202.25536825859347.368270602303[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-z6-0116.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.255368258593 47.368270602303][3.55222946951901e-05 0.000158417415117325 0.000107324985298729\n -2.40742017372421e-05]
25Sloan Digital Sky Survey - Filter u204814893049472.0202.68629541244447.3019488258879[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-u6-0118.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.686295412444 47.3019488258879][3.6396285814486e-05 0.000158057354515325 0.000107211108269374\n -2.46403918053622e-05]
26Sloan Digital Sky Survey - Filter g204814893049472.0202.68533257360647.3021963773602[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-g6-0118.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.685332573606 47.3021963773602][3.63470141127271e-05 0.000158088090573589 0.000107165416853572\n -2.46461762773735e-05]
27Sloan Digital Sky Survey - Filter r204814893049472.0202.68736927287247.3020488643411[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-r6-0118.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.687369272872 47.3020488643411][3.63474460456217e-05 0.000158040522693102 0.000107200822294116\n -2.46394662940732e-05]
28Sloan Digital Sky Survey - Filter i204814893049472.0202.68684290452347.3018572304656[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-i6-0118.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.686842904523 47.3018572304656][3.63775353745344e-05 0.000158080652297321 0.000107250752985642\n -2.46480089191703e-05]
29Sloan Digital Sky Survey - Filter z204814893049472.0202.68607353880947.3020049052475[0.000110035211267606]image/fitshttp://das.sdss.org/imaging/3716/42/corr/6/fpC-003716-z6-0118.fit.gz--2[2048 1489]RA--TAN,DEC--TAN[744.5 1024.5][202.686073538809 47.3020049052475][3.63234400825991e-05 0.000158059886386157 0.000107205662505221\n -2.46188155996404e-05]
#  Get the filter g version
file_name=download_file(sdss_table_jhu[1].getdataurl(), cache=True, timeout=600)
hdu_list = fits.open(file_name)

plt.imshow(hdu_list[0].data, cmap='gray', origin='lower',vmax=1200,vmin=1010)
<matplotlib.image.AxesImage at 0x7fc773631f00>
../../_images/229f41b24ef8ac6ad786f2d5611c0caa68a6db48154552e76a2430fcf8e0e69c.png

It turns out that SkyView is just getting images by using the SIAP internally to get the data from the SDSS service. The point of the VO protocols is that you don’t need to know where the data are coming from. But they can be processed differently.