Más

¿Está recibiendo datos del script php para geoJSON TileLayer?


Quiero obtener datos geográficos como geojson para las solicitudes de capa de mosaico geojson en el folleto. Configuré una capa geojson como esta:

https://github.com/glenrobertson/leaflet-tilelayer-geojson/

Un script php responde a las solicitudes y lee las geometrías de polígono como geojson conST_AsGeoJSONde postgreSQL.

Cada solicitud se asigna a esos archivos php mediante un htaccess a geo.php.

Puedo ver todas las solicitudes en Google Chrome en las herramientas para desarrolladores en la pestaña de red. Parece que:

… /Geo.php/12/2165/1356.json

con la siguiente respuesta:

{"tipo": "MultiPolygon", "coordenadas": [[[[10.42523568,51.79692078], [10.4301414,51.80612562], [10.43525988,51.82238007], [10.4370354,51.82429887], [10.44274896,51.82429887], [10.44274896,51.822047] ], [10.45402992,51.8089752], [10.45623312,51.80868153], [10.46150892,51.81088257], [10.46547216,51.81090543], [10.466424,51.8089905], [10.46608272,51.8089905], [10.46608272,51.8089905], [10.46608272,51. [10.4386608,51.79716873], [10.42523568,51.79692078]]], [[[10.4174298,51.83180235], [10.42399224,51.83617779], [10.42398648,51.83724978], [10.42081272,51.83724978], [10.42081272,51.445] ], [10.4398488,51.84357831], [10.44083196,51.83844759], [10.425852,51.83020782], [10.42100424,51.83043291], [10.4174298,51.83180235]]]]}

La salida se calcula mediante x, y y z como zoom. Estos parámetros son calculados y transformados por la siguiente función:

function tileCoord2BBox ($ url) {$ analizado = explotar ("/", $ url); $ z = $ analizado [3]; $ x = $ analizado [4]; $ y = $ analizado [5]; $ n = pow (2, $ z); $ lon1 = $ x / $ n * 360.0 - 180.0; $ lat1 = rad2deg (atan (sinh (pi () * (1-2 * $ y / $ n)))); $ lon2 = ($ x + 1) / $ n * 360.0 - 180.0; $ lat2 = rad2deg (atan (sinh (pi () * (1-2 * ($ y + 1) / $ n)))); $ bbox = matriz (); $ bbox ['lon1'] = $ lon1; $ bbox ['lat1'] = $ lat1; $ bbox ['lon2'] = $ lon2; $ bbox ['lat2'] = $ lat2; return $ bbox; }

Referencia: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

Esos valores de retorno se utilizan en la declaración sql que define un cuadro delimitador que selecciona los polígonos que están en ese mosaico. Postgres devuelve geojson para la geometría resultante.

Probé las respuestas con http://geojsonlint.com/ Todas se ven geniales.

Pero en el mapa del folleto, solo veo un polígono parcial en un solo mosaico. Cuando hago zoom o paneo sobre el mapa del folleto, aparece otro mosaico con un polígono parcial.

En tilelayer.geojson.js en la línea 187, Chrome informa muchos errores con el siguiente resultado:

Error de tipo no detectado: no se puede leer la propiedad 'tipo' de TileLayer.GeoJSON.js: 187 L.TileLayer.GeoJSON.L.TileLayer.Ajax.extend.addTileData TileLayer.GeoJSON.js: 187 L. Ajax.extend._tileLoaded TileLayer.GeoJSON.js: 246 (función anónima)

Se informa en esta línea: https://github.com/glenrobertson/leaflet-tilelayer-geojson/blob/master/TileLayer.GeoJSON.js#L187

Creo que mi salida del servidor está bien. Veré un resultado en un mosaico y http://geojsonlint.com/ muestra correctamente que esos datos son válidos para todas las demás solicitudes. Además, todas las solicitudes tienen una salida válida.

¿Por qué sigue mostrando un error a pesar de que todas las respuestas parecen ser válidas?

Busco un ejemplo completo con código del lado del cliente y del servidor usando una capa geojson y con postgres o similar.

No sé cómo puedo solucionar mi problema.


He hecho algo muy similar solo que uso el complemento geoserver vectortiles. Su función de transformación BBOX se ve bien. Los errores generados denotan algo en la respuesta. Solo asegúrese de pasar el orden BBOX correcto a su declaración sql, es decir,$ lon1. ",". $ lat2. ",". $ lon2. ",". $ lat1

Y en mi caso, modifiqué ligeramente la función _xhrHandler en TileLayer.GeoJSON.js solo para lidiar con la salida, comience desde la línea 17

if ((s> = 200 && s <300 && s! = 204) || s === 304) {tile.datum = JSON.parse (req.responseText); layer._tileLoaded (mosaico, tilePoint); } else {layer._tileLoaded (mosaico, tilePoint); }

en algo como esto

if ((s> = 200 && s <300 && s! = 204) || s === 304) {if (req.responseText = "") return; if (req.responseText == null && req.responseText == undefined) return; intente {tile.datum = JSON.parse (req.responseText); layer._tileLoaded (mosaico, tilePoint); } catch (err) {//console.log(err); }} else {layer._tileLoaded (mosaico, tilePoint); }