{"id":804,"date":"2023-04-05T16:46:12","date_gmt":"2023-04-05T16:46:12","guid":{"rendered":"https:\/\/www.gislxz.com\/?p=804"},"modified":"2023-04-05T16:46:13","modified_gmt":"2023-04-05T16:46:13","slug":"gdal%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%883%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.gislxz.com\/index.php\/2023\/04\/05\/gdal%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%883%ef%bc%89\/","title":{"rendered":"GDAL\u5b66\u4e60\u7b14\u8bb0\uff083\uff09"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u8bfb\u53d6\u6805\u683c\u56fe\u50cf<\/h2>\n\n\n\n<p>\u65b0\u5efa\u6805\u683c\u56fe\u50cf\u8bfb\u53d6\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Raster_demo {\npublic:\n\t\/\/\u6253\u5f00\u56fe\u50cf\n\tstatic void open(const char*, GDALDatasetUniquePtr&amp;);\n\t\/\/\u6253\u5370\u56fe\u50cf\u4fe1\u606f\n\tstatic void printDatasetInfo(GDALDatasetUniquePtr&amp;);\n\t\/\/\u6293\u53d6\u6ce2\u6bb5\n\tstatic GDALRasterBand* fetchRasterband(GDALDatasetUniquePtr&amp; poDataset);\n\t\/\/\u8bfb\u53d6\u56fe\u50cf\n\tstatic void readRasterband(GDALRasterBand*);\n};<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6253\u5f00\u56fe\u50cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>void Raster_demo::open(const char* pszFilename, GDALDatasetUniquePtr&amp; poDataset) {\n\tGDALAllRegister();\n\tconst GDALAccess eAccess = GA_ReadOnly;\n\tpoDataset = GDALDatasetUniquePtr(GDALDataset::FromHandle(GDALOpen(pszFilename, eAccess)));\n\tif (!poDataset)\n\t{\n\t\tcout &lt;&lt; \"open file failed\" &lt;&lt; endl;\n\t\treturn;\n\t}\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u83b7\u53d6\u6805\u683c\u57fa\u7840\u4fe1\u606f<\/h3>\n\n\n\n<p>\u57fa\u7840\u4fe1\u606f\u4e2d\u7684\u4eff\u5c04\u5730\u7406\u5750\u6807\u53d8\u6362\u53c2\u6570\u5f88\u91cd\u8981<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/www.gislxz.com\/wp-content\/uploads\/2023\/04\/image-1024x558.png\" alt=\"\" class=\"wp-image-807\" srcset=\"https:\/\/www.gislxz.com\/wp-content\/uploads\/2023\/04\/image-1024x558.png 1024w, https:\/\/www.gislxz.com\/wp-content\/uploads\/2023\/04\/image-300x163.png 300w, https:\/\/www.gislxz.com\/wp-content\/uploads\/2023\/04\/image-768x418.png 768w, https:\/\/www.gislxz.com\/wp-content\/uploads\/2023\/04\/image.png 1159w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>void Raster_demo::printDatasetInfo(GDALDatasetUniquePtr&amp; poDataset) {\n\tdouble        adfGeoTransform&#91;6];\n\tprintf(\"Driver: %s\/%s\\n\",\n\t\tpoDataset-&gt;GetDriver()-&gt;GetDescription(),\n\t\tpoDataset-&gt;GetDriver()-&gt;GetMetadataItem(GDAL_DMD_LONGNAME));\n\tprintf(\"Size is %dx%dx%d\\n\",\n\t\tpoDataset-&gt;GetRasterXSize(), poDataset-&gt;GetRasterYSize(),\n\t\tpoDataset-&gt;GetRasterCount());\n\tif (poDataset-&gt;GetProjectionRef() != NULL)\n\t\tprintf(\"Projection is `%s'\\n\", poDataset-&gt;GetProjectionRef());\n\tif (poDataset-&gt;GetGeoTransform(adfGeoTransform) == CE_None)\n\t{\n\t\tprintf(\"Origin = (%.6f,%.6f)\\n\",\n\t\t\tadfGeoTransform&#91;0], adfGeoTransform&#91;3]);\n\t\tprintf(\"Pixel Size = (%.6f,%.6f)\\n\",\n\t\t\tadfGeoTransform&#91;1], adfGeoTransform&#91;5]);\n\t}\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u83b7\u53d6\u6ce2\u6bb5<\/h3>\n\n\n\n<p>\u83b7\u53d6\u67d0\u4e00\u6ce2\u6bb5\u4ee5\u53ca\u76f8\u5173\u7684\u4fe1\u606f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GDALRasterBand* Raster_demo::fetchRasterband(GDALDatasetUniquePtr&amp; poDataset) {\n\tGDALRasterBand* poBand;\n\tint nBlockXSize, nBlockYSize;\n\tint bGotMin, bGotMax;\n\tdouble adfMinMax&#91;2];\n\tcout &lt;&lt; \"Raster Band Count = \" &lt;&lt; poDataset-&gt;GetRasterCount() &lt;&lt; endl;\n\tpoBand = poDataset-&gt;GetRasterBand(1);\n\tpoBand-&gt;GetBlockSize(&amp;nBlockXSize, &amp;nBlockYSize);\n\tprintf(\"Block=%dx%d Type=%s, ColorInterp=%s\\n\",\n\t\tnBlockXSize, nBlockYSize,\n\t\tGDALGetDataTypeName(poBand-&gt;GetRasterDataType()),\n\t\tGDALGetColorInterpretationName(\n\t\t\tpoBand-&gt;GetColorInterpretation()));\n\tadfMinMax&#91;0] = poBand-&gt;GetMinimum(&amp;bGotMin);\n\tadfMinMax&#91;1] = poBand-&gt;GetMaximum(&amp;bGotMax);\n\tif (!(bGotMin &amp;&amp; bGotMax))\n\t\tGDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);\n\tprintf(\"Min=%.3fd, Max=%.3f\\n\", adfMinMax&#91;0], adfMinMax&#91;1]);\n\tif (poBand-&gt;GetOverviewCount() &gt; 0)\n\t\tprintf(\"Band has %d overviews.\\n\", poBand-&gt;GetOverviewCount());\n\tif (poBand-&gt;GetColorTable() != NULL)\n\t\tprintf(\"Band has a color table with %d entries.\\n\",\n\t\t\tpoBand-&gt;GetColorTable()-&gt;GetColorEntryCount());\n\treturn poBand;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bfb\u53d6\u56fe\u50cf<\/h3>\n\n\n\n<p>\u4e00\u6b21\u6309\u4e00\u4e2a\u6ce2\u6bb5\u8fdb\u884c\u8bfb\u53d6\uff0c\u8bfb\u53d6\u524d\u9700\u5148\u6839\u636e\u6805\u683c\u6570\u636e\u7c7b\u578b\u548c\u4e00\u6b21\u8bfb\u53d6\u5927\u5c0f\u5f00\u8f9f\u5185\u5b58<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gislxz.com\/wp-content\/uploads\/2023\/04\/image-1.png\" alt=\"\" class=\"wp-image-808\" width=\"300\" height=\"400\"\/><\/figure><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>void Raster_demo::readRasterband(GDALRasterBand* poBand) {\n\tfloat* pafScanline;\n\tint   nXSize = poBand-&gt;GetXSize();\n\tpafScanline = (float*)CPLMalloc(sizeof(float) * nXSize);\n\tpoBand-&gt;RasterIO(GF_Read, 0, 0, nXSize, 1,\n\t\tpafScanline, nXSize, 1, GDT_Float32,\n\t\t0, 0);\n\n\t\/\/\u9700\u8981\u91ca\u653e\n\tCPLFree(pafScanline);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u91ca\u653e\u8d44\u6e90<\/h3>\n\n\n\n<p>GDALRasterBand\u4e0d\u80fd\u4f7f\u7528delete\u5220\u9664\uff0c\u4f1a\u5728GDALDataset\u91ca\u653e\u65f6\u4e00\u5e76\u91ca\u653e\u3002\u4f7f\u7528GDALClose\u51fd\u6570\u91ca\u653eGDALDataset\uff0cGDALDatasetUniquePtr\u7684\u5220\u9664\u51fd\u6570\u5c31\u662f\u8c03\u7528\u7684GDALClose\uff0c\u56e0\u6b64\u53ef\u4ee5\u4e0d\u7ba1\u6216\u8005\u7528reset\u91ca\u653e\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efa\u6805\u683c\u56fe\u50cf<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u68c0\u67e5\u76f8\u5e94\u6570\u636e\u683c\u5f0f\u9a71\u52a8\u662f\u5426\u53ef\u7528<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"cpl_string.h\"\n...\n    const char *pszFormat = \"GTiff\";\n    GDALDriver *poDriver;\n    char **papszMetadata;\n    poDriver = GetGDALDriverManager()-&gt;GetDriverByName(pszFormat);\n    if( poDriver == NULL )\n        exit( 1 );\n    papszMetadata = poDriver-&gt;GetMetadata();\n    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) )\n        printf( \"Driver %s supports Create() method.\\n\", pszFormat );\n    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )\n        printf( \"Driver %s supports CreateCopy() method.\\n\", pszFormat );<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f7f\u7528CreateCopy\u521b\u5efa<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>GDALDataset *poSrcDS =\n(GDALDataset *) GDALOpen( pszSrcFilename, GA_ReadOnly );\nGDALDataset *poDstDS;\npoDstDS = poDriver-&gt;CreateCopy( pszDstFilename, poSrcDS, FALSE,\n                                NULL, NULL, NULL );\n\/* Once we're done, close properly the dataset *\/\nif( poDstDS != NULL )\n    GDALClose( (GDALDatasetH) poDstDS );\nGDALClose( (GDALDatasetH) poSrcDS );<\/code><\/pre>\n\n\n\n<p>\u589e\u52a0\u4e00\u4e9b\u53c2\u6570\u8bbe\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"cpl_string.h\"\n...\nchar **papszOptions = NULL;\npapszOptions = CSLSetNameValue( papszOptions, \"TILED\", \"YES\" );\npapszOptions = CSLSetNameValue( papszOptions, \"COMPRESS\", \"PACKBITS\" );\npoDstDS = poDriver-&gt;CreateCopy( pszDstFilename, poSrcDS, FALSE,\n                                papszOptions, GDALTermProgress, NULL );\n\/* Once we're done, close properly the dataset *\/\nif( poDstDS != NULL )\n    GDALClose( (GDALDatasetH) poDstDS );\nCSLDestroy( papszOptions );<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f7f\u7528Create\u521b\u5efa<\/h3>\n\n\n\n<p>\u4f7f\u7528create\u521b\u5efa\u6805\u683c\u6587\u4ef6\uff08\u56fe\u50cf\u5c3a\u5bf8\uff0c\u6ce2\u6bb5\u6570\uff0c\u6570\u636e\u7c7b\u578b\u5fc5\u987b\u7ed9\u51fa\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GDALDataset *poDstDS;\nchar **papszOptions = NULL;\npoDstDS = poDriver-&gt;Create( pszDstFilename, 512, 512, 1, GDT_Byte,\n                            papszOptions );<\/code><\/pre>\n\n\n\n<p>dataset\u521b\u5efa\u540e\uff0c\u6240\u6709\u9002\u5f53\u7684\u5143\u6570\u636e\u548c\u6805\u683c\u6570\u636e\u5fc5\u987b\u5199\u5165\u6587\u4ef6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>double adfGeoTransform&#91;6] = { 444720, 30, 0, 3751320, 0, -30 };\nOGRSpatialReference oSRS;\nchar *pszSRS_WKT = NULL;\nGDALRasterBand *poBand;\nGByte abyRaster&#91;512*512];\npoDstDS-&gt;SetGeoTransform( adfGeoTransform );\noSRS.SetUTM( 11, TRUE );\noSRS.SetWellKnownGeogCS( \"NAD27\" );\noSRS.exportToWkt( &amp;pszSRS_WKT );\npoDstDS-&gt;SetProjection( pszSRS_WKT );\nCPLFree( pszSRS_WKT );\npoBand = poDstDS-&gt;GetRasterBand(1);\npoBand-&gt;RasterIO( GF_Write, 0, 0, 512, 512,\n                abyRaster, 512, 512, GDT_Byte, 0, 0 );\n\/* Once we're done, close properly the dataset *\/\nGDALClose( (GDALDatasetH) poDstDS );<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">GDALWarp<\/h2>\n\n\n\n<p><a href=\"https:\/\/gdal.org\/api\/gdalwarp_cpp.html#gdalwarp-cpp\" target=\"_blank\"  rel=\"nofollow\" >Warper C++ API \u2014 GDAL documentation<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5173\u4e8e\u6805\u683c\u6570\u636e\u64cd\u4f5c<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[],"class_list":["post-804","post","type-post","status-publish","format-standard","hentry","category-gis"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts\/804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/comments?post=804"}],"version-history":[{"count":3,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts\/804\/revisions"}],"predecessor-version":[{"id":810,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/posts\/804\/revisions\/810"}],"wp:attachment":[{"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/media?parent=804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/categories?post=804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gislxz.com\/index.php\/wp-json\/wp\/v2\/tags?post=804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}