コード例 #1
0
void GDALWMSMiniDriver_VirtualEarth::TiledImageRequest(CPLString *url,
                                                       CPL_UNUSED const GDALWMSImageRequestInfo &iri,
                                                       const GDALWMSTiledImageRequestInfo &tiri)
{

    *url = m_base_url;

    char szTileNumber[64];
    int x = tiri.m_x;
    int y = tiri.m_y;
    int z = MIN(32,tiri.m_level);

    for(int i = 0; i < z; i ++)
    {
        int row = (y & 1);
        int col = (x & 1);

        szTileNumber[z-1-i] = (char) ('0' + (col | (row << 1)));

        x = x >> 1;
        y = y >> 1;
    }
    szTileNumber[z] = 0;

    URLSearchAndReplace(url, "${quadkey}", "%s", szTileNumber);
    URLSearchAndReplace(url, "${server_num}", "%d",
                        (tiri.m_x + tiri.m_y + z) % 4);
}
コード例 #2
0
ファイル: minidriver_tms.cpp プロジェクト: OSGeo/gdal
CPLErr WMSMiniDriver_TMS::TiledImageRequest(WMSHTTPRequest &request,
                                            const GDALWMSImageRequestInfo &iri,
                                            const GDALWMSTiledImageRequestInfo &tiri)
{
    CPLString &url = request.URL;
    const GDALWMSDataWindow *data_window = m_parent_dataset->WMSGetDataWindow();
    int tms_y;

    if (data_window->m_y_origin != GDALWMSDataWindow::TOP) {
        if( iri.m_y0 == iri.m_y1 )
            return CE_Failure;
        const double dfTmp = floor(((data_window->m_y1 - data_window->m_y0)
                                      / (iri.m_y1 - iri.m_y0)) + 0.5);
        if( !(dfTmp >= 0 && dfTmp < INT_MAX) )
            return CE_Failure;
        tms_y = static_cast<int>(dfTmp) - tiri.m_y - 1;
    } else {
        tms_y = tiri.m_y;
    }
    // http://tms25.arc.nasa.gov/tile/tile.aspx?T=geocover2000&L=0&X=86&Y=39
    url = m_base_url;

    URLSearchAndReplace(&url, "${x}", "%d", tiri.m_x);
    URLSearchAndReplace(&url, "${y}", "%d", tms_y);
    URLSearchAndReplace(&url, "${z}", "%d", tiri.m_level);

    /* Hack for some TMS like servers that require tile numbers split into 3 groups of */
    /* 3 digits, like http://tile8.geo.admin.ch/geoadmin/ch.swisstopo.pixelkarte-farbe */
    URLSearchAndReplace(&url, "${xxx}", "%03d/%03d/%03d", tiri.m_x / 1000000, (tiri.m_x / 1000) % 1000, tiri.m_x % 1000);
    URLSearchAndReplace(&url, "${yyy}", "%03d/%03d/%03d", tms_y / 1000000, (tms_y / 1000) % 1000, tms_y % 1000);

    return CE_None;
}
コード例 #3
0
ファイル: minidriver_tms.cpp プロジェクト: OSGeo/gdal
CPLErr WMSMiniDriver_TMS::Initialize(CPLXMLNode *config, CPL_UNUSED char **papszOpenOptions) {
    CPLErr ret = CE_None;

    {
        const char *base_url = CPLGetXMLValue(config, "ServerURL", "");
        if (base_url[0] != '\0') {
            m_base_url = base_url;
            if (m_base_url.find("${") == std::string::npos) {
                if (m_base_url.back() != '/') {
                    m_base_url += "/";
                }
                m_base_url += "${version}/${layer}/${z}/${x}/${y}.${format}";
            }
        } else {
            CPLError(CE_Failure, CPLE_AppDefined, "GDALWMS, TMS mini-driver: ServerURL missing.");
            ret = CE_Failure;
        }
    }

    // These never change
    const char *dataset = CPLGetXMLValue(config, "Layer", "");
    URLSearchAndReplace(&m_base_url, "${layer}", "%s", dataset);
    const char *version = CPLGetXMLValue(config, "Version", "1.0.0");
    URLSearchAndReplace(&m_base_url, "${version}", "%s", version);
    const char *format = CPLGetXMLValue(config, "Format", "jpg");
    URLSearchAndReplace(&m_base_url, "${format}", "%s", format);

    return ret;
}
コード例 #4
0
void GDALWMSMiniDriver_TMS::TiledImageRequest(CPLString *url, const GDALWMSImageRequestInfo &iri, const GDALWMSTiledImageRequestInfo &tiri) {
    const GDALWMSDataWindow *data_window = m_parent_dataset->WMSGetDataWindow();
    int tms_y;

    if (data_window->m_y_origin != GDALWMSDataWindow::TOP) {
        tms_y = static_cast<int>(floor(((data_window->m_y1 - data_window->m_y0)
                                      / (iri.m_y1 - iri.m_y0)) + 0.5)) - tiri.m_y - 1;
    } else {
        tms_y = tiri.m_y;
    }
    // http://tms25.arc.nasa.gov/tile/tile.aspx?T=geocover2000&L=0&X=86&Y=39
    *url = m_base_url;

    URLSearchAndReplace(url, "${version}", "%s", m_version.c_str());
    URLSearchAndReplace(url, "${layer}", "%s", m_dataset.c_str());
    URLSearchAndReplace(url, "${format}", "%s", m_format.c_str());
    URLSearchAndReplace(url, "${x}", "%d", tiri.m_x);
    URLSearchAndReplace(url, "${y}", "%d", tms_y);
    URLSearchAndReplace(url, "${z}", "%d", tiri.m_level);

    /* Hack for some TMS like servers that require tile numbers split into 3 groups of */
    /* 3 digits, like http://tile8.geo.admin.ch/geoadmin/ch.swisstopo.pixelkarte-farbe */
    URLSearchAndReplace(url, "${xxx}", "%03d/%03d/%03d", tiri.m_x / 1000000, (tiri.m_x / 1000) % 1000, tiri.m_x % 1000);
    URLSearchAndReplace(url, "${yyy}", "%03d/%03d/%03d", tms_y / 1000000, (tms_y / 1000) % 1000, tms_y % 1000);

}
コード例 #5
0
void GDALWMSMiniDriver_TiledWMS::TiledImageRequest(CPLString *url, const GDALWMSImageRequestInfo &iri, const GDALWMSTiledImageRequestInfo &tiri) {
    *url = m_base_url;
    URLAppend(url,CSLGetField(m_requests,-tiri.m_level));
    URLSearchAndReplace(url,"${GDAL_BBOX}","%013.8f,%013.8f,%013.8f,%013.8f",
                        iri.m_x0,iri.m_y1,iri.m_x1,iri.m_y0);
    URLAppend(url,m_end_url);
}
コード例 #6
0
static void FindChangePattern( char *cdata,char **substs, char **keys, CPLString &ret)
{
    char **papszTokens=CSLTokenizeString2(cdata," \t\n\r",
                                           CSLT_STRIPLEADSPACES|CSLT_STRIPENDSPACES);
    ret.clear();

    int matchcount=CSLCount(substs);
    int keycount=CSLCount(keys);
    if (keycount<matchcount)
    {
        CSLDestroy(papszTokens);
        return;
    }

    // A valid string has only the keys in the substs list and none other
    for (int j=0;j<CSLCount(papszTokens);j++)
    {
        ret=papszTokens[j];  // The target string
        bool matches=true;

        for (int k=0;k<keycount && keys != NULL;k++)
        {
            const char *key=keys[k];
            int sub_number=CSLPartialFindString(substs,key);
            if (sub_number!=-1)
            { // It is a listed match
                // But is the match for the key position?
                char *found_key=NULL;
                const char *found_value=CPLParseNameValue(substs[sub_number],&found_key);
                if (found_key!=NULL && EQUAL(found_key,key))
                {  // Should exits in the request
                    if (std::string::npos==ret.find(key))
                    {
                        matches=false;
                        CPLFree(found_key);
                        break;
                    }
                    // Execute the substitution on the "ret" string
                    URLSearchAndReplace(&ret,key,"%s",found_value);
                }
                if (found_key!=NULL) CPLFree(found_key);
            }
            else
            {  // Key not in the subst list, should not match
                if (std::string::npos!=ret.find(key))
                {
                    matches=false;
                    break;
                }
            }
        } // Key loop
        if (matches)
        {
            CSLDestroy(papszTokens);
            return;  // We got the string ready, all keys accounted for and substs applied
        }
    }
    ret.clear();
    CSLDestroy(papszTokens);
}