[Gdal-dev] importFromWkt() problem
Petteri Packalen
packalen at cs.joensuu.fi
Sun Sep 3 03:01:28 EDT 2006
Hi,
Unfortunately this is not the problem, WKT strings are in correct
format. geo_trans is a global variable which is filled within
ConvertWktByJhs154ToEuref(). Note that example 2 works perfectly.
Best regards,
Petteri
> Petteri Packalen wrote:
>> Mateusz, Frank, list,
>>
>> I prepared the code below that demonstrates an essential part of the
>> function in question. There was actually a bug in my first mail in
>> example 1. Here is the more comprehensive illustration. Thus, although
>> in both examples the address of the COPY of the pointer is passed to
>> createFromWkt() or importFromWkt() only latter one works properly.
>>
>> // Some variables needed in the above code.
>> OGRFeature *poSrcFeature;
>> char *geo_wkt = new char[ WKT_BUF ];
>> char *geo_trans = new char[ WKT_BUF ];
>>
>> // This loop which goes through all OGR features. Partly taken
>> // from the TranslateLayer() function in ogr2ogr.cpp.
>> while( TRUE )
>> {
>> OGRFeature *poDstFeature = NULL;
>>
>> // Fetch input feature.
>> poSrcFeature = poSrcLayer->GetNextFeature();
>> if ( poSrcFeature == NULL )
>> break;
>>
>> if ( ++nFeaturesInTransaction == nGroupTransactions )
>> {
>> poDstLayer->CommitTransaction();
>> poDstLayer->StartTransaction();
>> nFeaturesInTransaction = 0;
>> }
>>
>> // Create output feature based on input feature.
>> CPLErrorReset();
>> poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() );
>> poDstFeature->SetFrom( poSrcFeature, TRUE );
>>
>> // Fetch output geometry ref.
>> OGRGeometry *poGeom = poDstFeature->GetGeometryRef();
>>
>> // Export geometry to WKT to be transformed.
>> poGeom->exportToWkt( &geo_wkt );
>
>
>
> If this is your complete set of operations, I don't see that you're
> clearing the geo_trans buffer between filling it with exportToWkt().
>
> So, you likely are getting garbage from previous WKT if the latter
> is shorter than previous.
>
> Here is small case study that presents my considerations:
>
> //////////////////////////////////////////////////////////////////////
> // Compile:
> // g++ -Wall -pedantic -ansi -o newedchar newedchar.cpp
>
> #include <iostream>
> #include <cstring>
> #include <cassert>
>
> void print_data(const char* data, std::size_t size)
> {
> assert(0 != data);
>
> std::cout << "------ START (size=" << size - 1 << ") ------\n";
>
> for (std::size_t i = 0; i != size - 1; ++i)
> std::cout << data[i] << " , ";
>
> std::cout << "\n------ END ------\n\n";
> }
>
> int main()
> {
> // Short data source
> const std::size_t shortSize = 5;
> const char shortData[] = "12345"; // 5 elements + null
>
> // Long data source
> const std::size_t longSize = 8;
> const char longData[] = "abcdefgh"; // 8 elements + null
>
> // Destination buffer
> const std::size_t size = 15; // 14 elements + null
> char* dest = new char[size]; // filled with 0
>
> const char* p = 0; // iterator used to print, 'dest' stays unchanged
>
> // Copy long data to common buffer
> std::memcpy(dest, longData, longSize);
>
> p = dest;
> print_data(p, size);
>
> // DON'T CLEAN THE BUFFER (uncomment to clear buffer in next run)
> // std::memset(dest, 0, size);
>
> // Copy short data to common buffer
> std::memcpy(dest, shortData, shortSize);
>
> p = dest;
> print_data(dest, size);
>
> delete[] dest;
>
> return 0;
> }
> //////////////////////////////////////////////////////////////////////
>
>
>
>
> And here is the output of this program:
>
> mloskot:~$ ./bufftest
> ------ START (size=14) ------
> a , b , c , d , e , f , g , h , , , , , , ,
> ------ END ------
>
> ------ START (size=14) ------
> 1 , 2 , 3 , 4 , 5 , f , g , h , , , , , , ,
> ------ END ------
>
>
> The first buffer print is correct, it includes what we expect.
> The second print is incorrect, it includes *garbage*, previous
> content of buffer:
>
> 1 , 2 , 3 , 4 , 5 , f , g , h , , , , , , ,
> -------------------^^^^^^^^^^^ - GARBAGE
>
>
>
> But the correct and safe result should look as follows:
>
> ------ START (size=14) ------
> a , b , c , d , e , f , g , h , , , , , , ,
> ------ END ------
>
> ------ START (size=14) ------
> 1 , 2 , 3 , 4 , 5 , , , , , , , , , ,
> ------ END ------
>
>
> I hope it helps.
>
> Cheers
> --
> Mateusz Loskot
> http://mateusz.loskot.net
> _______________________________________________
> Gdal-dev mailing list
> Gdal-dev at lists.maptools.org
> http://lists.maptools.org/mailman/listinfo/gdal-dev
>
More information about the Gdal-dev
mailing list