',
'stat'=>'
Nombre de noeud : '.(isset($nb_node_type_data[$params['drupal']['type']])? $nb_node_type_data[$params['drupal']['type']]: '-') .'
',
'action'=>theme('item_list', array('items'=>$actions)),
);
}
$form['referentiels'] = array(
'#markup'=>'
'.theme('table', array('header'=>$header, 'rows'=>$rows, 'sticky'=>true)).'
',
);
}
$form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration') );
$form['#theme'] = 'system_settings_form';
return $form;
}
function xref_config_form_validate($form, &$form_state){
}
function xref_config_form_submit($form, &$form_state){
}
function xref_fiche_valo(){
if (isset($_REQUEST['id']) && $_REQUEST['id'] != '') {
$params = array(
"q" => "id:" . $_REQUEST['id'],
"fl" => array(
"id",
"label",
"ss_libelle_sandre",
"ss_item_code",
"ss_statut_sandre",
//"zs_geo_wkb",
//"zs_item_data",
"path",
"ss_wfs_idcol",
"ss_wfs_typename",
"ss_wfs_service_url",
"is_parent_jdd_id",
'ss_urn_sandre',
'ss_lbref_sandre',
'ss_cdref_sandre',
),
);
$params += apachesolr_search_basic_params();
$query = apachesolr_drupal_query(
"apachesolr_locate",
$params,
'',
'fiche-geo'
);
// This hook allows modules to modify the query and params objects.
drupal_alter('apachesolr_query', $query);
if (!$query) {
return array();
}
$solr_id = $query->solr('getId');
list($final_query, $response) = apachesolr_do_query($query);
apachesolr_has_searched($solr_id, true);
//Generation de la page
$obj = $response->response->docs[0];
if($obj){
/*
dsm($obj);
dsm($obj->ss_wfs_typename);
dsm($obj->ss_item_code);
*/
/*
$wfs_params = array();
$ids=array(
array(
'key'=>$obj->ss_wfs_idcol,
'value'=>$obj->ss_item_code
)
);
$wfs = wfs_getFeatureByIds($obj->ss_wfs_service_url, array('TYPENAME'=>$obj->ss_wfs_typename), $ids);
dsm($wfs);
*/
//$wfs = wfs_getFeature(, $wfs_params);
//'ZoneVuln', 'SsBassinDCEAdmin',
$refB = array('Commune', 'Departement', 'Region', 'Region_2015', 'CircAdminBassin', 'ZoneHydro', 'ZoneSensible', 'EntVigiCru', 'Sage', 'ContratMilieu', 'BassinDCE', 'ZoneProdConchy', 'ZRE', 'AAC', 'PGC');
//$refB = array('Commune', 'Departement', 'Region', 'Region_2015');
$wps_out = wps_oieau_intersectRef_getRef($obj->ss_item_code, trim($obj->ss_wfs_typename), $refB);
//dsm($wps_out);
$out = '
'.$obj->label.'
';
$out.= '
Référentiel :'.$obj->ss_lbref_sandre.'
';
$out.= xref_render_wps_result($wps_out);
return $out;
}
else{
drupal_not_found();
}
}
else {
drupal_not_found();
}
}
function xref_render_wps_result($r){
$output = '';
$list = array();
if(!empty($r)){
foreach($r as $ref=>$items){
if(!empty($items)){
$element =array();
$element[0] = '
'.$ref.'
';
$element['children'] = array();
foreach($items as $item){
$element['children'][0] = $item->libelle.' ['.$item->code.']';
}
$list[] = $element;
}
}
if(!empty($list)){
$output.= theme('item_list', array('items'=>$list));
}
}
return $output;
}
//Formulaire de recherche d'une entité Sandre
function xref_get_entite_sandre_form($form, &$form_state){
$form['#id'] = 'xref_get_entite_sandre';
$form['search-sandre-entity'] = array(
'#type' => 'fieldset',
'#title' => t('Rechercher une entité Sandre'),
'#collapsible' => TRUE, // Added
'#collapsed' => FALSE, // Added
);
$form['search-sandre-entity']['key'] = array(
'#type' => 'textfield',
'#title' => t("Nom de l'entité"),
'#required' => TRUE, // Added
);
$form['search-sandre-entity']['key']['#attributes']['placeholder'] = t( "Nom ou code de l'entité" );
apachesolr_autocomplete_do_alter($form['search-sandre-entity']['key'], $form, 'xref_get_entite_sandre');
$form['search-sandre-entity']['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
return $form;
}
function xref_get_entite_sandre_form_validate($form, &$form_state){
//Do nothing
}
function xref_get_entite_sandre_form_submit($form, &$form_state){
//dsm($form_state);
$path = 'search/site/';
$options = array();
$f=array();
//Génération du chemin
if(isset($form_state['input']['key'])){
$path.=$form_state['input']['key'];
}
//On vire quelques variables qui ne nous serve à rien
unset(
$form_state['input']['key'],
$form_state['input']['op'],
$form_state['input']['form_build_id'],
$form_state['input']['form_token'],
$form_state['input']['form_id']
);
if(!empty($form_state['input'])){
foreach($form_state['input'] as $k=>$v){
if($v!='All') $f[] = $k.':'.$v;
}
}
if(!empty($f)){
$options = array('query' => array('f' => $f));
}
drupal_goto($path,$options);
}
//Permet de lancer un batch d'import d'un référentiel
function xref_import_ref($ref){
if(isset($GLOBALS['referentiels'][$ref])){
if(isset($GLOBALS['referentiels'][$ref]['db'])){
$operations[] = array('xref_import_ref_batch', array('ref'=>$ref));
//Start X operation
$batch = array(
'operations' => $operations,
'finished' => 'xref_import_ref_batch_finish',
'title' => t('Processing Batch'),
'init_message' => t('Batch is starting.'),
'progress_message' => t('Processed @current out of @total.'),
'error_message' => t('XREF Import Batch has encountered an error.'),
'file' => drupal_get_path('module', 'xref') . '/inc/xref.inc',
);
batch_set($batch); //Starting the Batch
batch_process('admin/config/xref');
}
else{
drupal_set_message("Le référentiel $ref n'est pas configuré pour l'import", 'error');
}
}
else{
drupal_set_message("Le référentiel $ref n'est pas configuré", 'error');
}
}
//Batch d'import d'un referentiel
function xref_import_ref_batch($ref, &$context) {
//Info de connexion à la base Sandre
$db_info = $GLOBALS['referentiels'][$ref]['db'];
//Initialisation du batch
if (!isset($context['sandbox']['progress'])) {
//Get list of id
db_set_active('sandre');
$result = db_query("SELECT ".$db_info['Code']." as code, ".$db_info['Libelle']." as libelle FROM ".$db_info['Schema'].".".$db_info['Table']." WHERE ".$db_info['Geom']." IS NOT NULL ORDER BY ".$db_info['Code']." ASC");
db_set_active('default');
$data = $result->fetchAll();
$context['sandbox']['max'] = count($data);
$context['results']['data']['list'] = $data;
unset($data);
$context['sandbox']['progress']=0;
}
//Process
$i=0;
$j= $context['sandbox']['progress'];
$message = '';
while($i<25 && $context['sandbox']['progress']<$context['sandbox']['max']){
$info = $context['results']['data']['list'][$i+$j];
//On tente de recuperer l'objet si'il existe déjà
if($node = xgeo_get_node($GLOBALS['referentiels'][$ref]['drupal']['type'], $info->code, $info->libelle)){
//do nothing
}
else{
$node = new stdclass();
//======================= TODO
}
$obj = xref_import_ref_get_element($ref, $info->code);
if(isset($obj->wkt)){
$node->field_geo['und'][0]=array(
'geom'=>$obj->wkt,
'geo_type'=>$GLOBALS['referentiels'][$ref]['geometrie']
);
if(isset($obj->area)){
$node->field_geo_superficie['und'][0]['value'] = $obj->area/10000; //divise par 10 000 pour revenir en hectares
}
if(isset($obj->length)){
$node->field_geo_longueur['und'][0]['value'] = $obj->length/1000; //divise par 1 000 pour revenir en km
}
}
$node->field_type_sandre['und'][0]['value'] = $ref;
//$node->field_urn_sandre['und'][0]['value'] = '';
//$node->field_wfs_link
node_save($node);
$message .= '
'.l($node->title.' [nid : '.$node->nid.']', 'node/'.$node->nid).'';
$context['sandbox']['progress']++;
$i++;
}
$context['message'] = '
Import "'.$ref.'" '.$context['sandbox']['progress'].' / '.$context['sandbox']['max'].'
';
//Condition d'arret
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
function xref_import_ref_get_element($ref, $code){
$db_info = $GLOBALS['referentiels'][$ref]['db'];
switch($GLOBALS['referentiels'][$ref]['geometrie']){
case 'polygon':
$sql = "SELECT ".$db_info['Code']." as code, st_area(".$db_info['Geom']."::geography) as area, st_astext(st_transform(ST_Simplify(".$db_info['Geom'].", 0.00001), 4326)) as wkt FROM ".$db_info['Schema'].".".$db_info['Table']." WHERE ".$db_info['Code']." = :code ";
break;
case 'multiline':
$sql = "SELECT ".$db_info['Code']." as code, ST_Length(".$db_info['Geom']."::geography) as length, st_astext(st_transform(".$db_info['Geom'].", 4326)) as wkt FROM ".$db_info['Schema'].".".$db_info['Table']." WHERE ".$db_info['Code']." = :code ";
break;
case 'point':
$sql = "SELECT ".$db_info['Code']." as code, st_astext(st_transform(".$db_info['Geom'].", 4326)) as wkt FROM ".$db_info['Schema'].".".$db_info['Table']." WHERE ".$db_info['Code']." = :code ";
break;
default:
exit('ERROR : no geometry type');
}
db_set_active('sandre');
$query = db_query(
$sql,
array(':code'=>$info->code)
);
db_set_active('default');
$obj = $query->fetchObject();
}
//Fonction de fin de process
function xref_import_ref_batch_finish($success, $results, $operations){
if ($success) {
// Here we do something meaningful with the results.
//$message = t('@count items successfully processed:', array('@count' => count($results['log'])));
//$message .= theme('item_list', array('items' => $results['log']));
//drupal_set_message($message);
drupal_set_message("xref_import_ref_batch_finish");
}
else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
$error_operation = reset($operations);
$message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
drupal_set_message($message, 'error');
}
}
//Permet de lancer un batch de calcul WPS pour tout un référentiel
function xref_run_wps_ref_form($form, &$form_state, $ref, $service){
//Id du noeud sur lequel s'applique le traitement
$form['ref'] = array(
'#type'=>'hidden',
'#value'=>$ref
);
$form['service'] = array(
'#type'=>'hidden',
'#value'=>$service
);
if(isset($GLOBALS['referentiels'][$ref])){
$params = $GLOBALS['referentiels'][$ref];
//service XREF
if($service=='xref' && isset($params['services']['xref'])){
$field = $params['services']['xref']['geo_field'];
$refs = xref_wps_getDefaultRef($ref, 'xref');
}
elseif($service=='clc' && isset($params['services']['clc'])){
$field = $params['services']['clc']['geo_field'];
$refs = xref_wps_getDefaultRef($ref, 'clc');
}
elseif($service=='rpg' && isset($params['services']['rpg'])){
$field = $params['services']['rpg']['geo_field'];
$refs = xref_wps_getDefaultRef($ref, 'rpg');
}
//Run process
if(!empty($refs)){
//Ajout du champ de recherche geo
$form['field'] = array(
'#type'=>'hidden',
'#value'=>$field
);
$form['description'] = array(
'#markup'=>"Sélection des paramètre d'execution du service
".$service." sur le champ
".$field." pour le référentiel
".$ref."",
);
$form['refs'] = array(
'#title'=>'Couches de référence',
'#type'=>'checkboxes',
'#options'=>$refs,
'#default_value'=>$refs,
'#checkall' =>'refs-checkboxes'
);
}
}
$form['submit'] = array(
'#type'=>'submit',
'#value'=>'Calculer'
);
return $form;
}
function xref_run_wps_ref_form_validate($form, &$form_state){
//do nothing
}
function xref_run_wps_ref_form_submit($form, &$form_state){
$ref = $form_state['values']['ref'];
$wps = $form_state['values']['service'];
$refs = array_flip($form_state['values']['refs']);
//remove disabled ref
unset($refs[0]);
if(isset($GLOBALS['referentiels'][$ref]) && !empty($refs)){
if($wps == 'xref' && isset($GLOBALS['referentiels'][$ref]['services']['xref'])){
$operations[] = array('xref_run_wps_ref_xref_batch', array('ref'=>$ref, 'refs'=>$refs));
}
if($wps == 'rpg' && isset($GLOBALS['referentiels'][$ref]['services']['rpg'])){
$operations[] = array('xref_run_wps_ref_rpg_batch', array('ref'=>$ref, 'refs'=>$refs));
}
if($wps == 'clc' && isset($GLOBALS['referentiels'][$ref]['services']['clc'])){
$operations[] = array('xref_run_wps_ref_clc_batch', array('ref'=>$ref, 'refs'=>$refs));
}
//Start X operation
if(!empty($operations)){
$batch = array(
'operations' => $operations,
'finished' => 'xref_run_wps_ref_finish',
'title' => t('Processing Batch'),
'init_message' => t('Batch is starting.'),
'progress_message' => t('Processed @current out of @total.'),
'error_message' => t('XREF WPS Batch has encountered an error.'),
'file' => drupal_get_path('module', 'xref') . '/inc/xref.inc',
);
batch_set($batch); //Starting the Batch
batch_process('admin/config/xref');
}
}
else{
drupal_set_message("Le référentiel $ref n'est pas configuré", 'error');
}
drupal_goto('admin/config/xref');
}
//function xref_run_wps_ref_xref_batch($ref, $refs, &$context){
function xref_run_wps_ref_xref_batch($ref, $refs, &$context){
//Initialisation du batch
if (!isset($context['sandbox']['progress'])) {
//Get list of id
$result = db_query(
"
SELECT nid, title
FROM {node}
LEFT JOIN {field_data_field_departement} ON revision_id = vid
WHERE status=1
AND type = :type
AND field_departement_target_id IS NULL
ORDER BY nid DESC
", array(
':type'=>$GLOBALS['referentiels'][$ref]['drupal']['type']
)
);
/*
$result = db_query(
"
SELECT nid, title
FROM {node}
WHERE status=1
AND type = :type
ORDER BY nid
", array(
':type'=>$GLOBALS['referentiels'][$ref]['drupal']['type']
));
*/
$data = $result->fetchAll();
$context['sandbox']['max'] = count($data);
$context['results']['data']['list'] = $data;
unset($data);
$context['sandbox']['progress']=0;
}
//Process
$i=0;
$j= $context['sandbox']['progress'];
$message = '';
$field = $GLOBALS['referentiels'][$ref]['services']['xref']['geo_field'];
$field_info = field_info_field($field);
if(empty($refs)){
$refs = xref_wps_getDefaultRef($ref, 'xref');
}
while($i<3 && $context['sandbox']['progress']<$context['sandbox']['max']){
$info = $context['results']['data']['list'][$i+$j];
if($field && !empty($refs)){
//Si le champ est un geofield
$gml = false;
if($field_info['type']=='geofield'){
if($node = node_load($info->nid)){
if(isset($node->{$field}['und'])){
$gml = xgeo_convertWKTToGML($node->{$field}['und'][0]['geom']);
}
}
}
//Sinon on suppose qu'il s'agit d'un champ postgis
else{
$gml = xref_getGML($info->nid, $field);
}
if($gml){
xref_get_xsandre($info->nid, $gml, $refs);
}
$message .= '
'.l($info->title.' [nid : '.$info->nid.']', 'node/'.$info->nid).'';
}
$context['sandbox']['progress']++;
$i++;
}
$context['message'] = '
WPS XREF "'.$ref.'"
'.$context['sandbox']['progress'].' / '.$context['sandbox']['max'].'
';
//Condition d'arret
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
function xref_run_wps_ref_clc_batch($ref, $refs, &$context){
//Initialisation du batch
if (!isset($context['sandbox']['progress'])) {
//Get list of id
$result = db_query(
"
SELECT nid, title
FROM {node}
WHERE status=1
AND type = :type
ORDER BY nid
", array(
':type'=>$GLOBALS['referentiels'][$ref]['drupal']['type']
));
$data = $result->fetchAll();
$context['sandbox']['max'] = count($data);
$context['results']['data']['list'] = $data;
unset($data);
$context['sandbox']['progress']=0;
}
//Process
$i=0;
$j= $context['sandbox']['progress'];
$message = '';
$field = $GLOBALS['referentiels'][$ref]['services']['clc']['geo_field'];
$field_info = field_info_field($field);
if(empty($refs)){
$refs = xref_wps_getDefaultRef($ref, 'clc');
}
while($i<3 && $context['sandbox']['progress']<$context['sandbox']['max']){
$info = $context['results']['data']['list'][$i+$j];
if($field && !empty($refs)){
//Si le champ est un geofield
if($field_info['type']=='geofield'){
if($node = node_load($info->nid)){
$gml = xgeo_convertWKTToGML($node->{$field}['und'][0]['geom']);
}
}
//Sinon on suppose qu'il s'agit d'un champ postgis
else{
$gml = xref_getGML($info->nid, $field);
}
xref_getOSCLC($info->nid, $gml, $refs);
$message .= '
'.l($info->title.' [nid : '.$info->nid.']', 'node/'.$info->nid).'';
}
$context['sandbox']['progress']++;
$i++;
}
$context['message'] = '
WPS CLC "'.$ref.'"
'.$context['sandbox']['progress'].' / '.$context['sandbox']['max'].'
';
//Condition d'arret
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
function xref_run_wps_ref_rpg_batch($ref, $refs, &$context){
//Initialisation du batch
if (!isset($context['sandbox']['progress'])) {
//Get list of id
$result = db_query(
"
SELECT nid, title
FROM {node}
WHERE status=1
AND type = :type
ORDER BY nid
", array(
':type'=>$GLOBALS['referentiels'][$ref]['drupal']['type']
));
$data = $result->fetchAll();
$context['sandbox']['max'] = count($data);
$context['results']['data']['list'] = $data;
unset($data);
$context['sandbox']['progress']=0;
}
//Process
$i=0;
$j= $context['sandbox']['progress'];
$message = '';
$field = $GLOBALS['referentiels'][$ref]['services']['rpg']['geo_field'];
$field_info = field_info_field($field);
if(empty($refs)){
$refs = xref_wps_getDefaultRef($ref, 'rpg');
}
while($i<5 && $context['sandbox']['progress']<$context['sandbox']['max']){
$info = $context['results']['data']['list'][$i+$j];
if($field && !empty($refs)){
//Si le champ est un geofield
if($field_info['type']=='geofield'){
if($node = node_load($info->nid)){
$gml = xgeo_convertWKTToGML($node->{$field}['und'][0]['geom']);
}
}
//Sinon on suppose qu'il s'agit d'un champ postgis
else{
$gml = xref_getGML($info->nid, $field);
}
xref_getAssolement($info->nid, $gml, $refs);
$message .= '
'.l($info->title.' [nid : '.$info->nid.']', 'node/'.$info->nid).'';
}
$context['sandbox']['progress']++;
$i++;
}
$context['message'] = '
WPS RPG "'.$ref.'"
'.$context['sandbox']['progress'].' / '.$context['sandbox']['max'].'
';
//Condition d'arret
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
//Fonction de fin de process
function xref_run_wps_ref_finish($success, $results, $operations){
if ($success) {
// Here we do something meaningful with the results.
//$message = t('@count items successfully processed:', array('@count' => count($results['log'])));
//$message .= theme('item_list', array('items' => $results['log']));
//drupal_set_message($message);
drupal_set_message("xref_run_wps_ref_finish");
}
else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
$error_operation = reset($operations);
$message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
drupal_set_message($message, 'error');
}
}
//Calcul de l'occupation des sols avec Corine Land Cover
function xref_getOSCLC($nid, $gml, $services=array('clc_2012', 'clc_2006', 'clc_2000')){
$node = node_load($nid, NULL, true);
$wrapper = entity_metadata_wrapper('node', $node);
if(isset($wrapper->field_clc)){
//====================== CLC 2012
if(in_array('clc_2012', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'clc_2012');
$ana_clc_2012 = wps_oieau_CLC_getAnalyse($result['output']);
$layers = $result['output']->layers;
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://clc/'.$node->nid.'_clc_2012.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Corine Land Cover 2012)';
//Set data
$raw_collection = $wrapper->field_clc->value();
if(isset($raw_collection[0])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[0]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_clc'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_clc_version->set('Corine Land Cover 2012');
$fc_wrapper->field_artificial_surfaces->set($ana_clc_2012['coverage']['Surfaces artificialisées']);
$fc_wrapper->field_agricultural_areas->set($ana_clc_2012['coverage']['Zones agricoles']);
$fc_wrapper->field_forest_semi_natural_areas->set($ana_clc_2012['coverage']['Forêt et zones semi-naturelles']);
$fc_wrapper->field_proportion_wetlands->set($ana_clc_2012['coverage']['Zones humides']);
$fc_wrapper->field_proportion_water_bodies->set($ana_clc_2012['coverage']["Masses d'eau"]);
$fc_wrapper->field_clc_illustration->set($file);
$fc_wrapper->field_clc_commentaire->set(array('value'=>$ana_clc_2012['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_clc_data->set(serialize($ana_clc_2012));
$fc_wrapper->save();
}
//Gestion du champ type OS
if(!empty($ana_clc_2012['type_os'])){
$wrapper->field_type_os->set($ana_clc_2012['type_os']);
}
unset($ana_clc_2012);
}
//====================== CLC 2006
if(in_array('clc_2006', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'clc_2006');
$ana_clc_2006 = wps_oieau_CLC_getAnalyse($result['output']);
$layers = $result['output']->layers;
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://clc/'.$node->nid.'_clc_2006.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Corine Land Cover 2006)';
$raw_collection = $wrapper->field_clc->value();
if(isset($raw_collection[1])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[1]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_clc'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_clc_version->set('Corine Land Cover 2006');
$fc_wrapper->field_artificial_surfaces->set($ana_clc_2006['coverage']['Surfaces artificialisées']);
$fc_wrapper->field_agricultural_areas->set($ana_clc_2006['coverage']['Zones agricoles']);
$fc_wrapper->field_forest_semi_natural_areas->set($ana_clc_2006['coverage']['Forêt et zones semi-naturelles']);
$fc_wrapper->field_proportion_wetlands->set($ana_clc_2006['coverage']['Zones humides']);
$fc_wrapper->field_proportion_water_bodies->set($ana_clc_2006['coverage']["Masses d'eau"]);
$fc_wrapper->field_clc_illustration->set($file);
$fc_wrapper->field_clc_commentaire->set(array('value'=>$ana_clc_2006['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_clc_data->set(serialize($ana_clc_2006));
$fc_wrapper->save();
}
unset($ana_clc_2006);
}
//====================== CLC 2000
if(in_array('clc_2000', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'clc_2000');
$ana_clc_2000 = wps_oieau_CLC_getAnalyse($result['output']);
$layers = $result['output']->layers;
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://clc/'.$node->nid.'_clc_2000.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Corine Land Cover 2000)';
$raw_collection = $wrapper->field_clc->value();
if(isset($raw_collection[2])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[2]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_clc'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_clc_version->set('Corine Land Cover 2000');
$fc_wrapper->field_artificial_surfaces->set($ana_clc_2000['coverage']['Surfaces artificialisées']);
$fc_wrapper->field_agricultural_areas->set($ana_clc_2000['coverage']['Zones agricoles']);
$fc_wrapper->field_forest_semi_natural_areas->set($ana_clc_2000['coverage']['Forêt et zones semi-naturelles']);
$fc_wrapper->field_proportion_wetlands->set($ana_clc_2000['coverage']['Zones humides']);
$fc_wrapper->field_proportion_water_bodies->set($ana_clc_2000['coverage']["Masses d'eau"]);
$fc_wrapper->field_clc_illustration->set($file);
$fc_wrapper->field_clc_commentaire->set(array('value'=>$ana_clc_2000['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_clc_data->set(serialize($ana_clc_2000));
$fc_wrapper->save();
}
unset($ana_clc_2000);
}
$wrapper->save();
}
}
//Calcul de l'occupation des sols avec le RPG de niveau 1 en utilisant le WPS OIEau
function xref_getAssolement($nid, $gml, $services=array('rpg_2014','rpg_2013','rpg_2012', 'rpg_2011', 'rpg_2010')){
$node = node_load($nid, NULL, true);
$wrapper = entity_metadata_wrapper('node', $node);
if(isset($wrapper->field_rpg)){
//====================== RPG 2012
if(in_array('rpg_2012', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'rpg_2012');
$ana_rpg = wps_oieau_RPG_getOrientationAgri($result['output'], 2012);
if(!empty($ana_rpg)){
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://rpg/'.$node->nid.'_rpg_2012.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Registre Parcellaire Graphique de niveau 1 version 2012)';
//Set data
$raw_collection = $wrapper->field_rpg->value();
if(isset($raw_collection[0])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[0]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_rpg'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_rpg_version->set('Registre Parcellaire Graphique 2012');
$fc_wrapper->field_rpg_sau->set($ana_rpg['surf_tot']/10000); //pour revenir en hectares
$fc_wrapper->field_rpg_gc->set($ana_rpg['orientations']['Cultures']['coverage_cult_rate']);
$fc_wrapper->field_rpg_pf->set($ana_rpg['orientations']['Prairies et fourrages']['coverage_cult_rate']);
$fc_wrapper->field_rpg_arbo->set($ana_rpg['orientations']['Arboriculture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_viti->set($ana_rpg['orientations']['Viticulture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_marai->set($ana_rpg['orientations']['Maraichage']['coverage_cult_rate']);
$fc_wrapper->field_rpg_autre->set($ana_rpg['orientations']['Autre']['coverage_cult_rate']);
$fc_wrapper->field_rpg_inc->set($ana_rpg['orientations']['Inconnue']['coverage_cult_rate']);
$fc_wrapper->field_rpg_illustration->set($file);
$fc_wrapper->field_rpg_commentaire->set(array('value'=>$ana_rpg['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_rpg_data->set(serialize($ana_rpg));
$fc_wrapper->save();
if(!empty($ana_rpg['orientations_p'])){
if(isset($ana_rpg['orientations_p']['Prairies et fourrages'])){
//On remplace "Prairies et fourrages" par "Élevage"
$ana_rpg['orientations_p']['Élevage'] = $ana_rpg['orientations_p']['Prairies et fourrages'];
unset($ana_rpg['orientations_p']['Prairies et fourrages']);
}
$orientations = array_keys($ana_rpg['orientations_p']);
//dsm($orientations);
$wrapper->field_orientations_agri->set($orientations);
}
}
unset($ana_rpg);
}
}
//====================== RPG 2011
if(in_array('rpg_2011', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'rpg_2011');
$ana_rpg = wps_oieau_RPG_getOrientationAgri($result['output'], 2011);
if(!empty($ana_rpg)){
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://rpg/'.$node->nid.'_rpg_2011.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Registre Parcellaire Graphique de niveau 1 version 2011)';
//Set data
$raw_collection = $wrapper->field_rpg->value();
if(isset($raw_collection[1])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[1]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_rpg'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_rpg_version->set('Registre Parcellaire Graphique 2011');
$fc_wrapper->field_rpg_sau->set($ana_rpg['surf_tot']/10000); //pour revenir en hectares
$fc_wrapper->field_rpg_gc->set($ana_rpg['orientations']['Cultures']['coverage_cult_rate']);
$fc_wrapper->field_rpg_pf->set($ana_rpg['orientations']['Prairies et fourrages']['coverage_cult_rate']);
$fc_wrapper->field_rpg_arbo->set($ana_rpg['orientations']['Arboriculture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_viti->set($ana_rpg['orientations']['Viticulture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_marai->set($ana_rpg['orientations']['Maraichage']['coverage_cult_rate']);
$fc_wrapper->field_rpg_autre->set($ana_rpg['orientations']['Autre']['coverage_cult_rate']);
$fc_wrapper->field_rpg_inc->set($ana_rpg['orientations']['Inconnue']['coverage_cult_rate']);
$fc_wrapper->field_rpg_illustration->set($file);
$fc_wrapper->field_rpg_commentaire->set(array('value'=>$ana_rpg['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_rpg_data->set(serialize($ana_rpg));
$fc_wrapper->save();
}
unset($ana_rpg);
}
}
//====================== RPG 2010
if(in_array('rpg_2010', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'rpg_2010');
$ana_rpg = wps_oieau_RPG_getOrientationAgri($result['output'], 2010);
if(!empty($ana_rpg)){
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://rpg/'.$node->nid.'_rpg_2010.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Registre Parcellaire Graphique de niveau 1 version 2010)';
//Set data
$raw_collection = $wrapper->field_rpg->value();
if(isset($raw_collection[2])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[2]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_rpg'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_rpg_version->set('Registre Parcellaire Graphique 2010');
$fc_wrapper->field_rpg_sau->set($ana_rpg['surf_tot']/10000); //pour revenir en hectares
$fc_wrapper->field_rpg_gc->set($ana_rpg['orientations']['Cultures']['coverage_cult_rate']);
$fc_wrapper->field_rpg_pf->set($ana_rpg['orientations']['Prairies et fourrages']['coverage_cult_rate']);
$fc_wrapper->field_rpg_arbo->set($ana_rpg['orientations']['Arboriculture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_viti->set($ana_rpg['orientations']['Viticulture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_marai->set($ana_rpg['orientations']['Maraichage']['coverage_cult_rate']);
$fc_wrapper->field_rpg_autre->set($ana_rpg['orientations']['Autre']['coverage_cult_rate']);
$fc_wrapper->field_rpg_inc->set($ana_rpg['orientations']['Inconnue']['coverage_cult_rate']);
$fc_wrapper->field_rpg_illustration->set($file);
$fc_wrapper->field_rpg_commentaire->set(array('value'=>$ana_rpg['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_rpg_data->set(serialize($ana_rpg));
$fc_wrapper->save();
}
unset($ana_rpg);
}
}
//====================== RPG 2013
if(in_array('rpg_2013', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'rpg_2013');
$ana_rpg = wps_oieau_RPG_getOrientationAgri($result['output'], 2013);
if(!empty($ana_rpg)){
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://rpg/'.$node->nid.'_rpg_2013.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Registre Parcellaire Graphique de niveau 1 version 2013)';
//Set data
$raw_collection = $wrapper->field_rpg->value();
if(isset($raw_collection[3])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[3]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_rpg'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_rpg_version->set('Registre Parcellaire Graphique 2013');
$fc_wrapper->field_rpg_sau->set($ana_rpg['surf_tot']/10000); //pour revenir en hectares
$fc_wrapper->field_rpg_gc->set($ana_rpg['orientations']['Cultures']['coverage_cult_rate']);
$fc_wrapper->field_rpg_pf->set($ana_rpg['orientations']['Prairies et fourrages']['coverage_cult_rate']);
$fc_wrapper->field_rpg_arbo->set($ana_rpg['orientations']['Arboriculture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_viti->set($ana_rpg['orientations']['Viticulture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_marai->set($ana_rpg['orientations']['Maraichage']['coverage_cult_rate']);
$fc_wrapper->field_rpg_autre->set($ana_rpg['orientations']['Autre']['coverage_cult_rate']);
$fc_wrapper->field_rpg_inc->set($ana_rpg['orientations']['Inconnue']['coverage_cult_rate']);
$fc_wrapper->field_rpg_illustration->set($file);
$fc_wrapper->field_rpg_commentaire->set(array('value'=>$ana_rpg['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_rpg_data->set(serialize($ana_rpg));
$fc_wrapper->save();
}
unset($ana_rpg);
}
}
//====================== RPG 2014
if(in_array('rpg_2014', $services)){
$result = wps_oieau_coverage_getCoverage($gml, 'rpg_2014');
$ana_rpg = wps_oieau_RPG_getOrientationAgri($result['output'], 2014);
if(!empty($ana_rpg)){
$img = file_get_contents( $result['png']->png);
$file = file_save_data($img, 'public://rpg/'.$node->nid.'_rpg_2014.png', FILE_EXISTS_REPLACE);
$file = (array)$file;
$file['title'] = 'Occupation des sols (Registre Parcellaire Graphique de niveau 1 version 2014)';
//Set data
$raw_collection = $wrapper->field_rpg->value();
if(isset($raw_collection[4])){
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection[1]);
}
else{
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_rpg'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
}
if($fc_wrapper){
$fc_wrapper->field_rpg_version->set('Registre Parcellaire Graphique 2014');
$fc_wrapper->field_rpg_sau->set($ana_rpg['surf_tot']/10000); //pour revenir en hectares
$fc_wrapper->field_rpg_gc->set($ana_rpg['orientations']['Cultures']['coverage_cult_rate']);
$fc_wrapper->field_rpg_pf->set($ana_rpg['orientations']['Prairies et fourrages']['coverage_cult_rate']);
$fc_wrapper->field_rpg_arbo->set($ana_rpg['orientations']['Arboriculture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_viti->set($ana_rpg['orientations']['Viticulture']['coverage_cult_rate']);
$fc_wrapper->field_rpg_marai->set($ana_rpg['orientations']['Maraichage']['coverage_cult_rate']);
$fc_wrapper->field_rpg_autre->set($ana_rpg['orientations']['Autre']['coverage_cult_rate']);
$fc_wrapper->field_rpg_inc->set($ana_rpg['orientations']['Inconnue']['coverage_cult_rate']);
$fc_wrapper->field_rpg_illustration->set($file);
$fc_wrapper->field_rpg_commentaire->set(array('value'=>$ana_rpg['analyse'], 'format'=>'full_html'));
$fc_wrapper->field_rpg_data->set(serialize($ana_rpg));
$fc_wrapper->save();
}
unset($ana_rpg);
}
}
$wrapper->save();
}
else{
drupal_set_message("Le champ file_rpg n'existe pas pour le noeud ".$nid, 'error');
}
}
//Fonction de lancement du calcul croisements avec les jeux géo pour 1 noeud (menu contextuel)
/* deprecated ==> now use the form "xref_wps_form"
function xref_run_xref_page($node){
foreach($GLOBALS['referentiels'] as $ref=>$params){
if($params['drupal']['type'] == $node->type){
if(isset($params['services']['xref'])){
$field = $params['services']['xref']['geo_field'];
if(isset($node->{$field}) && !empty($node->{$field})){
$refs = array();
//Get conf
if($params['services']['xref']['ref']=='all'){
$refs = array_combine($GLOBALS['services_defaut_ref']['xref'],$GLOBALS['services_defaut_ref']['xref']);
//remove the current type of the list
unset($refs[$ref]);
$refs = array_flip($refs);
}
elseif(is_array($params['services']['xref']['ref']) && !empty($params['services']['xref']['ref'])){
$refs = array_combine($params['services']['xref']['ref'],$params['services']['xref']['ref']);
}
//Run process
if(!empty($refs)){
xref_get_xsandre($node->nid, $field, $refs);
}
}
}
break;
}
}
drupal_goto('node/'.$node->nid);
}
*/
//field_position_geo
function xref_get_xsandre($nid, $gml, $ref=array()){
if($node = node_load($nid, null, true)){
if($gml && !empty($ref)){
$intersectRef_values = wps_oieau_intersectRef_getRefGeo($gml, $ref);
//Si on obtient une erreur ==> fonction retourne "false"
//il est possibl que la geom soit fausse ou trop complexe pour être passée en GML
//donc on tente avec les référence code/type de l'objet
if(!$intersectRef_values){
$intersectRef_values = wps_oieau_intersectRef_getRef($node->field_code_sandre['und'][0]['value'], $node->field_type_sandre['und'][0]['value'], $ref);
if(!$intersectRef_values){
drupal_set_message("Impossible de calculer le croisement pour le noeud : ".l($node->title, 'node/'.$node->nid) .' - '.implode(', ', $ref), 'error');
}
}
if($intersectRef_values){
$intersectRef = xref_map_cdSandre($intersectRef_values, $ref);
unset($gml, $intersectRef_values);
if(!empty($intersectRef)){
$wrapper = entity_metadata_wrapper('node', $node);
foreach($intersectRef as $ref=>$data){
if(!empty($data['nodes'])){
$field = isset($data['conf']['ref_field'])?$data['conf']['ref_field']:'field_'.$ref;
$wrapper->{$field}->set($data['nodes']);
//dsm($data['nodes']);
}
}
$wrapper->save();
}
}
}
}
}
/*
//Fonction de lancement du calcul d'occupation des sols CLC pour 1 noeud (menu contextuel)
function xref_run_clc_page($node){
if(isset($node->field_geo)){
$gml = xgeo_getGML($node->nid, 'field_geo');
}
elseif(isset($node->field_bv_geo)){
$gml = xgeo_getGML($node->nid, 'field_bv_geo');
}
else{
drupal_set_message("Calcul CLC ko pour ".$node->title);
drupal_goto('node/'.$node->nid);
}
xgeo_getOSCLC($node->nid, $gml);
//xgeo_getOSCLC($node->nid, $gml, array('clc_2000'));
drupal_set_message("Calcul CLC ok pour ".$node->title);
drupal_goto('node/'.$node->nid);
}
*/
/*
//Fonction de lancement du calcul d'occupation des sols RPG pour 1 noeud (menu contextuel)
function xref_run_rpg_page($node){
if(isset($node->field_geo)){
$gml = xgeo_getGML($node->nid, 'field_geo');
}
elseif(isset($node->field_bv_geo)){
$gml = xgeo_getGML($node->nid, 'field_bv_geo');
}
else{
drupal_set_message("Calcul RPG ko pour ".$node->title);
drupal_goto('node/'.$node->nid);
}
//xgeo_getAssolement($node->nid, $gml);
xgeo_getAssolement($node->nid, $gml, array('rpg_2012'));
//xgeo_getAssolement($node->nid, $gml, array('rpg_2011'));
//xgeo_getAssolement($node->nid, $gml, array('rpg_2010'));
drupal_set_message("Calcul RPG ok pour ".$node->title);
drupal_goto('node/'.$node->nid);
}
*/
//Fonction de lancement du calcul du parcourt amont en utilisant le WPS BRGM Carthage
function xref_run_amont_page($node){
$out = xgeo_getAmont($node->nid, 'field_position_geo');
drupal_set_message("Calcul Amont ok pour ".$node->title);
drupal_goto('node/'.$node->nid);
}
//Fonction de lancement du calcul du Bassin versant en utilisant le parcourt amont et les zones hydro
function xref_run_bv_page($node){
$out = xgeo_getBV($node->nid, 'field_amont');
drupal_set_message("Calcul BV ok pour ".$node->title);
drupal_goto('node/'.$node->nid);
}
//Formulaire de selection des referentiels
function xref_wps_form($form, &$form_state, $node, $service){
$form = array();
/*
dsm('xref_wps_form');
dsm($GLOBALS['referentiels']);
dsm($node);
dsm($service);
*/
//Id du noeud sur lequel s'applique le traitement
$form['nid'] = array(
'#type'=>'hidden',
'#value'=>$node->nid
);
$form['service'] = array(
'#type'=>'hidden',
'#value'=>$service
);
$referentiels = xref_map_global_referentiels_bundle();
//foreach($GLOBALS['referentiels'] as $ref=>$params){
//if($params['drupal']['type'] == $node->type){
if(isset($referentiels[$node->type])){
$ref = $referentiels[$node->type]['ref'];
$params = $referentiels[$node->type];
//service XREF
if($service=='wps-xref' && isset($params['services']['xref'])){
$field = $params['services']['xref']['geo_field'];
if(isset($node->{$field}) && !empty($node->{$field})){
$refs = xref_wps_getDefaultRef($ref, 'xref');
}
}
elseif($service=='wps-clc' && isset($params['services']['clc'])){
$field = $params['services']['clc']['geo_field'];
if(isset($node->{$field}) && !empty($node->{$field})){
$refs = xref_wps_getDefaultRef($ref, 'clc');
}
}
elseif($service=='wps-rpg' && isset($params['services']['rpg'])){
$field = $params['services']['rpg']['geo_field'];
if(isset($node->{$field}) && !empty($node->{$field})){
$refs = xref_wps_getDefaultRef($ref, 'rpg');
}
}
//Run process
if(!empty($refs)){
//Ajout du champ de recherche geo
$form['field'] = array(
'#type'=>'hidden',
'#value'=>$field
);
$form['description'] = array(
'#markup'=>"Sélection des paramètre d'execution du service
".$service." sur le champ
".$field." pour l'entité
".$node->title." de type
".$node->type.""
);
$form['refs'] = array(
'#title'=>'Couches de référence',
'#type'=>'checkboxes',
'#options'=>$refs,
'#default_value'=>$refs,
'#checkall' =>'refs-checkboxes'
);
}
}
$form['submit'] = array(
'#type'=>'submit',
'#value'=>'Calculer'
);
return $form;
}
function xref_wps_form_validate($form, &$form_state){
//do nothing
}
function xref_wps_form_submit($form, &$form_state){
$node = node_load($form_state['values']['nid']);
$field = $form_state['values']['field'];
$field_info = field_info_field($field);
//Si le champ est un geofield
if($field_info['type']=='geofield'){
$gml = xref_convertWKTToGML($node->{$field}['und'][0]['geom']);
}
//Sinon on suppose qu'il s'agit d'un champ postgis
else{
$gml = xref_getGML($node->nid, $field);
}
$refs = array_flip($form_state['values']['refs']);
//remove all unselected refs
unset($refs[0]);
if(!empty($refs) && $gml){
if($form_state['values']['service']=="wps-xref"){
xref_get_xsandre($node->nid, $gml, $refs);
}
elseif($form_state['values']['service']=="wps-rpg"){
xref_getAssolement($node->nid, $gml, $refs);
}
elseif($form_state['values']['service']=="wps-clc"){
xref_getOSCLC($node->nid, $gml, $refs);
}
}
drupal_goto('node/'.$form_state['values']['nid']);
}