Return formatted GDAL raster from raster.
1601 {
1602 const char *cc;
1603 const char *vio;
1604
1605 GDALDriverH src_drv = NULL;
1606 int destroy_src_drv = 0;
1607 GDALDatasetH
src_ds = NULL;
1608
1609 vsi_l_offset rtn_lenvsi;
1610 uint64_t rtn_len = 0;
1611
1612 GDALDriverH rtn_drv = NULL;
1613 GDALDatasetH rtn_ds = NULL;
1614 uint8_t *rtn = NULL;
1615
1616 assert(NULL != raster);
1617 assert(NULL != gdalsize);
1618
1619
1622
1623
1624 if (format == NULL || !strlen(format))
1625 format = "GTiff";
1627
1628
1630 if (NULL == src_ds) {
1631 rterror(
"rt_raster_to_gdal: Could not convert raster to GDAL MEM format");
1632 return 0;
1633 }
1634
1635
1636 rtn_drv = GDALGetDriverByName(format);
1637 if (NULL == rtn_drv) {
1638 rterror(
"rt_raster_to_gdal: Could not load the output GDAL driver");
1639 GDALClose(src_ds);
1640 if (destroy_src_drv) GDALDestroyDriver(src_drv);
1641 return 0;
1642 }
1644
1645
1646 cc = GDALGetMetadataItem(rtn_drv, GDAL_DCAP_CREATECOPY, NULL);
1647
1648 vio = GDALGetMetadataItem(rtn_drv, GDAL_DCAP_VIRTUALIO, NULL);
1649
1650 if (cc == NULL || vio == NULL) {
1651 rterror(
"rt_raster_to_gdal: Output GDAL driver does not support CreateCopy and/or VirtualIO");
1652 GDALClose(src_ds);
1653 if (destroy_src_drv) GDALDestroyDriver(src_drv);
1654 return 0;
1655 }
1656
1657
1658 RASTER_DEBUG(3,
"Copying GDAL MEM raster to memory file in output format");
1659 rtn_ds = GDALCreateCopy(
1660 rtn_drv,
1661 "/vsimem/out.dat",
1662 src_ds,
1664 options,
1665 NULL,
1666 NULL
1667 );
1668
1669
1670 GDALClose(src_ds);
1671 if (destroy_src_drv) GDALDestroyDriver(src_drv);
1673
1674 if (NULL == rtn_ds) {
1675 rterror(
"rt_raster_to_gdal: Could not create the output GDAL dataset");
1676 return 0;
1677 }
1678
1679 RASTER_DEBUGF(4,
"dataset SRS: %s", GDALGetProjectionRef(rtn_ds));
1680
1681
1682 GDALClose(rtn_ds);
1684
1685 RASTER_DEBUG(3,
"Done copying GDAL MEM raster to memory file in output format");
1686
1687
1689 rtn = VSIGetMemFileBuffer(
"/vsimem/out.dat", &rtn_lenvsi,
TRUE);
1690 RASTER_DEBUG(3,
"Done copying GDAL memory file to buffer");
1691 if (NULL == rtn) {
1692 rterror(
"rt_raster_to_gdal: Could not create the output GDAL raster");
1693 return 0;
1694 }
1695
1696 rtn_len = (uint64_t) rtn_lenvsi;
1697 *gdalsize = rtn_len;
1698
1699 return rtn;
1700}
void rterror(const char *fmt,...) __attribute__((format(printf
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.