Просмотр исходного кода

Next part of WMS implementation

Mariusz Muszyński 9 лет назад
Родитель
Сommit
d1e5792d10
1 измененных файлов с 166 добавлено и 19 удалено
  1. 166 19
      SE/se-lib/Route/UrlAction/WmsGenerate.php

+ 166 - 19
SE/se-lib/Route/UrlAction/WmsGenerate.php

@@ -23,6 +23,12 @@ class Route_UrlAction_WmsGenerate extends RouteBase {
 		return $uploader->getDestLocalPath(true);
 	}
 
+	private function getMainDirectory() {
+		$folderConf = FoldersConfig::getAll('WMS_LAYERS_COLUMN');
+		if (!isset($folderConf['mount_point'])) throw new HttpException("Błąd danych konfiguracyjnych" . '<br>' . "\n" . $errMsg, 404);
+		return $folderConf['mount_point'];
+	}
+
 	public function defaultAction() {
 		SE_Layout::gora();
 		SE_Layout::menu();
@@ -70,32 +76,105 @@ class Route_UrlAction_WmsGenerate extends RouteBase {
 	public function doGenerate() {
 
 		try {
+			### Sprawdzenie czy modul WMS jest aktywny na danej instalacji Procesy5
 			$moduleActive=DB::getPDO()->fetchall("select count(*) as cnt from CRM_CONFIG where CONF_KEY='module_WMS' and CONF_VAL='on'");
 			if (!$moduleActive[0]['cnt']) throw new Exception("Module WMS disabled/not installed.");
 
-			$layers=DB::getPDO()->fetchall("select ID,FILE_NAME from WMS_LAYERS where FILE_STATUS='IN_PROGRESS'");
+			### Znalezienie nowo przetworzonych rastrow i ew. oznaczenie map do wygenerowania
+			$wmsDirLocation=$this->getMainDirectory();
+			if (!file_exists($wmsDirLocation.'/.maps/single')) mkdir($wmsDirLocation.'/.maps/single',0755,true);
+			if (!file_exists($wmsDirLocation.'/.maps/single')) throw new Exception('Error during creating maps directory.');
+
+			$mapSchema='MAP
+
+  NAME "__NAME__"
+  STATUS ON
+  SIZE 400 300
+  EXTENT __EXTENT__
+  UNITS METERS
+  IMAGECOLOR 255 255 0
+  IMAGETYPE PNG
+
+  WEB
+    METADATA
+      WMS_TITLE "__NAME__"
+      WMS_ENABLE_REQUEST "*"
+      WMS_ONLINERESOURCE "https://__SERVER_NAME__/wms/single/__ID__"
+      WMS_SRS "EPSG:__EPSG__"
+    END
+  END
+
+  PROJECTION
+    "init=epsg:__EPSG__"
+  END
+
+  LAYER
+    NAME         "__NAME__"
+    STATUS       OFF
+    TYPE         RASTER
+    DATA        "__FILE__"
+    EXTENT      __EXTENT__
+
+    PROJECTION
+      "init=epsg:__EPSG__"
+    END
+
+    METADATA
+      WMS_TITLE "__NAME__"
+      WMS_SRS "EPSG:__EPSG__"
+      WMS_EXTENT "__EXTENT__"
+    END
+  END
+
+END
+';
+			$search=array('__NAME__','__EXTENT__','__SERVER_NAME__','__ID__','__EPSG__','__FILE__');
+
+			$layers=DB::getPDO()->fetchall("select ID,LAYER_NAME,ID_WMS_MAPS,A_STATUS,FILE_NAME from WMS_LAYERS where FILE_STATUS='IN_PROGRESS'");
+			$completed=Array();
 			foreach ($layers as $layer) {
 				if (!file_exists('/tmp/generate_wms-'.$layer['ID'].'.lock')) {
 					unlink('/tmp/generate_wms-'.$layer['ID'].'.sh');
 					$destFolderPath = $this->getDirectory($layer['ID']);
 					if (file_exists($destFolderPath.'/.wms/.completed')) {
-						DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'GENERATED','FILE_STATUS_INFO'=>'Plik przetworzony poprawnie'));
-						unlink($destFolderPath.'/.wms/.completed');
+						if (!file_exists($destFolderPath.'/.wms/.data')) {
+							DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'TO_GENERATE','FILE_STATUS_INFO'=>'Wystąpił błąd prztwarzania, ale nastąpi kolejna próba jego przetworzenia'));
+						} else {
+							$data_arr=explode('|',file_get_contents($destFolderPath.'/.wms/.data'));
+							unlink($destFolderPath.'/.wms/.data');
+							$geom=$data_arr[0];
+							$extent=$data_arr[1];
+							
+							DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'GENERATED','FILE_STATUS_INFO'=>'Plik przetworzony poprawnie','the_geom'=>"GeomFromText('{$geom}')"));
+							unlink($destFolderPath.'/.wms/.completed');
+							if ($layer['A_STATUS']=='NORMAL') $completed[$layer['ID_WMS_MAPS']]=1;
+						}
 					} else {
 						DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'TO_GENERATE','FILE_STATUS_INFO'=>'Wystąpił błąd prztwarzania, ale nastąpi kolejna próba jego przetworzenia'));
 					}
 				}
-				if (count($layers)) $this->mapGenerate();
 			}
+			if ($completed) {
+				foreach ($completed as $ID_WMS_MAPS => $x) {
+					DB::getDB()->UPDATE_OBJ('WMS_MAPS',(object) array('ID'=>$ID_WMS_MAPS,'MAP_STATUS'=>'TO_GENERATE','MAP_STATUS_INFO'=>'Mapa oczekuje na przetworzenie'));
+				}
+			}
+
+
 
 			$bashSchema='
-rm -rf __PATH__/.wms
-mkdir __PATH__/.wms
+#rm -rf __PATH__/.wms
+#mkdir __PATH__/.wms
 lock="/tmp/generate_wms-__ID__.lock"
 touch ${lock}
-
-
-/opt/local/bin/gdal_translate -of GTiff -co "TILED=YES" -co "COMPRESS=DEFLATE" -co "ZLEVEL=9" -co "BIGTIFF=YES" __PATH__/__FILE__ __PATH__/.wms/__FILE__ && /opt/local/bin/gdaladdo -r average __PATH__/.wms/__FILE__ 2 4 8 16 32 64 128
+gdaltindex -t_srs epsg:4326 /tmp/generate_wms-__ID__-shp_wgs84.shp __PATH__/__FILE__ >/dev/null 2>&1
+ogr2ogr -f CSV /tmp/generate_wms-__ID__-shp_wgs84.csv /tmp/generate_wms-__ID__-shp_wgs84.shp -lco GEOMETRY=AS_WKT
+wgs84=`cat /tmp/generate_wms-__ID__-shp_wgs84.csv |tr -d "\n" | cut -d "\"" -f 2`
+gdaltindex /tmp/generate_wms-__ID__-shp_orig.shp __PATH__/__FILE__ >/dev/null 2>&1
+extent=`ogrinfo -al -so /tmp/generate_wms-__ID__-shp_orig.shp | grep Extent | sed "s/[(),\-]//g;s/  / /g;s/Extent: //g"`
+rm -f /tmp/generate_wms-__ID__-shp_*
+echo "${wgs84}|${extent}|" > __PATH__/.wms/.data
+#/opt/local/bin/gdal_translate -of GTiff -co "TILED=YES" -co "COMPRESS=DEFLATE" -co "ZLEVEL=9" -co "BIGTIFF=YES" __PATH__/__FILE__ __PATH__/.wms/__FILE__ && /opt/local/bin/gdaladdo -r average __PATH__/.wms/__FILE__ 2 4 8 16 32 64 128
 rm -f ${lock}
 touch __PATH__/.wms/.completed
 echo "Successfully completed."
@@ -109,7 +188,13 @@ echo "Successfully completed."
 					DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'ERROR','FILE_STATUS_INFO'=>'Wystąpił błąd pliku tif'));
 					throw new Exception("Błąd pliku: ".$layer['FILE_NAME']);
 				}
-				DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'IN_PROGRESS','FILE_STATUS_INFO'=>'Plik w trakcie przetwarzania'));
+				$xml=@simplexml_load_string(shell_exec('gdalsrsinfo -o xml '.$destFolderPath.'/'.$layer['FILE_NAME']));
+				$epsg=$xml->{'gml:srsID'}->{'gml:name'};
+				if (!$epsg) {
+					DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'ERROR','FILE_STATUS_INFO'=>'Wystąpił błąd pliku tif - brak informacji o układzie współrzędnych'));
+					throw new Exception("Błąd pliku: ".$layer['FILE_NAME']);
+				}
+				DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'IN_PROGRESS','FILE_STATUS_INFO'=>'Plik w trakcie przetwarzania','EPSG'=>$epsg));
 				$replace = array($layer['ID'],$destFolderPath,$layer['FILE_NAME']);
 				$bash = str_replace($search,$replace,$bashSchema);
 				file_put_contents('/tmp/generate_wms-'.$layer['ID'].'.sh',$bash);
@@ -131,20 +216,82 @@ echo "Successfully completed."
 		die('OK');
 	}
 
-/*	public function reinstall() {
+	public function reinstall() {
 		$sqlList = array();
 		//$sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_CONFIG`";
 		$sqlList['InstallTable'] = <<<SQL
+CREATE TABLE IF NOT EXISTS `WMS_LAYERS` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `the_geom` polygon NOT NULL,
+  `ID_PROJECT` int(11) NOT NULL,
+  `LAYER_NAME` varchar(100) NOT NULL,
+  `LAYER_DESC` text NOT NULL,
+  `ID_WMS_MAPS` int(11) NOT NULL,
+  `FILE_NAME` varchar(255) NOT NULL,
+  `FILE_STATUS` enum('NONE','TO_GENERATE','IN_PROGRESS','GENERATED','ERROR') NOT NULL DEFAULT 'NONE',
+  `FILE_STATUS_INFO` varchar(255) NOT NULL,
+  `EPSG` int(11) NOT NULL,
+  `A_RECORD_CREATE_DATE` datetime NOT NULL,
+  `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL,
+  `A_RECORD_UPDATE_DATE` varchar(18) NOT NULL,
+  `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL,
+  `L_APPOITMENT_DATE` datetime NOT NULL,
+  `L_APPOITMENT_USER` varchar(40) NOT NULL,
+  `L_APPOITMENT_PERIOD` varchar(30) NOT NULL,
+  `L_APPOITMENT_INFO` varchar(200) NOT NULL,
+  `L_APPOITMENT_TYPE` enum('','ARRANGED','TO_ARRANGE','CANCELLED','TO_CANCEL','RELATE','WAIT') NOT NULL,
+  `A_PROBLEM` enum('','WARNING','PROBLEM','SERIOUS','UNVERIFIED') NOT NULL,
+  `A_PROBLEM_DESC` varchar(200) NOT NULL,
+  `A_PROBLEM_DATE` datetime NOT NULL,
+  `A_STATUS` enum('DELETED','MONITOR','NORMAL','OFF_HARD','OFF_SOFT','WAITING','WARNING') NOT NULL DEFAULT 'WAITING',
+  `A_STATUS_INFO` varchar(100) NOT NULL,
+  `A_STATUS_LASTCHANGE_DATE` datetime NOT NULL,
+  `A_ADM_COMPANY` varchar(100) NOT NULL,
+  `A_CLASSIFIED` varchar(100) NOT NULL,
+  `SYNC_SQIX_STATUS` varchar(100) NOT NULL,
+  PRIMARY KEY (`ID`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+SQL;
 
-CREATE TABLE IF NOT EXISTS `CRM_CONFIG` (
-	`ID` int(11) NOT NULL AUTO_INCREMENT,
-	`CONF_KEY` varchar(64) NOT NULL,
-	`CONF_VAL` text NOT NULL,
-	PRIMARY KEY (`ID`),
-	UNIQUE KEY `CONF_KEY` (`CONF_KEY`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
+                $sqlList['InstallHistTable'] = <<<SQL
+CREATE TABLE IF NOT EXISTS `WMS_LAYERS_HIST` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `ID_USERS2` int(11) NOT NULL,
+  `ID_PROJECT` varchar(20) DEFAULT 'N/S;',
+  `LAYER_NAME` varchar(100) DEFAULT 'N/S;',
+  `LAYER_DESC` varchar(10000) NOT NULL DEFAULT 'N/S;',
+  `ID_WMS_MAPS` varchar(255) DEFAULT 'N/S;',
+  `FILE_NAME` varchar(255) DEFAULT 'N/S;',
+  `FILE_STATUS` varchar(20) DEFAULT 'N/S;',
+  `FILE_STATUS_INFO` varchar(255) DEFAULT 'N/S;',
+  `EPSG` varchar(10) NOT NULL DEFAULT 'N/S;',
+  `A_RECORD_CREATE_DATE` varchar(30) DEFAULT 'N/S;',
+  `A_RECORD_CREATE_AUTHOR` varchar(40) DEFAULT 'N/S;',
+  `A_RECORD_UPDATE_DATE` varchar(18) DEFAULT 'N/S;',
+  `A_RECORD_UPDATE_AUTHOR` varchar(40) DEFAULT 'N/S;',
+  `L_APPOITMENT_DATE` varchar(30) DEFAULT 'N/S;',
+  `L_APPOITMENT_USER` varchar(40) DEFAULT 'N/S;',
+  `L_APPOITMENT_PERIOD` varchar(30) DEFAULT 'N/S;',
+  `L_APPOITMENT_INFO` varchar(200) DEFAULT 'N/S;',
+  `L_APPOITMENT_TYPE` varchar(255) DEFAULT 'N/S;',
+  `A_PROBLEM` varchar(255) DEFAULT 'N/S;',
+  `A_PROBLEM_DESC` varchar(200) DEFAULT 'N/S;',
+  `A_PROBLEM_DATE` varchar(255) DEFAULT 'N/S;',
+  `A_STATUS` varchar(255) DEFAULT 'N/S;',
+  `A_STATUS_INFO` varchar(100) DEFAULT 'N/S;',
+  `A_STATUS_LASTCHANGE_DATE` varchar(255) DEFAULT 'N/S;',
+  `A_ADM_COMPANY` varchar(100) DEFAULT 'N/S;',
+  `A_CLASSIFIED` varchar(100) DEFAULT 'N/S;',
+  `SYNC_SQIX_STATUS` varchar(100) DEFAULT 'N/S;',
+  `the_geom` varchar(255) NOT NULL DEFAULT 'N/S;',
+  PRIMARY KEY (`ID`)
+) ENGINE=MyISAM  DEFAULT CHARSET=latin2;
+SQL;
 
+		$sqlList['ActivateWms'] = <<<SQL
+REPLACE INTO `CRM_CONFIG` (`CONF_KEY`,`CONF_VAL`) VALUES ('module_WMS','on');
 SQL;
+
 		$db = DB::getDB();
 		if ($db->has_errors()) {
 			throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
@@ -156,6 +303,6 @@ SQL;
 			}
 		}
 	}
-*/
+
 
 }