Return formatted GDAL raster from raster.
1596 {
1597 const char *cc;
1598 const char *vio;
1599
1600 GDALDriverH src_drv = NULL;
1601 int destroy_src_drv = 0;
1602 GDALDatasetH
src_ds = NULL;
1603
1604 vsi_l_offset rtn_lenvsi;
1605 uint64_t rtn_len = 0;
1606
1607 GDALDriverH rtn_drv = NULL;
1608 GDALDatasetH rtn_ds = NULL;
1609 uint8_t *rtn = NULL;
1610
1611 assert(NULL != raster);
1612 assert(NULL != gdalsize);
1613
1614
1617
1618
1619 if (format == NULL || !strlen(format))
1620 format = "GTiff";
1622
1623
1625 if (NULL == src_ds) {
1626 rterror(
"rt_raster_to_gdal: Could not convert raster to GDAL MEM format");
1627 return 0;
1628 }
1629
1630
1631 rtn_drv = GDALGetDriverByName(format);
1632 if (NULL == rtn_drv) {
1633 rterror(
"rt_raster_to_gdal: Could not load the output GDAL driver");
1634 GDALClose(src_ds);
1635 if (destroy_src_drv) GDALDestroyDriver(src_drv);
1636 return 0;
1637 }
1639
1640
1641 cc = GDALGetMetadataItem(rtn_drv, GDAL_DCAP_CREATECOPY, NULL);
1642
1643 vio = GDALGetMetadataItem(rtn_drv, GDAL_DCAP_VIRTUALIO, NULL);
1644
1645 if (cc == NULL || vio == NULL) {
1646 rterror(
"rt_raster_to_gdal: Output GDAL driver does not support CreateCopy and/or VirtualIO");
1647 GDALClose(src_ds);
1648 if (destroy_src_drv) GDALDestroyDriver(src_drv);
1649 return 0;
1650 }
1651
1652
1653 RASTER_DEBUG(3,
"Copying GDAL MEM raster to memory file in output format");
1654 rtn_ds = GDALCreateCopy(
1655 rtn_drv,
1656 "/vsimem/out.dat",
1657 src_ds,
1659 options,
1660 NULL,
1661 NULL
1662 );
1663
1664
1665 GDALClose(src_ds);
1666 if (destroy_src_drv) GDALDestroyDriver(src_drv);
1668
1669 if (NULL == rtn_ds) {
1670 rterror(
"rt_raster_to_gdal: Could not create the output GDAL dataset");
1671 return 0;
1672 }
1673
1674 RASTER_DEBUGF(4,
"dataset SRS: %s", GDALGetProjectionRef(rtn_ds));
1675
1676
1677 GDALClose(rtn_ds);
1679
1680 RASTER_DEBUG(3,
"Done copying GDAL MEM raster to memory file in output format");
1681
1682
1684 rtn = VSIGetMemFileBuffer(
"/vsimem/out.dat", &rtn_lenvsi,
TRUE);
1685 RASTER_DEBUG(3,
"Done copying GDAL memory file to buffer");
1686 if (NULL == rtn) {
1687 rterror(
"rt_raster_to_gdal: Could not create the output GDAL raster");
1688 return 0;
1689 }
1690
1691 rtn_len = (uint64_t) rtn_lenvsi;
1692 *gdalsize = rtn_len;
1693
1694 return rtn;
1695}
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
#define RASTER_DEBUG(level, msg)
int rt_util_gdal_register_all(int force_register_all)
#define RASTER_DEBUGF(level, msg,...)
GDALDatasetH rt_raster_to_gdal_mem(rt_raster raster, const char *srs, uint32_t *bandNums, int *excludeNodataValues, int count, GDALDriverH *rtn_drv, int *destroy_rtn_drv)
Return GDAL dataset using GDAL MEM driver from raster.