Changeset 11828


Ignore:
Timestamp:
Jun 16, 2011 7:17:54 AM (5 years ago)
Author:
aboudreault
Message:

Added WMS GetFeatureInfo? Cascading (#3764)

Location:
trunk/mapserver
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/mapserver/HISTORY.TXT

    r11827 r11828  
    1515Current Version (SVN trunk, 6.1-dev, future 6.2):
    1616-------------------------------------------------
     17
     18- Added WMS GetFeatureInfo Cascading (#3764)
    1719
    1820- Fixed png lib is not found on multiarch systems (#3921)
  • trunk/mapserver/mapdraw.c

    r11601 r11828  
    332332#ifdef USE_WMS_LYR
    333333      if(lp->connectiontype == MS_WMS) {
    334         if(msPrepareWMSLayerRequest(map->layerorder[i], map, lp, lastconnectiontype, &sLastWMSParams, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) {
     334          if(msPrepareWMSLayerRequest(map->layerorder[i], map, lp, 1, lastconnectiontype, &sLastWMSParams, 0, 0, 0, NULL, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) {
    335335          msFreeWmsParamsObj(&sLastWMSParams);
    336336          msFreeImage(image);
     
    13151315        msHTTPInitRequestObj(asReqInfo, 2);
    13161316
    1317         if ( msPrepareWMSLayerRequest(1, map, layer,
    1318                                       0, NULL,
     1317        if ( msPrepareWMSLayerRequest(1, map, layer, 1,
     1318                                      0, NULL, 0, 0, 0, NULL,
    13191319                                      asReqInfo, &numReq) == MS_FAILURE  ||
    13201320             msOWSExecuteRequests(asReqInfo, numReq, map, MS_TRUE) == MS_FAILURE )
  • trunk/mapserver/mapows.h

    r11351 r11828  
    383383
    384384int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
    385                              enum MS_CONNECTION_TYPE lastconnectiontype,
     385                             int nRequestType, enum MS_CONNECTION_TYPE lastconnectiontype,
    386386                             wmsParamsObj *psLastWMSParams,
     387                             int nClickX, int nClickY, int nFeatureCount, const char *pszInfoFormat,
    387388                             httpRequestObj *pasReqInfo, int *numRequests);
    388389int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo,
     
    392393                             int nClickX, int nClickY, int nFeatureCount,
    393394                             const char *pszInfoFormat);
    394 
    395 
    396 
     395int msWMSLayerFeatureInfo(mapObj *map, int nOWSLayers, int nClickX, int nClickY,
     396                          int nFeatureCount, const char *pszInfoFormat);
    397397
    398398/*====================================================================
  • trunk/mapserver/mapwms.c

    r11767 r11828  
    31013101  int format_found = MS_FALSE;
    31023102  int use_bbox = MS_FALSE;
     3103  int wms_layer =  MS_FALSE;
     3104  const char *wms_connection = NULL;
     3105  int numOWSLayers = 0;
    31033106
    31043107  encoding = msOWSLookupMetadata(&(map->web.metadata), "MO", "encoding");
     
    31273130              (GET_LAYER(map, j)->group && strcasecmp(GET_LAYER(map, j)->group, layers[k]) == 0)) &&
    31283131             (msIntegerInArray(GET_LAYER(map, j)->index, ows_request->enabled_layers, ows_request->numlayers)) )
    3129             {
    3130                 numlayers_found++;     
    3131                 GET_LAYER(map, j)->status = MS_ON;               
     3132         {
     3133             if (GET_LAYER(map, j)->connectiontype == MS_WMS) {
     3134                 wms_layer = MS_TRUE;
     3135                 wms_connection = GET_LAYER(map, j)->connection;
     3136             }
     3137             numlayers_found++;
     3138             GET_LAYER(map, j)->status = MS_ON;               
    31323139            }
    31333140        }
     
    31743181
    31753182  }
    3176 
     3183 
    31773184  if(numlayers_found == 0)
    31783185  {
     
    31973204/*      exception.                                                      */
    31983205/* -------------------------------------------------------------------- */
    3199  
     3206
     3207  /* If a layer of type WMS was found... all layers have to be of that type and with the same connection */ 
    32003208  for (i=0; i<map->numlayers; i++)
    32013209  {
    3202       if (GET_LAYER(map, i)->status == MS_ON && !msIsLayerQueryable(GET_LAYER(map, i)))
    3203       {
    3204           msSetError(MS_WMSERR, "Requested layer(s) are not queryable.", "msWMSFeatureInfo()");
    3205           return msWMSException(map, nVersion, "LayerNotQueryable", wms_exception_format);
    3206       }
    3207   }
     3210      if (GET_LAYER(map, i)->status == MS_ON)
     3211      {
     3212          if (!msIsLayerQueryable(GET_LAYER(map, i)))
     3213          {
     3214              msSetError(MS_WMSERR, "Requested layer(s) are not queryable.", "msWMSFeatureInfo()");
     3215              return msWMSException(map, nVersion, "LayerNotQueryable", wms_exception_format);
     3216          }
     3217          else if (wms_layer == MS_TRUE)
     3218          {
     3219              if ( (GET_LAYER(map, i)->connectiontype != MS_WMS) || (strcasecmp(wms_connection, GET_LAYER(map, i)->connection) != 0) )
     3220              {
     3221                  msSetError(MS_WMSERR, "Requested WMS layer(s) are not queryable: type or connection differ", "msWMSFeatureInfo()");
     3222                  return msWMSException(map, nVersion, "LayerNotQueryable", wms_exception_format);
     3223              }
     3224              ++numOWSLayers;
     3225          }
     3226      }
     3227  }
     3228
     3229  /* It's a valid Cascading WMS GetFeatureInfo request */
     3230  if (wms_layer)
     3231      return msWMSLayerFeatureInfo(map, numOWSLayers, point.x, point.y, feature_count, info_format);
    32083232
    32093233  if( use_bbox == MS_FALSE ) {
  • trunk/mapserver/mapwmslayer.c

    r10883 r11828  
    935935
    936936int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
    937                              enum MS_CONNECTION_TYPE lastconnectiontype,
     937                             int nRequestType, enum MS_CONNECTION_TYPE lastconnectiontype,
    938938                             wmsParamsObj *psLastWMSParams,
     939                             int nClickX, int nClickY, int nFeatureCount, const char *pszInfoFormat,
    939940                             httpRequestObj *pasReqInfo, int *numRequests)
    940941{
     
    964965 * compute BBOX in that projection.
    965966 * ------------------------------------------------------------------ */
    966     if ( msBuildWMSLayerURL(map, lp, WMS_GETMAP,
    967                             0, 0, 0, NULL, &bbox, &bbox_width, &bbox_height,
    968                             &sThisWMSParams) != MS_SUCCESS)
    969     {
     967
     968   
     969    if (nRequestType == WMS_GETMAP &&
     970        ( msBuildWMSLayerURL(map, lp, WMS_GETMAP,
     971                             0, 0, 0, NULL, &bbox, &bbox_width, &bbox_height,
     972                             &sThisWMSParams) != MS_SUCCESS) )
     973                                    {
    970974        /* an error was already reported. */
    971975        msFreeWmsParamsObj(&sThisWMSParams);
     
    973977    }
    974978
     979    else if (msBuildWMSLayerURL(map, lp, WMS_GETFEATUREINFO,
     980                                nClickX, nClickY, nFeatureCount, pszInfoFormat,
     981                                NULL, NULL, NULL,
     982                                &sThisWMSParams) == MS_FAILURE)
     983    {
     984        /* an error was already reported. */
     985        msFreeWmsParamsObj(&sThisWMSParams);
     986        return MS_FAILURE;
     987    }
     988
    975989/* ------------------------------------------------------------------
    976990 * Check if the request is empty, perhaps due to reprojection problems
    977991 * or wms_extents restrictions.
    978992 * ------------------------------------------------------------------ */
    979     if( bbox_width == 0 || bbox_height == 0 )
     993    if ((nRequestType == WMS_GETMAP) && (bbox_width == 0 || bbox_height == 0) )
    980994    {
    981995        msFreeWmsParamsObj(&sThisWMSParams);
    982996        return MS_SUCCESS;  /* No overlap. */
    983997    }
    984 
     998   
    985999/* ------------------------------------------------------------------
    9861000 * Check if layer overlaps current view window (using wms_latlonboundingbox)
     
    13251339        pasReqInfo[(*numRequests)].pszHTTPCookieData = pszHTTPCookieData;
    13261340        pszHTTPCookieData = NULL;
    1327         if( bCacheToDisk )
     1341        if( bCacheToDisk ) {
    13281342            pasReqInfo[(*numRequests)].pszOutputFile =
    1329                 msTmpFile(map, map->mappath, NULL, "img.tmp");
     1343                msTmpFile(map, map->mappath, NULL, "wms.tmp");
     1344        }
    13301345        else
    13311346            pasReqInfo[(*numRequests)].pszOutputFile = NULL;
     
    16271642
    16281643
     1644int msWMSLayerFeatureInfo(mapObj *map, int nOWSLayers, int nClickX, int nClickY,
     1645                          int nFeatureCount, const char *pszInfoFormat)
     1646{
     1647#ifdef USE_WMS_LYR
     1648
     1649    msIOContext *context;
     1650   
     1651    httpRequestObj *pasReqInfo;
     1652    wmsParamsObj sLastWMSParams;
     1653    int i, numReq = 0;
     1654
     1655    pasReqInfo = (httpRequestObj *)msSmallMalloc((nOWSLayers+1)*sizeof(httpRequestObj));
     1656    msHTTPInitRequestObj(pasReqInfo, nOWSLayers+1);
     1657    msInitWmsParamsObj(&sLastWMSParams);
     1658
     1659    /* Generate the http request */
     1660    for (i=0; i<map->numlayers; i++)
     1661    {
     1662        if (GET_LAYER(map,map->layerorder[i])->status == MS_ON)
     1663        {
     1664            if (msPrepareWMSLayerRequest(map->layerorder[i], map, GET_LAYER(map,map->layerorder[i]), WMS_GETFEATUREINFO,
     1665                                         MS_WMS, &sLastWMSParams,
     1666                                         nClickX, nClickY, nFeatureCount, pszInfoFormat,
     1667                                         pasReqInfo, &numReq) == MS_FAILURE)
     1668            {
     1669                msFreeWmsParamsObj(&sLastWMSParams);
     1670                msFree(pasReqInfo);
     1671                return MS_FAILURE;
     1672            }
     1673        }
     1674    }
     1675   
     1676    if (msOWSExecuteRequests(pasReqInfo, numReq, map, MS_FALSE) == MS_FAILURE)
     1677    {
     1678        msHTTPFreeRequestObj(pasReqInfo, numReq);
     1679        msFree(pasReqInfo);
     1680        msFreeWmsParamsObj(&sLastWMSParams);
     1681        return MS_FAILURE;
     1682    }
     1683
     1684    context = msIO_getHandler( stdout );
     1685    if( context == NULL )
     1686    {
     1687        msHTTPFreeRequestObj(pasReqInfo, numReq);
     1688        msFree(pasReqInfo);
     1689        msFreeWmsParamsObj(&sLastWMSParams);
     1690        return MS_FAILURE;
     1691    }
     1692
     1693    msIO_printf("Content-type: %s%c%c",pasReqInfo[0].pszContentType, 10,10);
     1694
     1695    if( pasReqInfo[0].pszOutputFile )
     1696    {
     1697        FILE *fp;
     1698        char szBuf[MS_BUFFER_LENGTH];
     1699
     1700        fp = fopen(pasReqInfo[0].pszOutputFile, "r");
     1701        if (fp)
     1702        {
     1703            while(1)
     1704            {
     1705                size_t nSize;
     1706                nSize = fread(szBuf, sizeof(char), MS_BUFFER_LENGTH-1, fp);
     1707                if (nSize > 0)
     1708                    msIO_contextWrite( context,
     1709                                       szBuf,
     1710                                       nSize);
     1711                if (nSize != MS_BUFFER_LENGTH-1)
     1712                    break;
     1713            }
     1714            fclose(fp);
     1715            if (!map->debug)
     1716                unlink(pasReqInfo[0].pszOutputFile);
     1717        }
     1718        else
     1719        {
     1720            msSetError(MS_IOERR, "'%s'.",
     1721                       "msWMSLayerFeatureInfo()", pasReqInfo[0].pszOutputFile);
     1722            return MS_FAILURE;
     1723        }
     1724    }
     1725    else
     1726    {
     1727        msIO_contextWrite( context,
     1728                           pasReqInfo[0].result_data,
     1729                           pasReqInfo[0].result_size );
     1730    }
     1731     
     1732    msHTTPFreeRequestObj(pasReqInfo, numReq);
     1733    msFree(pasReqInfo);
     1734    msFreeWmsParamsObj(&sLastWMSParams);
     1735
     1736    return MS_SUCCESS;
     1737#else
     1738/* ------------------------------------------------------------------
     1739 * WMS CONNECTION Support not included...
     1740 * ------------------------------------------------------------------ */
     1741  msSetError(MS_WMSCONNERR, "WMS CLIENT CONNECTION support is not available.",
     1742             "msWMSLayerFeatureInfo()");
     1743  return(MS_FAILURE);
     1744
     1745#endif /* USE_WMS_LYR */
     1746
     1747}
Note: See TracChangeset for help on using the changeset viewer.