Example #1
0
MgByteReader* c_RestFetchImage::FetchImage(c_RestUri* HttpRequest,c_CfgDataSource_MapGuide* MapGuideSource
                                  , const std::wstring& MapDefId,MgEnvelope* ZoomTo, const std::wstring& ZoomFactor
                                  , const std::wstring& MapSelectionLayer, const std::wstring& FeatureSource, const std::wstring& FdoClassName
                                  , MgFeatureQueryOptions *QueryOptions
                                  )
{
  
  
  Ptr<c_RestUriRequestParam> query_params = HttpRequest-> GetRequestParam();
  
  //Ptr<c_RestUriPathParam> path_params = HttpRequest-> GetUriPathParameters();
  //STRING filter = path_params->GetParameterValue(D_REST_URI_SEGMENT_MAP_IMAGE_PNG);  
  //Ptr<c_RestRequestParam> filterparams = new c_RestRequestParam();
  //RestUriFilterParser::Parse(filter, filterparams);
  
  Ptr<c_RestMgSiteConnection> mgsiteconn = c_RestMgSiteConnection::Open(MapGuideSource->GetUsername(),MapGuideSource->GetPassword(),MapGuideSource->GetServerIP(),MapGuideSource->GetServerPort());
  
  
  //MgHtmlController controller(mgsiteconn);
  
  // Get the map view commands
  //Ptr<c_RestRequestParam> params = m_hRequest->GetRequestParam();
  //Ptr<MgPropertyCollection> mapViewCommands = params->GetParameters()->GetPropertyCollection();
  //Ptr<MgPropertyCollection> mapViewCommands = filterparams->GetParameters()->GetPropertyCollection();
  
  
  STRING map_resid;
  STRING mapname;
  Ptr<MgMap> map;
  Ptr<MgSelection> selection;
  
  Ptr<MgPropertyCollection> mapviewcommands = new MgPropertyCollection();
  {
    STRING sessionid;
    Ptr<MgSite> mgSite = mgsiteconn->GetSite();
    sessionid = mgSite->CreateSession();
    
    
    //-------------------------------------------------------
    // Create a new Map from MapDefinition in a Session
    //-------------------------------------------------------  
      map = new MgMap();
      Ptr<MgResourceIdentifier> resid_mapdef = new MgResourceIdentifier(MapDefId);
      
     
      mapname = L"KINGREST";
   
      Ptr<MgResourceService> resourceService = dynamic_cast<MgResourceService*>(mgsiteconn->CreateService(MgServiceType::ResourceService));
         
      map->Create(resourceService, resid_mapdef, mapname );  
      // Save the MgMap state
      map_resid = L"Session:" + sessionid + L"//" + mapname + L"." + MgResourceType::Map;
      Ptr<MgResourceIdentifier> resid_map = new MgResourceIdentifier(map_resid);
      map->Save(resourceService,resid_map);
      
      
      selection = new MgSelection(map);
      if( MapSelectionLayer.length()>0 )
      {
        MgResourceIdentifier resId(FeatureSource);
        Ptr<MgFeatureService> service = (MgFeatureService*)(mgsiteconn->CreateService(MgServiceType::FeatureService));
        Ptr<MgFeatureReader> featureReader = service->SelectFeatures(&resId, FdoClassName, QueryOptions);
        
        //Ptr<MgResourceIdentifier> layerresidid = new MgResourceIdentifier(HttpRequest->m_DataLayerConfig->m_MapSelectionLayer);
        //Ptr<MgLayer> layerdef = new  MgLayer(layerid,resourceService);
        Ptr<MgLayerBase> layer;
        Ptr<MgLayerCollection> layers = map->GetLayers();
        
        
        int layerid =layers->IndexOf(MapSelectionLayer);
        if( layerid >= 0 )
        {
          layer = layers->GetItem(layerid);
        }
        //auto_ptr<MdfModel::LayerDefinition> layerdef( MgLayerBase::GetLayerDefinition(resourceService, layerid));         
        selection->AddFeatures(layer,featureReader,0);
        
        featureReader->Close();
      }
      selection->Save(resourceService, mapname);
      
      Ptr<MgReadOnlyLayerCollection> selLayers = selection->GetLayers();
      int sel_layercount = selLayers ? selLayers->GetCount() : 0;
      
      MgStringPropertyCollection* coll_params = query_params->GetParameters();
      
      int dwidth=260;
      int dheight=260;
      int dpi = 96;
      
      STRING strval;
      Ptr<MgStringProperty> prop;
      
      if( coll_params->Contains(L"SETDISPLAYWIDTH" ) )
      {
        
        
        STRING val = coll_params->GetValue(L"SETDISPLAYWIDTH");   
        dwidth = MgUtil::StringToDouble(val);     
        if( dwidth <= 0 ) dwidth=260;
      }
      
      
      
      {
        MgUtil::Int32ToString(dwidth,strval);
        prop = new MgStringProperty(L"SETDISPLAYWIDTH",strval);
        mapviewcommands->Add(prop);
      }
      
      if( coll_params->Contains(L"SETDISPLAYHEIGHT" ) )
      {
        STRING val = coll_params->GetValue(L"SETDISPLAYHEIGHT");   
        dheight = MgUtil::StringToDouble(val);     
        if( dheight <= 0 ) dheight=260;
      }
      
      
      
      {
        MgUtil::Int32ToString(dheight,strval);
        prop = new MgStringProperty(L"SETDISPLAYHEIGHT",strval);
        mapviewcommands->Add(prop);
      }
      
      if( coll_params->Contains(L"SETDISPLAYDPI" ) )
      {
        STRING val = coll_params->GetValue(L"SETDISPLAYDPI");   
        dpi = MgUtil::StringToDouble(val);     
        if( dpi <= 0 ) dpi=96;
      }
      
      
      
      {
        MgUtil::Int32ToString(dpi,strval);
        prop = new MgStringProperty(L"SETDISPLAYDPI",strval);
        mapviewcommands->Add(prop);
      }
      
      Ptr<MgCoordinate> xy1 = ZoomTo->GetLowerLeftCoordinate();
      Ptr<MgCoordinate> xy2 = ZoomTo->GetUpperRightCoordinate();
      
      double cx = ((double)xy1->GetX() + (double)xy2->GetX()) / 2.0;
      double cy = ((double)xy1->GetY() + (double)xy2->GetY()) / 2.0;
      
    
      
      
      MgUtil::DoubleToString(cx,strval);
      prop = new MgStringProperty(L"SETVIEWCENTERX",strval);
      mapviewcommands->Add(prop);
      
      MgUtil::DoubleToString(cy,strval);
      prop = new MgStringProperty(L"SETVIEWCENTERY",strval);
      mapviewcommands->Add(prop);
      
      double zoomfactor=1.3;
      if( coll_params->Contains(L"ZOOMFACTOR" ) )
      {
        STRING val = coll_params->GetValue(L"ZOOMFACTOR");   
        zoomfactor = MgUtil::StringToDouble(val);     
        if( zoomfactor <= 0.0 ) zoomfactor = 1.3;
      }
      else
      {
        if( ZoomFactor.length() > 0 )
        {
          zoomfactor = MgUtil::StringToDouble(ZoomFactor);     
          if( zoomfactor <= 0.0 ) zoomfactor = 1.3;
        }
      }
      
      double scale;
      double mcsH = xy2->GetY() - xy1->GetY();
      double mcsW = xy2->GetX() - xy1->GetX();
      
      mcsH = mcsH * zoomfactor;
      mcsW = mcsW * zoomfactor;
           
      double metersperpixel  = 0.0254 / dpi;
                        
      if (dheight * mcsW > dwidth * mcsH)
          scale = mcsW * map->GetMetersPerUnit() / (dwidth * metersperpixel); // width-limited
      else
          scale = mcsH * map->GetMetersPerUnit() / (dheight * metersperpixel); // height-limited
          
          
      MgUtil::DoubleToString(scale,strval);
      prop = new MgStringProperty(L"SETVIEWSCALE",strval);
      mapviewcommands->Add(prop);
    
  }
  
  Ptr<MgByteReader> mapimage = GetDynamicMapOverlayImage_ViewCommands(mgsiteconn,mapname, MgImageFormats::Png, true,mapviewcommands);
  //Ptr<MgByteReader> mapimage = controller.GetMapImage(map,selection, MgImageFormats::Png, mapviewcommands,true,true);

  // Set the result
  //Ptr<c_RestResult> result;
  //result = HttpResponse.GetResult();
  //result->SetResultObject(mapimage, mapimage->GetMimeType());
  return mapimage;
	
}//end of c_RestFetchImage::FetchImage