1313use function array_map ;
1414use function defined ;
1515use function explode ;
16+ use function json_encode ;
1617use function mb_strripos ;
1718use function mb_substr ;
1819use function mt_getrandmax ;
@@ -252,7 +253,7 @@ private function extractPointsInternal(string $point_set, array|null $scale_data
252253 *
253254 * @return float[][] scaled points
254255 */
255- protected function extractPoints (string $ wktCoords , array |null $ scale_data ): array
256+ protected function extractPoints1d (string $ wktCoords , array |null $ scale_data ): array
256257 {
257258 /** @var float[][] $points_arr */
258259 $ points_arr = $ this ->extractPointsInternal ($ wktCoords , $ scale_data , false );
@@ -268,7 +269,7 @@ protected function extractPoints(string $wktCoords, array|null $scale_data): arr
268269 *
269270 * @return float[] scaled points
270271 */
271- protected function extractPointsLinear (string $ wktCoords , array |null $ scale_data ): array
272+ protected function extractPoints1dLinear (string $ wktCoords , array |null $ scale_data ): array
272273 {
273274 /** @var float[] $points_arr */
274275 $ points_arr = $ this ->extractPointsInternal ($ wktCoords , $ scale_data , true );
@@ -277,121 +278,56 @@ protected function extractPointsLinear(string $wktCoords, array|null $scale_data
277278 }
278279
279280 /**
280- * Generates JavaScript for adding an array of polygons to OpenLayers.
281- *
282- * @param array $polygons x and y coordinates for each polygon
283- * @param int $srid spatial reference id
281+ * @param string $wktCoords string of ),( separated points
282+ * @param array|null $scale_data data related to scaling
284283 *
285- * @return string JavaScript for adding an array of polygons to OpenLayers
284+ * @return float[][][] scaled points
286285 */
287- protected function getPolygonArrayForOpenLayers ( array $ polygons , int $ srid ): string
286+ protected function extractPoints2d ( string $ wktCoords , array | null $ scale_data ): array
288287 {
289- $ ol_array = 'var polygonArray = []; ' ;
290- foreach ($ polygons as $ polygon ) {
291- $ rings = explode ('),( ' , $ polygon );
292- $ ol_array .= $ this ->getPolygonForOpenLayers ($ rings , $ srid );
293- $ ol_array .= 'polygonArray.push(polygon); ' ;
294- }
288+ $ parts = explode ('),( ' , $ wktCoords );
295289
296- return $ ol_array ;
290+ return array_map (function ($ coord ) use ($ scale_data ) {
291+ return $ this ->extractPoints1d ($ coord , $ scale_data );
292+ }, $ parts );
297293 }
298294
299295 /**
300- * Generates JavaScript for adding points for OpenLayers polygon.
301- *
302- * @param array $polygon x and y coordinates for each line
303- * @param int $srid spatial reference id
296+ * @param string $wktCoords string of )),(( separated points
297+ * @param array|null $scale_data data related to scaling
304298 *
305- * @return string JavaScript for adding points for OpenLayers polygon
299+ * @return float[][][][] scaled points
306300 */
307- protected function getPolygonForOpenLayers ( array $ polygon , int $ srid ): string
301+ protected function extractPoints3d ( string $ wktCoords , array | null $ scale_data ): array
308302 {
309- return $ this ->getLineArrayForOpenLayers ($ polygon , $ srid , false )
310- . 'var polygon = new ol.geom.Polygon(arr); ' ;
311- }
312-
313- /**
314- * Generates JavaScript for adding an array of LineString
315- * or LineRing to OpenLayers.
316- *
317- * @param array $lines x and y coordinates for each line
318- * @param int $srid spatial reference id
319- * @param bool $is_line_string whether it's an array of LineString
320- *
321- * @return string JavaScript for adding an array of LineString
322- * or LineRing to OpenLayers
323- */
324- protected function getLineArrayForOpenLayers (
325- array $ lines ,
326- int $ srid ,
327- $ is_line_string = true ,
328- ): string {
329- $ ol_array = 'var arr = []; ' ;
330- foreach ($ lines as $ line ) {
331- $ ol_array .= 'var lineArr = []; ' ;
332- $ points_arr = $ this ->extractPoints ($ line , null );
333- $ ol_array .= 'var line = ' . $ this ->getLineForOpenLayers ($ points_arr , $ srid , $ is_line_string ) . '; ' ;
334- $ ol_array .= 'var coord = line.getCoordinates(); ' ;
335- $ ol_array .= 'for (var i = 0; i < coord.length; i++) lineArr.push(coord[i]); ' ;
336- $ ol_array .= 'arr.push(lineArr); ' ;
337- }
303+ $ parts = explode (')),(( ' , $ wktCoords );
338304
339- return $ ol_array ;
305+ return array_map (function ($ coord ) use ($ scale_data ) {
306+ return $ this ->extractPoints2d ($ coord , $ scale_data );
307+ }, $ parts );
340308 }
341309
342310 /**
343- * Generates JavaScript for adding a LineString or LineRing to OpenLayers.
344- *
345- * @param array $points_arr x and y coordinates for each point
346- * @param int $srid spatial reference id
347- * @param bool $is_line_string whether it's a LineString
348- *
349- * @return string JavaScript for adding a LineString or LineRing to OpenLayers
311+ * @param string $constructor
312+ * OpenLayers geometry constructor string
313+ * @param float[]|float[][]|float[][][]|float[][][][] $coordinates
314+ * Array of coordintes 1-4 dimensions
350315 */
351- protected function getLineForOpenLayers (
352- array $ points_arr ,
353- int $ srid ,
354- $ is_line_string = true ,
355- ): string {
356- return 'new ol.geom. '
357- . ($ is_line_string ? 'LineString ' : 'LinearRing ' ) . '( '
358- . $ this ->getPointsArrayForOpenLayers ($ points_arr , $ srid )
359- . ') ' ;
360- }
361-
362- /**
363- * Generates JavaScript for adding an array of points to OpenLayers.
364- *
365- * @param array $points_arr x and y coordinates for each point
366- * @param int $srid spatial reference id
367- *
368- * @return string JavaScript for adding an array of points to OpenLayers
369- */
370- protected function getPointsArrayForOpenLayers (array $ points_arr , int $ srid ): string
316+ protected function toOpenLayersObject (string $ constructor , array $ coordinates , int $ srid ): string
371317 {
372- $ ol_array = 'new Array( ' ;
373- foreach ($ points_arr as $ point ) {
374- $ ol_array .= $ this -> getPointForOpenLayers ( $ point , $ srid ) . '.getCoordinates(), ' ;
318+ $ ol = 'new ' . $ constructor . ' ( ' . json_encode ( $ coordinates ) . ' ) ' ;
319+ if ($ srid != 3857 ) {
320+ $ ol .= ' .transform( \' EPSG: ' . ( $ srid ?: 4326 ) . '\' , \' EPSG:3857 \' ) ' ;
375321 }
376322
377- $ ol_array = mb_substr ($ ol_array , 0 , -2 );
378-
379- return $ ol_array . ') ' ;
323+ return $ ol ;
380324 }
381325
382- /**
383- * Generates JavaScript for adding a point to OpenLayers.
384- *
385- * @param array $point array containing the x and y coordinates of the point
386- * @param int $srid spatial reference id
387- *
388- * @return string JavaScript for adding points to OpenLayers
389- */
390- protected function getPointForOpenLayers (array $ point , int $ srid ): string
326+ protected function addGeometryToLayer (string $ olGeometry , string $ style ): string
391327 {
392- return '( new ol.geom.Point([ ' . $ point [ 0 ] . ', ' . $ point [ 1 ] . ' ]) '
393- . '.transform(ol.proj.get("EPSG: ' . $ srid . '") '
394- . ', ol.proj.get( \' EPSG:3857 \' ))) ' ;
328+ return 'var feature = new ol.Feature( ' . $ olGeometry . '); '
329+ . 'feature.setStyle( ' . $ style . '); '
330+ . 'vectorSource.addFeature(feature); ' ;
395331 }
396332
397333 protected function getRandomId (): int
0 commit comments