<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Sample Driver: jdemdataset.cpp</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.3-20001105 on Thu Mar 28 09:47:33 2002 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><a name="jdemdataset.cpp"><h2>Sample Driver: jdemdataset.cpp</h2></a> <center> <p> </center> <p> <div class="fragment"><pre><font class="comment">/******************************************************************************</font> <font class="comment"> * $Id: jdemdataset.cpp.html,v 1.4 2002/04/16 13:11:49 warmerda Exp $</font> <font class="comment"> *</font> <font class="comment"> * Project: JDEM Reader</font> <font class="comment"> * Purpose: All code for Japanese DEM Reader</font> <font class="comment"> * Author: Frank Warmerdam, warmerdam@pobox.com</font> <font class="comment"> *</font> <font class="comment"> ******************************************************************************</font> <font class="comment"> * Copyright (c) 2000, Frank Warmerdam <warmerdam@pobox.com></font> <font class="comment"> *</font> <font class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a</font> <font class="comment"> * copy of this software and associated documentation files (the "Software"),</font> <font class="comment"> * to deal in the Software without restriction, including without limitation</font> <font class="comment"> * the rights to use, copy, modify, merge, publish, distribute, sublicense,</font> <font class="comment"> * and/or sell copies of the Software, and to permit persons to whom the</font> <font class="comment"> * Software is furnished to do so, subject to the following conditions:</font> <font class="comment"> *</font> <font class="comment"> * The above copyright notice and this permission notice shall be included</font> <font class="comment"> * in all copies or substantial portions of the Software.</font> <font class="comment"> *</font> <font class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS</font> <font class="comment"> * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</font> <font class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL</font> <font class="comment"> * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</font> <font class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING</font> <font class="comment"> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER</font> <font class="comment"> * DEALINGS IN THE SOFTWARE.</font> <font class="comment"> ******************************************************************************</font> <font class="comment"> * </font> <font class="comment"> * $Log: jdemdataset.cpp.html,v $ <font class="comment"> * Revision 1.4 2002/04/16 13:11:49 warmerda <font class="comment"> * updated <font class="comment"> *</font> <font class="comment"> * Revision 1.5 2001/11/11 23:51:00 warmerda</font> <font class="comment"> * added required class keyword to friend declarations</font> <font class="comment"> *</font> <font class="comment"> * Revision 1.4 2001/07/18 04:51:57 warmerda</font> <font class="comment"> * added CPL_CVSID</font> <font class="comment"> *</font> <font class="comment"> * Revision 1.3 2001/06/21 19:59:51 warmerda</font> <font class="comment"> * added help link</font> <font class="comment"> *</font> <font class="comment"> * Revision 1.2 2000/11/28 02:28:54 warmerda</font> <font class="comment"> * Added error checks, GetGeoTransform and GetProjection</font> <font class="comment"> *</font> <font class="comment"> * Revision 1.1 2000/11/27 19:03:26 warmerda</font> <font class="comment"> * New</font> <font class="comment"> *</font> <font class="comment"> */</font> <font class="preprocessor">#include "gdal_priv.h"</font> CPL_CVSID(<font class="stringliteral">"$Id: jdemdataset.cpp.html,v 1.4 2002/04/16 13:11:49 warmerda Exp $"</font>); <font class="keyword">static</font> <a class="code" href="class_GDALDriver.html">GDALDriver</a> *poJDEMDriver = NULL; CPL_C_START <font class="keywordtype">void</font> GDALRegister_JDEM(<font class="keywordtype">void</font>); CPL_C_END <font class="comment">/************************************************************************/</font> <font class="comment">/* JDEMGetField() */</font> <font class="comment">/************************************************************************/</font> <font class="keyword">static</font> <font class="keywordtype">int</font> JDEMGetField( <font class="keywordtype">char</font> *pszField, <font class="keywordtype">int</font> nWidth )<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <font class="keywordtype">char</font> szWork[32]; CPLAssert( nWidth < (<font class="keywordtype">int</font>) <font class="keyword">sizeof</font>(szWork) ); strncpy( szWork, pszField, nWidth ); szWork[nWidth] = <font class="charliteral">'\0'</font>; <font class="keywordflow">return</font> atoi(szWork); } <font class="comment">/************************************************************************/</font> <font class="comment">/* JDEMGetAngle() */</font> <font class="comment">/************************************************************************/</font> <font class="keyword">static</font> <font class="keywordtype">double</font> JDEMGetAngle( <font class="keywordtype">char</font> *pszField )<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <font class="keywordtype">int</font> nAngle = JDEMGetField( pszField, 7 ); <font class="keywordtype">int</font> nDegree, nMin, nSec; <font class="comment">// Note, this isn't very general purpose, but it would appear</font> <font class="comment">// from the field widths that angles are never negative. Nice</font> <font class="comment">// to be a country in the "first quadrant". </font> nDegree = nAngle / 10000; nMin = (nAngle / 100) % 100; nSec = nAngle % 100; <font class="keywordflow">return</font> nDegree + nMin / 60.0 + nSec / 3600.0; } <font class="comment">/************************************************************************/</font> <font class="comment">/* ==================================================================== */</font> <font class="comment">/* JDEMDataset */</font> <font class="comment">/* ==================================================================== */</font> <font class="comment">/************************************************************************/</font> <font class="keyword">class </font>JDEMRasterBand; <font class="keyword">class </font>JDEMDataset : <font class="keyword">public</font> <a class="code" href="class_GDALDataset.html">GDALDataset</a> { <font class="keyword">friend</font> <font class="keyword">class </font>JDEMRasterBand; FILE *fp; GByte abyHeader[1012]; <font class="keyword">public</font>: ~JDEMDataset(); <font class="keyword">static</font> <a class="code" href="class_GDALDataset.html">GDALDataset</a> *Open( GDALOpenInfo * ); CPLErr <a class="code" href="class_GDALDataset.html#a8">GetGeoTransform</a>( <font class="keywordtype">double</font> * padfTransform ); <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="class_GDALDataset.html#a6">GetProjectionRef</a>(); }; <font class="comment">/************************************************************************/</font> <font class="comment">/* ==================================================================== */</font> <font class="comment">/* JDEMRasterBand */</font> <font class="comment">/* ==================================================================== */</font> <font class="comment">/************************************************************************/</font> <font class="keyword">class </font>JDEMRasterBand : <font class="keyword">public</font> <a class="code" href="class_GDALRasterBand.html">GDALRasterBand</a> { <font class="keyword">friend</font> <font class="keyword">class </font>JDEMDataset; <font class="keyword">public</font>: JDEMRasterBand( JDEMDataset *, <font class="keywordtype">int</font> ); <font class="keyword">virtual</font> CPLErr IReadBlock( <font class="keywordtype">int</font>, <font class="keywordtype">int</font>, <font class="keywordtype">void</font> * ); }; <font class="comment">/************************************************************************/</font> <font class="comment">/* JDEMRasterBand() */</font> <font class="comment">/************************************************************************/</font> JDEMRasterBand::JDEMRasterBand( JDEMDataset *poDS, <font class="keywordtype">int</font> nBand )<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ this->poDS = poDS; this->nBand = nBand; eDataType = GDT_Float32; nBlockXSize = poDS-><a class="code" href="class_GDALDataset.html#a1">GetRasterXSize</a>(); nBlockYSize = 1; } <font class="comment">/************************************************************************/</font> <font class="comment">/* IReadBlock() */</font> <font class="comment">/************************************************************************/</font> CPLErr JDEMRasterBand::IReadBlock( <font class="keywordtype">int</font> nBlockXOff, <font class="keywordtype">int</font> nBlockYOff, <font class="keywordtype">void</font> * pImage )<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ JDEMDataset *poGDS = (JDEMDataset *) poDS; <font class="keywordtype">char</font> *pszRecord; <font class="keywordtype">int</font> nRecordSize = nBlockXSize*5 + 9 + 2; <font class="keywordtype">int</font> i; VSIFSeek( poGDS->fp, 1011 + nRecordSize*nBlockYOff, SEEK_SET ); pszRecord = (<font class="keywordtype">char</font> *) <a class="code" href="cpl_conv_h.html#a3">CPLMalloc</a>(nRecordSize); VSIFRead( pszRecord, 1, nRecordSize, poGDS->fp ); <font class="keywordflow">if</font>( !EQUALN((<font class="keywordtype">char</font> *) poGDS->abyHeader,pszRecord,6) ) { CPLFree( pszRecord ); <a class="code" href="cpl_error_h.html#a17">CPLError</a>( CE_Failure, CPLE_AppDefined, <font class="stringliteral">"JDEM Scanline corrupt. Perhaps file was not transferred\n"</font> <font class="stringliteral">"in binary mode?"</font> ); <font class="keywordflow">return</font> CE_Failure; } <font class="keywordflow">if</font>( JDEMGetField( pszRecord + 6, 3 ) != nBlockYOff + 1 ) { CPLFree( pszRecord ); <a class="code" href="cpl_error_h.html#a17">CPLError</a>( CE_Failure, CPLE_AppDefined, <font class="stringliteral">"JDEM scanline out of order, JDEM driver does not\n"</font> <font class="stringliteral">"currently support partial datasets."</font> ); <font class="keywordflow">return</font> CE_Failure; } <font class="keywordflow">for</font>( i = 0; i < nBlockXSize; i++ ) ((<font class="keywordtype">float</font> *) pImage)[i] = JDEMGetField( pszRecord + 9 + 5 * i, 5) * 0.1; <font class="keywordflow">return</font> CE_None; } <font class="comment">/************************************************************************/</font> <font class="comment">/* ==================================================================== */</font> <font class="comment">/* JDEMDataset */</font> <font class="comment">/* ==================================================================== */</font> <font class="comment">/************************************************************************/</font> <font class="comment">/************************************************************************/</font> <font class="comment">/* ~JDEMDataset() */</font> <font class="comment">/************************************************************************/</font> JDEMDataset::~JDEMDataset()<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <font class="keywordflow">if</font>( fp != NULL ) VSIFClose( fp ); } <font class="comment">/************************************************************************/</font> <font class="comment">/* GetGeoTransform() */</font> <font class="comment">/************************************************************************/</font> CPLErr <a class="code" href="class_GDALDataset.html#a8">JDEMDataset::GetGeoTransform</a>( <font class="keywordtype">double</font> * padfTransform )<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <font class="keywordtype">double</font> dfLLLat, dfLLLong, dfURLat, dfURLong; dfLLLat = JDEMGetAngle( (<font class="keywordtype">char</font> *) abyHeader + 29 ); dfLLLong = JDEMGetAngle( (<font class="keywordtype">char</font> *) abyHeader + 36 ); dfURLat = JDEMGetAngle( (<font class="keywordtype">char</font> *) abyHeader + 43 ); dfURLong = JDEMGetAngle( (<font class="keywordtype">char</font> *) abyHeader + 50 ); padfTransform[0] = dfLLLong; padfTransform[3] = dfURLat; padfTransform[1] = (dfURLong - dfLLLong) / <a class="code" href="class_GDALDataset.html#a1">GetRasterXSize</a>(); padfTransform[2] = 0.0; padfTransform[4] = 0.0; padfTransform[5] = -1 * (dfURLat - dfLLLat) / <a class="code" href="class_GDALDataset.html#a2">GetRasterYSize</a>(); <font class="keywordflow">return</font> CE_None; } <font class="comment">/************************************************************************/</font> <font class="comment">/* GetProjectionRef() */</font> <font class="comment">/************************************************************************/</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="class_GDALDataset.html#a6">JDEMDataset::GetProjectionRef</a>()<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <font class="keywordflow">return</font>( <font class="stringliteral">"GEOGCS[\"Tokyo\",DATUM[\"Tokyo\",SPHEROID[\"Bessel 1841\",6377397.155,299.1528128,AUTHORITY[\"EPSG\",7004]],TOWGS84[-148,507,685,0,0,0,0],AUTHORITY[\"EPSG\",6301]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",8901]],UNIT[\"DMSH\",0.0174532925199433,AUTHORITY[\"EPSG\",9108]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",4301]]"</font> ); } <font class="comment">/************************************************************************/</font> <font class="comment">/* Open() */</font> <font class="comment">/************************************************************************/</font> <a class="code" href="class_GDALDataset.html">GDALDataset</a> *JDEMDataset::Open( GDALOpenInfo * poOpenInfo )<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <font class="comment">/* -------------------------------------------------------------------- */</font> <font class="comment">/* Before trying JDEMOpen() we first verify that there is at */</font> <font class="comment">/* least one "\n#keyword" type signature in the first chunk of */</font> <font class="comment">/* the file. */</font> <font class="comment">/* -------------------------------------------------------------------- */</font> <font class="keywordflow">if</font>( poOpenInfo->fp == NULL || poOpenInfo->nHeaderBytes < 50 ) <font class="keywordflow">return</font> NULL; <font class="comment">/* check if century values seem reasonable */</font> <font class="keywordflow">if</font>( (!EQUALN((<font class="keywordtype">char</font> *)poOpenInfo->pabyHeader+11,<font class="stringliteral">"19"</font>,2) && !EQUALN((<font class="keywordtype">char</font> *)poOpenInfo->pabyHeader+11,<font class="stringliteral">"20"</font>,2)) || (!EQUALN((<font class="keywordtype">char</font> *)poOpenInfo->pabyHeader+15,<font class="stringliteral">"19"</font>,2) && !EQUALN((<font class="keywordtype">char</font> *)poOpenInfo->pabyHeader+15,<font class="stringliteral">"20"</font>,2)) || (!EQUALN((<font class="keywordtype">char</font> *)poOpenInfo->pabyHeader+19,<font class="stringliteral">"19"</font>,2) && !EQUALN((<font class="keywordtype">char</font> *)poOpenInfo->pabyHeader+19,<font class="stringliteral">"20"</font>,2)) ) { <font class="keywordflow">return</font> NULL; } <font class="comment">/* -------------------------------------------------------------------- */</font> <font class="comment">/* Create a corresponding GDALDataset. */</font> <font class="comment">/* -------------------------------------------------------------------- */</font> JDEMDataset *poDS; poDS = <font class="keyword">new</font> JDEMDataset(); poDS->poDriver = poJDEMDriver; poDS->fp = poOpenInfo->fp; poOpenInfo->fp = NULL; <font class="comment">/* -------------------------------------------------------------------- */</font> <font class="comment">/* Read the header. */</font> <font class="comment">/* -------------------------------------------------------------------- */</font> VSIFSeek( poDS->fp, 0, SEEK_SET ); VSIFRead( poDS->abyHeader, 1, 1012, poDS->fp ); poDS->nRasterXSize = JDEMGetField( (<font class="keywordtype">char</font> *) poDS->abyHeader + 23, 3 ); poDS->nRasterYSize = JDEMGetField( (<font class="keywordtype">char</font> *) poDS->abyHeader + 26, 3 ); <font class="comment">/* -------------------------------------------------------------------- */</font> <font class="comment">/* Create band information objects. */</font> <font class="comment">/* -------------------------------------------------------------------- */</font> poDS->SetBand( 1, <font class="keyword">new</font> JDEMRasterBand( poDS, 1 )); <font class="keywordflow">return</font>( poDS ); } <font class="comment">/************************************************************************/</font> <font class="comment">/* GDALRegister_JDEM() */</font> <font class="comment">/************************************************************************/</font> <font class="keywordtype">void</font> GDALRegister_JDEM()<font class="keyword"></font> <font class="keyword"></font> <font class="keyword"></font>{ <a class="code" href="class_GDALDriver.html">GDALDriver</a> *poDriver; <font class="keywordflow">if</font>( poJDEMDriver == NULL ) { poJDEMDriver = poDriver = <font class="keyword">new</font> GDALDriver(); poDriver->pszShortName = <font class="stringliteral">"JDEM"</font>; poDriver->pszLongName = <font class="stringliteral">"Japanese DEM (.mem)"</font>; poDriver->pszHelpTopic = <font class="stringliteral">"frmt_various.html#JDEM"</font>; poDriver->pfnOpen = JDEMDataset::Open; GetGDALDriverManager()->RegisterDriver( poDriver ); } } </div></pre> <p> <hr><address><small>Generated at Thu Mar 28 09:47:33 2002 for GDAL by <a href="http://www.stack.nl/~dimitri/doxygen/index.html"> <img src="doxygen.gif" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.3-20001105 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, © 1997-2000</small></address> </body> </html>