Я натолкнулся на стену относительно использования PHP & MySQL с Leaflet API. Я начал с PHP & MYSQL несколько месяцев назад, и я новичок в этой области, но я хочу учиться, поэтому, пожалуйста, дайте мне несколько советов относительно моей проблемы.
Вопрос похож на этот:
Создание GeoJson в php из MySql для использования с JavaScript MapBox API
Итак, я пытаюсь получить маркеры из таблицы MySQL с помощью PHP и визуализировать его с помощью Leaflet API
Сначала я создал MySQL Table с некоторыми данными:
-- phpMyAdmin SQL Dump
-- version 4.4.6
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jan 17, 2016 at 08:36 PM
-- Server version: 5.6.24
-- PHP Version: 5.6.8
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `web_gis`
--
CREATE DATABASE IF NOT EXISTS `web_gis` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `web_gis`;
-- --------------------------------------------------------
--
-- Table structure for table `baza`
--
DROP TABLE IF EXISTS `baza`;
CREATE TABLE IF NOT EXISTS `baza` (
`id` int(11) NOT NULL,
`operator` varchar(100) NOT NULL,
`lokacija` varchar(100) NOT NULL,
`x` float NOT NULL,
`y` float NOT NULL,
`prijavljen` date NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
--
-- Dumping data for table `baza`
--
INSERT INTO `baza` (`id`, `operator`, `lokacija`, `x`, `y`, `prijavljen`) VALUES
(1, 'Tele 2', 'OiV stup Hum na Sutli', 46.2135, 15.672, '2016-01-14'),
(2, 'T-Mobile HR', 'OiV stup Straža', 46.2179, 15.6999, '2016-01-03'),
(3, 'T-Mobile HR', 'Lupinjak', 46.2016, 15.7412, '2016-01-23'),
(4, 'T-Mobile HR', 'Klenovec Humski 89\\1', 46.2169, 15.7268, '2016-01-01');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `baza`
--
ALTER TABLE `baza`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `baza`
--
ALTER TABLE `baza`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Далее вот мой PHP (bazneStanice_geojson.php) код, который я скопировал с этого сайта и немного подправил (изменил название базы, чтобы быть более точным):
https://github.com/bmcbride/PHP-Database-GeoJSON/blob/master/simple_points/mysql_points_geojson.php
<?php
/**
* Title: SQLite to GeoJSON (Requires https://github.com/phayes/geoPHP)
* Notes: Query a SQLite table or view (with a WKB GEOMETRY field) and return the results in GeoJSON format, suitable for use in OpenLayers, Leaflet, etc. Use QGIS to OGR to convert your GIS data to SQLite.
* Author: Bryan R. McBride, GISP
* Contact: bryanmcbride.com
* GitHub: https://github.com/bmcbride/PHP-Database-GeoJSON
*/# Connect to SQLite database
$conn = new PDO('mysql:host=localhost;dbname=web_gis','neven','gis');
# Build SQL SELECT statement and return the geometry as a GeoJSON element
$sql = 'SELECT *, x AS x, y AS y FROM baza';# Try query or error
$rs = $conn->query($sql);
if (!$rs) {
echo 'An SQL error occured.\n';
exit;
}
# Build GeoJSON feature collection array
$geojson = array(
'type' => 'FeatureCollection',
'features' => array()
);
# Loop through rows to build feature arrays
while ($row = $rs->fetch(PDO::FETCH_ASSOC)) {
$properties = $row;
# Remove x and y fields from properties (optional)
unset($properties['x']);
unset($properties['y']);
$feature = array(
'type' => 'Feature',
'geometry' => array(
'type' => 'Point',
'coordinates' => array(
$row['x'],
$row['y']
)
),
'properties' => $properties
);
# Add feature arrays to feature collection array
array_push($geojson['features'], $feature);
}
header('Content-type: application/json');
echo json_encode($geojson, JSON_NUMERIC_CHECK);
$conn = NULL;
// print_r($geojson);
?>
А вот и скрипт блока кода. (skripta_mysql.js) Я должен указать, что я успешно отрисовал карту, и мне не хватает только точек / маркеров из таблицы MySQL.
var karta = L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6IjZjNmRjNzk3ZmE2MTcwOTEwMGY0MzU3YjUzOWFmNWZhIn0.Y8bhBaUMqFiPrDRW9hieoQ', {
maxZoom: 18,
attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="http://mapbox.com">Mapbox</a>',
id: 'mapbox.streets'
});
bazne_stanice = new L.geoJson(null, {
pointToLayer: function (feature, latlng) {
return L.marker(latlng, {
});
},
onEachFeature: function (feature, layer) {
if (feature.properties) {
var content = '<table border="1" style="border-collapse:collapse;" cellpadding="2">' +
'<tr>' + '<th>ID</th>' + '<td>' + feature.properties.operator + '</td>' + '</tr>' +
'<tr>' + '<th>Name</th>' + '<td>' + feature.properties.lokacija + '</td>' + '</tr>' +
'<tr>' + '<th>Address</th>' + '<td>' + feature.properties.y + '</td>' + '</tr>' +
'<tr>' + '<th>Town</th>' + '<td>' + feature.properties.prijavljen + '</td>' + '</tr>' +
'<table>';
layer.bindPopup(content);}}
});
$.getJSON("bazneStanice_geojson.php", function (data) {
bazne_stanice.addData(data);
});
var map = L.map('map', {
center: [46.15796, 15.75336],
zoom: 9,
layers: [karta, bazne_stanice]
});
var baseLayers = {
"Podloga": karta
};
var overlays = {
"Bazne stanice": bazne_stanice
};
L.control.layers(baseLayers, overlays).addTo(map);
Когда я печатаю переменную $ geojson; из кода PHP я получаю массив, как это
Array
(
[type] => FeatureCollection
[features] => Array
(
[0] => Array
(
[type] => Feature
[geometry] => Array
(
[type] => Point
[coordinates] => Array
(
[0] => 46.2135
[1] => 15.672
)
)
[properties] => Array
(
[id] => 4
[operator] => Tele 2
[lokacija] => OiV stup Hum na Sutli
[prijavljen] => 2016-01-14
)
)....
Честно говоря, я немного запутался. Я действительно не знаю, что я пропускаю, следил за всем, шаг за шагом, но все еще без каких-либо меток удачи Это проблема в $geojson
переменная?
Должен ли я получать комбинированные координаты в строке [0]?
Что-то вроде этого?
[coordinates] => Array
(
[0] => 46.2135, 15.672
)
============================
ОБНОВИТЬ:
Когда я пытаюсь эхо
echo json_encode($geojson, JSON_NUMERIC_CHECK);
Я не получил никаких результатов
и я должен получить что-то вроде этого, если я не ошибаюсь
{ "type": "Feature", "properties": { "Operator": "T-Mobile HR", "Lokacija": "Poljana Sutlanska 8, Zagorska Sela", "Prijavljen": "21.12.2010.", "Odjavljeno": null }, "geometry": { "type": "Point", "coordinates": [ 431501.48819855711, 5110280.408429144 ] } }
Я нашел решение своей проблемы. Проблема была в символах (č, ž, š, ć, đ ..), и если какой-либо атрибут имел один из символов, этот код не работал бы:
echo json_encode($geojson, JSON_NUMERIC_CHECK);
Чтобы предотвратить взлом кода, мне пришлось установить UTF-8 на соединение PDO, чтобы проверить, является ли строка базы данных UTF-8.
Вместо этого:
$conn = new PDO('mysql:host=localhost;dbname=web_gis','neven','gis');
Итак, я вставил что-то вроде этого:
$conn = new PDO('mysql:host=localhost;dbname=web_gis;charset=utf8','neven','gis',array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
и это сработало как шарм.
Надеюсь, поможет!
Других решений пока нет …