Kaynağa Gözat

Merge branch 'master' of ssh://biuro.biall-net.pl:2222/plabudda/se

Piotr Labudda 9 yıl önce
ebeveyn
işleme
47ef0e5d99
1 değiştirilmiş dosya ile 89 ekleme ve 19 silme
  1. 89 19
      SE/se-lib/Route/UrlAction/WmsGenerate.php

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

@@ -70,9 +70,6 @@ class Route_UrlAction_WmsGenerate extends RouteBase {
 		SE_Layout::dol();
 	}
 
-	private function mapGenerate() {
-	}
-
 	public function doGenerate() {
 
 		try {
@@ -80,10 +77,10 @@ class Route_UrlAction_WmsGenerate extends RouteBase {
 			$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.");
 
-			### Znalezienie nowo przetworzonych rastrow i ew. oznaczenie map do wygenerowania
+			### Znalezienie nowo przetworzonych warstw i utworzenie pojedynczych map do mapserver
 			$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.');
+			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
 
@@ -99,7 +96,7 @@ class Route_UrlAction_WmsGenerate extends RouteBase {
     METADATA
       WMS_TITLE "__NAME__"
       WMS_ENABLE_REQUEST "*"
-      WMS_ONLINERESOURCE "https://__SERVER_NAME__/wms/single/__ID__"
+      WMS_ONLINERESOURCE "https://__SERVER_NAME__/wms/.single/__ID__"
       WMS_SRS "EPSG:__EPSG__"
     END
   END
@@ -130,38 +127,104 @@ 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();
+			$layers=DB::getPDO()->fetchall("select ID,LAYER_NAME,EPSG,ID_WMS_MAPS,A_STATUS,FILE_NAME from WMS_LAYERS where FILE_STATUS='IN_PROGRESS'");
+			$mapsToGenerate=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')) {
-						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'));
+						if (file_exists($destFolderPath.'/.wms/.error')) {
+							DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'ERROR','FILE_STATUS_INFO'=>'Wystąpił błąd przetwarzania, przekaż problem administratorowi systemu'));
+						} elseif (!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 przetwarzania, 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];
-							
+							$replace=array($layer['LAYER_NAME'],$extent,$_SERVER['SERVER_NAME'],$layer['ID'],$layer['EPSG'],$destFolderPath.'/.wms/'.$layer['FILE_NAME']);
+							$map = str_replace($search,$replace,$mapSchema);
+							file_put_contents($destFolderPath.'/.wms/mapserver.map',$map);
 							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;
+							if ($layer['A_STATUS']=='NORMAL') $mapsToGenerate[$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'));
+						DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'FILE_STATUS'=>'TO_GENERATE','FILE_STATUS_INFO'=>'Wystąpił błąd przetwarzania, ale nastąpi kolejna próba jego przetworzenia'));
 					}
 				}
 			}
-			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'));
+
+
+			### Weryfikacja czy jakas aktywna warstwa nie zostala przesunieta do innej mapy
+			$layers=DB::getPDO()->fetchall("select ID,ID_WMS_MAPS,OLD_ID_WMS_MAPS from WMS_LAYERS where MAP_STATUS='ACTIVE' and ID_WMS_MAPS!=OLD_ID_WMS_MAPS");
+			foreach ($layers as $layer) {
+				DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'OLD_ID_WMS_MAPS'=>$layer['ID_WMS_MAPS']));
+				$mapsToGenerate[$layer['ID_WMS_MAPS']]=1;
+				$mapsToGenerate[$layer['OLD_ID_WMS_MAPS']]=1;
+			}
+
+
+			### Aktywacja nieaktywnych warstw, ktore nalezy zaktywowac
+			$layers=DB::getPDO()->fetchall("select ID,ID_WMS_MAPS from WMS_LAYERS where A_STATUS='NORMAL' and FILE_STATUS='GENERATED' and MAP_STATUS='INACTIVE'");
+			foreach ($layers as $layer) {
+				if (!file_exists($wmsDirLocation.'/.maps/.single/'.$layer['ID'].'.map')) symlink($destFolderPath.'/.wms/mapserver.map',$wmsDirLocation.'/.maps/.single/'.$layer['ID'].'.map');
+				DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'MAP_STATUS'=>'ACTIVE'));
+				$mapsToGenerate[$layer['ID_WMS_MAPS']]=1;
+			}
+
+
+			### Dezaktywacja aktywnych warstw, ktore nalezy zdezaktywowac
+			$layers=DB::getPDO()->fetchall("select ID,ID_WMS_MAPS from WMS_LAYERS where MAP_STATUS='ACTIVE' and (A_STATUS!='NORMAL' or FILE_STATUS!='GENERATED')");
+			foreach ($layers as $layer) {
+				if (file_exists($wmsDirLocation.'/.maps/.single/'.$layer['ID'].'.map')) unlink($wmsDirLocation.'/.maps/.single/'.$layer['ID'].'.map');
+				DB::getDB()->UPDATE_OBJ('WMS_LAYERS',(object) array('ID'=>$layer['ID'],'MAP_STATUS'=>'INACTIVE'));
+				$mapsToGenerate[$layer['ID_WMS_MAPS']]=1;
+			}
+
+
+			### Wyszukanie map do wygenerowania
+			$maps=DB::getPDO()->fetchall("select ID from WMS_MAPS where MAP_STATUS='NONE' and A_STATUS='NORMAL'");
+			foreach ($maps as $map) $mapsToGenerate[$map['ID']]=1;
+
+
+			### Oznaczenie map do generowania
+			if ($mapsToGenerate) {
+				foreach ($mapsToGenerate as $ID_WMS_MAPS => $x)
+					$mapsCount=DB::getPDO()->fetchall("select ID from WMS_MAPS where ID='".$ID_WMS_MAPS."' and A_STATUS='NORMAL'");
+					if ($mapsCount)	DB::getDB()->UPDATE_OBJ('WMS_MAPS',(object) array('ID'=>$ID_WMS_MAPS,'MAP_STATUS'=>'TO_GENERATE','MAP_STATUS_INFO'=>'Mapa oczekuje na przetworzenie'));
+			}
+
+
+			### Generowanie map
+			$maps=DB::getPDO()->fetchall("select ID,MAP_NAME,MAP_EPSG,MAP_FILE from WMS_MAPS where MAP_STATUS='TO_GENERATE'");
+			foreach ($maps as $map) {
+				if ($map['MAP_FILE']) unlink($wmsDirLocation.'/.maps/'.$map['MAP_FILE'].'.map');
+				$MAP_FILE=strtolower(V::convert($map['MAP_NAME']));
+				if ($MAP_FILE=="") {
+					DB::getDB()->UPDATE_OBJ('WMS_MAPS',(object) array('ID'=>$ID_WMS_MAPS,'MAP_STATUS'=>'ERROR','MAP_STATUS_INFO'=>'Brak nazwy mapy'));
+				} else {
+					$otherMaps=DB::getPDO()->fetchall("select ID from WMS_MAPS where ID!='".$map['ID']."' and MAP_FILE='".$MAP_FILE."'");
+					if ($otherMaps) {
+						DB::getDB()->UPDATE_OBJ('WMS_MAPS',(object) array('ID'=>$ID_WMS_MAPS,'MAP_STATUS'=>'ERROR','MAP_STATUS_INFO'=>'Nieunikalna nazwa mapy'));
+					} else {
+						file_put_contents($wmsDirLocation.'/.maps/'.$MAP_FILE.'.map','test');
+						DB::getDB()->UPDATE_OBJ('WMS_MAPS',(object) array('ID'=>$ID_WMS_MAPS,'MAP_STATUS'=>'GENERATED','MAP_STATUS_INFO'=>'Mapa wygenerowana poprawnie','MAP_URL'=>'https://'.$_SERVER['SERVER_NAME'].'/wms/'.$MAP_FILE,'MAP_FILE'=>$MAP_FILE));
+					}
 				}
 			}
 
 
+			### Uzunięcie zbędnych map
+			$maps=DB::getPDO()->fetchall("select ID,MAP_FILE from WMS_MAPS where MAP_STATUS='GENERATED' and A_STATUS!='NORMAL'");
+			foreach ($maps as $map) {
+				if (file_exists($wmsDirLocation.'/.maps/'.$map['MAP_FILE'])) unlink($wmsDirLocation.'/.maps/'.$map['MAP_FILE']);
+				DB::getDB()->UPDATE_OBJ('WMS_MAPS',(object) array('ID'=>$ID_WMS_MAPS,'MAP_STATUS'=>'NONE','MAP_STATUS_INFO'=>'Mapa usunięta','MAP_URL'=>'','MAP_FILE'=>''));
+			}
+
 
+			### Wygenerowanie plików tif warstw
 			$bashSchema='
 #rm -rf __PATH__/.wms
 #mkdir __PATH__/.wms
@@ -174,10 +237,17 @@ gdaltindex /tmp/generate_wms-__ID__-shp_orig.shp __PATH__/__FILE__ >/dev/null 2>
 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
+ok=0
+#/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 && ok=1
 rm -f ${lock}
 touch __PATH__/.wms/.completed
-echo "Successfully completed."
+if [ "$ok" -eq 1 ]; then
+	echo "Successfully completed."
+else
+	cp tmp/generate_wms-__ID__.log __PATH__/.wms/.error
+	echo "Error creating tif file."
+fi
+cp tmp/generate_wms-__ID__.log __PATH__/.wms/.test
 ';
 			$search=array('__ID__','__PATH__','__FILE__');