[gdal-dev] libkml driver get document name

Damian Dixon damian.dixon at gmail.com
Wed Feb 24 09:30:30 PST 2016


Hi,

I've been meaning to submit a patch for awhile to libkml driver but have
not had time to do so.

The fix is a one line change highlighted below:


int OGRLIBKMLDataSource::OpenKml (
    const char *pszFilename,
    int bUpdate )
{
    std::string oKmlKml;
    char szBuffer[1024+1];

    VSILFILE* fp = VSIFOpenL(pszFilename, "rb");
    if (fp == NULL)
    {
        CPLError ( CE_Failure, CPLE_OpenFailed,
                   "Cannot open %s", pszFilename );
        return FALSE;
    }
    int nRead;
    while ((nRead = VSIFReadL(szBuffer, 1, 1024, fp)) != 0)
    {
        try
        {
            oKmlKml.append(szBuffer, nRead);
        }
        catch(std::bad_alloc& e)
        {
            VSIFCloseL(fp);
            return FALSE;
        }
    }
    OGRLIBKMLPreProcessInput(oKmlKml);
    VSIFCloseL(fp);

    CPLLocaleC  oLocaleForcer;

    /***** create a SRS *****/

    OGRSpatialReference *poOgrSRS =
        new OGRSpatialReference ( OGRLIBKMLSRSWKT );

    /***** parse the kml into the DOM *****/

    std::string oKmlErrors;

    ElementPtr poKmlRoot = kmldom::Parse ( oKmlKml, &oKmlErrors );

    if ( !poKmlRoot ) {
        CPLError ( CE_Failure, CPLE_OpenFailed,
                   "ERROR Parseing kml %s :%s",
                   pszFilename, oKmlErrors.c_str (  ) );
        delete poOgrSRS;

        return FALSE;
    }

    /***** get the container from root  *****/

    if ( !( m_poKmlDSContainer = GetContainerFromRoot ( m_poKmlFactory,
poKmlRoot ) ) ) {
        CPLError ( CE_Failure, CPLE_OpenFailed,
                   "ERROR Parseing kml %s :%s %s",
                   pszFilename, "This file does not fit the OGR model,",
                   "there is no container element at the root." );
        delete poOgrSRS;

        return FALSE;
    }

    m_isKml = TRUE;

    /***** get the styles *****/

    ParseStyles ( AsDocument ( m_poKmlDSContainer ), &m_poStyleTable );

    /***** parse for layers *****/

    int nPlacemarks = ParseLayers ( m_poKmlDSContainer, poOgrSRS );

    /***** if there is placemarks in the root its a layer *****/

*    if ( nPlacemarks ) {*   //
<------------------------------------------------------------------------------------------This
line
        AddLayer ( CPLGetBasename ( pszFilename ),
                   poOgrSRS, wkbUnknown,
                   this, poKmlRoot, m_poKmlDSContainer, pszFilename, FALSE,
bUpdate, 1 );
    }

    delete poOgrSRS;

    return TRUE;
}

Regards
Damian

On 24 February 2016 at 17:00, Jan Vaillant <jvail at gmx.de> wrote:

> On 02/24/2016 12:53 AM, Even Rouault wrote:
>
>> Le mardi 23 février 2016 14:50:35, jan vaillant a écrit :
>>
>>> Hi list,
>>>
>>> I am reading a zipped kml with gdal's libkml driver. I am trying to
>>> access
>>> the name tag of the document:
>>>
>>> <kml>
>>>    <Document>
>>>      <name>a_name</name>
>>>
>>
>> I did a quick testing It appears that the driver will report a <name> as
>> the
>> layer name only if it inside a <Folder> tag, but not as a direct child of
>> <Document>
>>
>
> Yes, thank you. I tried the kml driver as well and it stores the
> Document/name and makes it available with layer.getName().
>
> Bye
>
> Jan
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20160224/91c97d00/attachment.html>


More information about the gdal-dev mailing list