Hơn

Nhận dữ liệu từ tập lệnh php cho geoJSON TileLayer?

Nhận dữ liệu từ tập lệnh php cho geoJSON TileLayer?


Tôi muốn nhận dữ liệu địa lý dưới dạng geojson cho các yêu cầu lớp lát geojson trong tờ rơi. Tôi thiết lập một lớp geojson như thế này:

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

Tập lệnh php trả lời các yêu cầu và đọc các hình đa giác dưới dạng geojson vớiST_AsGeoJSONtừ postgreSQL.

Mỗi yêu cầu được ánh xạ tới tệp php đó bởi một htaccess thành geo.php.

Tôi có thể xem tất cả các yêu cầu trong Google Chrome trong công cụ dành cho nhà phát triển trên tab mạng. Nó trông giống như:

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

với phản hồi sau:

{"type": "MultiPolygon", "tọa độ": [[[[10.42523568,51.79692078], [10.4301414,51.80612562], [10.43525988,51.82238007], [10.4370354,51.82429887], [10.44274896,51.8235.4397211476.8235.4397211476.8235.4397211476.8235.439721147 ], [10.45402992,51.8089752], [10.45623312,51.80868153], [10.46150892,51.81088257], [10.46547216,51.81090543], [10.466424,51.8089905], [10.46608272,51.80114871948], 10.453924594, 10,9484178172,51.801148719487 [10.4386608,51.79716873], [10.42523568,51.79692078]]], [[10.4174298,51.83180235], [10.42399224,51.83617779], [10.42398648,51.83724978], [[[10.4174298,51.83180235], [10.42399224,51.83617779], [10.42398648,51.83724978], [10.42081272,51.836] ], [10.4398488,51.84357831], [10.44083196,51.83844759], [10.425852,51.83020782], [10.42100424,51.83043291], [10.4174298,51.83180235]]]]}

Đầu ra được tính theo x, y và z dưới dạng thu phóng. Các tham số đó được tính toán và biến đổi bởi hàm sau:

function tileCoord2BBox ($ url) {$ parsed = boom ("/", $ url); $ z = $ đã phân tích cú pháp [3]; $ x = $ đã phân tích cú pháp [4]; $ y = $ đã phân tích cú pháp [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 = array (); $ bbox ['lon1'] = $ lon1; $ bbox ['lat1'] = $ lat1; $ bbox ['lon2'] = $ lon2; $ bbox ['lat2'] = $ lat2; trả lại $ bbox; }

Tham khảo: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

Các giá trị trả về đó được sử dụng trong câu lệnh sql xác định một hộp giới hạn chọn các đa giác nằm trong ô đó. Postgres trả về geojson cho kết quả hình học.

Tôi đã thử nghiệm các câu trả lời với http://geojsonlint.com/ Tất cả đều rất tuyệt.

Nhưng trên bản đồ tờ rơi, tôi chỉ thấy một phần đa giác trên duy nhất một ô. Khi tôi thu phóng hoặc xoay qua bản đồ tờ rơi thì một ô khác sẽ xuất hiện với một phần đa giác.

Trong Tilelayer.geojson.js trên dòng 187 Chrome báo cáo nhiều lỗi với kết quả sau:

Uncaught TypeError: Không thể đọc thuộc tính 'loại' của TileLayer không xác định.GeoJSON.js: 187 L.TileLayer.GeoJSON.L.TileLayer.Ajax.extend.addTileData TileLayer.GeoJSON.js: 187 L.TileLayer.GeoJSON.L. Ajax.extend._tileLoaded TileLayer.GeoJSON.js: 246 (chức năng ẩn danh)

Nó được báo cáo trên dòng này: https://github.com/glenrobertson/leaflet-tilelayer-geojson/blob/master/TileLayer.GeoJSON.js#L187

Tôi nghĩ rằng đầu ra của tôi từ máy chủ là ổn. Tôi sẽ thấy kết quả trên một ô và http://geojsonlint.com/ hiển thị chính xác rằng những dữ liệu đó hợp lệ cho tất cả các yêu cầu khác. Ngoài ra, tất cả các yêu cầu đều có đầu ra hợp lệ.

Tại sao nó vẫn hiển thị lỗi mặc dù tất cả các phản hồi dường như hợp lệ?

Tôi tìm kiếm một ví dụ hoàn chỉnh với mã phía máy khách và máy chủ bằng cách sử dụng lớp geojson và với postgres hoặc tương tự.

Tôi không biết làm thế nào tôi có thể giải quyết vấn đề của tôi.


Tôi đã làm một điều rất giống chỉ là tôi sử dụng plugin geoserver vectortiles. Chức năng biến đổi BBOX của bạn trông ổn. Các lỗi được tạo ra biểu thị điều gì đó ở phản hồi. Chỉ cần đảm bảo rằng bạn chuyển đúng thứ tự BBOX vào câu lệnh sql của mình, tức là$ lon1. ",". $ lat2. ",". $ lon2. ",". $ lat1

Và trong trường hợp của tôi, tôi đã sửa đổi một chút hàm _xhrHandler tại TileLayer.GeoJSON.js chỉ để xử lý đầu ra, bắt đầu từ dòng 17

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

thành một cái gì đó như thế này

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