从文件加载 GeoJSON
Load GeoJSON from file
首先要说的是,我正在尝试学习 Openlayers,我正在使用 6.4.3 版本。我想从 postgresql 查询生成的文件加载 GeoJON,我将数据发送到查询,我执行它并生成一个 .json 文件(GeoJSON)。好的,问题是当我想在地图上加载文件时。正如我现在所做的那样,它已经向我显示了地图上加载的文件,我想在 select html select 中的某些内容时加载它。正如我所说,它显示我已经加载,我做了一个 select,我 运行 查询并清除了地图,直到我重新加载页面,我才看到新数据。
var vectorData = new ol.source.Vector({
//url: 'data/data.json',
projection: 'EPSG:3857',
format: new ol.format.GeoJSON(),
});
var vectorlayer = new ol.layer.Vector({
source: vectorData,
visible:true,
displayInLayerSwitcher: false,
style: styleFunction,
});
fetch('data/data.json')
.then(function (response) {
return response.json();
})
.then(function (json) {
var features = new ol.format.GeoJSON().readFeatures(json, {dataProjection: 'EPSG:3857', featureProjection: 'EPSG:3857'});
vectorData.addFeatures(features);
//map.getView().fit(vectorData.getExtent());//zoom to
//vectorData.refresh();
});
一旦我 运行 它,除了在地图上加载数据外,我还想缩放数据,现在 getExtent (正在评论)使它出现在缩放的开头打开地图时的数据。
我试着把 vectorData.refresh ();在将数据发送到执行查询的 php 文件的脚本中,但它不起作用。
function search(){
var data = document.getElementById("formData");
object = document.getElementById('data');
var txt='';
txt = "\""+object.value+"\"";
url_object = 'data='+txt;
xhr(url_object);
}
var xmlhttp;
function xhr(formParcel){
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = RespuestaModel;
xmlhttp.open("POST", "DataConsult.php", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(formParcel);
}
function RespuestaModel(){
if(xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
vectorData.refresh();
}
}
}
我解决了。
Loader 没有收到 Post 发送的数据。因此,现在我进行查询的页面以 json 格式接收数据。我还从地图层数组中删除了 vecLayer,稍后将其添加到地图中,因为 vecLayer 不存在。
我把它全部放在一个函数中,现在它可以工作了。 我必须调整
map.getView()。 fit(vectorParcels.getExtent());因为它放大对我来说太大了,如果我想可视化的多边形很大,它不会抓住地图容器 div.
DataParcel.php
...
$params = json_decode(file_get_contents('php://input'), true);
$parcel = $params["parcel"];
...
带有加载器方法的 OL 脚本
function drawParcel(parcelId){
var vectorParcels = new ol.source.Vector({
format: new ol.format.GeoJSON(),
loader: function(extent, resolution, projection) {
var proj = projection.getCode();
var url = "functionsPHP/DataParcel.php"
var xhr = new XMLHttpRequest();
var params = {
parcel: parcelId
}
xhr.open('POST', url);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
var onError = function() {
vectorParcels.removeLoadedExtent(extent);
}
xhr.onerror = onError;
xhr.onload = function() {
xhr.responseText;
console.log(xhr.responseText);
if (xhr.status == 200) {
vectorParcels.addFeatures(
vectorParcels.getFormat().readFeatures(xhr.responseText));
map.getView().fit(vectorParcels.getExtent());
$("#formParcel")[0].reset();
} else {
onError();
}
}
xhr.send(JSON.stringify(params));
},
});
var vectorlayer = new ol.layer.Vector({
source:vectorParcels,
visible:true,
displayInLayerSwitcher: false,
style: styleFunction,
});
map.addLayer(vectorlayer)
}
首先要说的是,我正在尝试学习 Openlayers,我正在使用 6.4.3 版本。我想从 postgresql 查询生成的文件加载 GeoJON,我将数据发送到查询,我执行它并生成一个 .json 文件(GeoJSON)。好的,问题是当我想在地图上加载文件时。正如我现在所做的那样,它已经向我显示了地图上加载的文件,我想在 select html select 中的某些内容时加载它。正如我所说,它显示我已经加载,我做了一个 select,我 运行 查询并清除了地图,直到我重新加载页面,我才看到新数据。
var vectorData = new ol.source.Vector({
//url: 'data/data.json',
projection: 'EPSG:3857',
format: new ol.format.GeoJSON(),
});
var vectorlayer = new ol.layer.Vector({
source: vectorData,
visible:true,
displayInLayerSwitcher: false,
style: styleFunction,
});
fetch('data/data.json')
.then(function (response) {
return response.json();
})
.then(function (json) {
var features = new ol.format.GeoJSON().readFeatures(json, {dataProjection: 'EPSG:3857', featureProjection: 'EPSG:3857'});
vectorData.addFeatures(features);
//map.getView().fit(vectorData.getExtent());//zoom to
//vectorData.refresh();
});
一旦我 运行 它,除了在地图上加载数据外,我还想缩放数据,现在 getExtent (正在评论)使它出现在缩放的开头打开地图时的数据。 我试着把 vectorData.refresh ();在将数据发送到执行查询的 php 文件的脚本中,但它不起作用。
function search(){
var data = document.getElementById("formData");
object = document.getElementById('data');
var txt='';
txt = "\""+object.value+"\"";
url_object = 'data='+txt;
xhr(url_object);
}
var xmlhttp;
function xhr(formParcel){
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = RespuestaModel;
xmlhttp.open("POST", "DataConsult.php", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(formParcel);
}
function RespuestaModel(){
if(xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
vectorData.refresh();
}
}
}
我解决了。 Loader 没有收到 Post 发送的数据。因此,现在我进行查询的页面以 json 格式接收数据。我还从地图层数组中删除了 vecLayer,稍后将其添加到地图中,因为 vecLayer 不存在。 我把它全部放在一个函数中,现在它可以工作了。 我必须调整 map.getView()。 fit(vectorParcels.getExtent());因为它放大对我来说太大了,如果我想可视化的多边形很大,它不会抓住地图容器 div.
DataParcel.php
...
$params = json_decode(file_get_contents('php://input'), true);
$parcel = $params["parcel"];
...
带有加载器方法的 OL 脚本
function drawParcel(parcelId){
var vectorParcels = new ol.source.Vector({
format: new ol.format.GeoJSON(),
loader: function(extent, resolution, projection) {
var proj = projection.getCode();
var url = "functionsPHP/DataParcel.php"
var xhr = new XMLHttpRequest();
var params = {
parcel: parcelId
}
xhr.open('POST', url);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
var onError = function() {
vectorParcels.removeLoadedExtent(extent);
}
xhr.onerror = onError;
xhr.onload = function() {
xhr.responseText;
console.log(xhr.responseText);
if (xhr.status == 200) {
vectorParcels.addFeatures(
vectorParcels.getFormat().readFeatures(xhr.responseText));
map.getView().fit(vectorParcels.getExtent());
$("#formParcel")[0].reset();
} else {
onError();
}
}
xhr.send(JSON.stringify(params));
},
});
var vectorlayer = new ol.layer.Vector({
source:vectorParcels,
visible:true,
displayInLayerSwitcher: false,
style: styleFunction,
});
map.addLayer(vectorlayer)
}