Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使用postgres数据库中的地理数据创建GeoJSON以在层URL中寻址?_Postgresql_Openstreetmap_Leaflet_Layer_Geojson - Fatal编程技术网

Postgresql 如何使用postgres数据库中的地理数据创建GeoJSON以在层URL中寻址?

Postgresql 如何使用postgres数据库中的地理数据创建GeoJSON以在层URL中寻址?,postgresql,openstreetmap,leaflet,layer,geojson,Postgresql,Openstreetmap,Leaflet,Layer,Geojson,我想在地图上显示一个国家的行政边界,可以通过用户交互改变填充颜色,在弹出窗口中显示统计数据到选定的多边形,使用事件,如onmouseover,通过点击取消选择多个多边形,等等,在带有openstreetmap的传单地图上 到目前为止我所做的: 我编写了一个脚本,通过用户定义的区域请求将这些边界显示为多边形。这些数据可能非常庞大。来自全国所有边界的数据都有很多兆字节,因此在使用jQuery的标准ajax请求中等待php脚本的速度太慢 如何读取和存储数据: 首先,我从osm文件中读取xml数据,并将

我想在地图上显示一个国家的行政边界,可以通过用户交互改变填充颜色,在弹出窗口中显示统计数据到选定的多边形,使用事件,如onmouseover,通过点击取消选择多个多边形,等等,在带有openstreetmap的传单地图上

到目前为止我所做的:

我编写了一个脚本,通过用户定义的区域请求将这些边界显示为多边形。这些数据可能非常庞大。来自全国所有边界的数据都有很多兆字节,因此在使用jQuery的标准ajax请求中等待php脚本的速度太慢

如何读取和存储数据:

首先,我从osm文件中读取xml数据,并将其存储在postgres数据库中。 osm中的边界关系存储为几何体集合仅多边形和多多边形

我想要达到的目标:

现在我想在地图上显示所有的边界。在更高的缩放级别上,它应该显示子级别的更多边界。所以用户可以看到他在较低级别上看到的子区域

第一级:整个国家在一个多边形中。 更高的缩放级别:更高级别的管理边界 [……等等……]

一种似乎是解决方案的可能性:

在该示例中,客户端在服务器上以与地图分幅相同的方式请求geojson数据

var geojsonURL='{z}/{x}/{y}.json'

因此,我可以在每个缩放级别上提供不同的geojson,并且只提供我真正需要的多边形

如何将数据从geometry collection转换为geojson,并以这种方式处理

举个例子就好了。

答案的要素

为类似/{z}/{x}/{y}.json的url传递geojson数据意味着您必须在缩放级别z中检索与tile x,y相关的数据

要了解我们所说的latlng,可以使用以下php:

// SpericalMercator projection
// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_numbers_to_lon..2Flat._5
$n = pow(2, $zoom);
$lon1 = $xtile / $n * 360.0 - 180.0;
$lat1 = rad2deg(atan(sinh(pi() * (1 - 2 * $ytile / $n))));

$lon2 = ($xtile + 1) / $n * 360.0 - 180.0;
$lat2 = rad2deg(atan(sinh(pi() * (1 - 2 * ($ytile + 1) / $n))));

$SQL_where = "'latitude' <= $lat1 AND 'latitude' > $lat2 AND 'longitude' >= $lon1 AND 'longitude' < $lon2";
要检索数据,您必须选择在所需平铺中至少有一个点的多边形

请记住,由于多边形可能跨越多个平铺,因此将以不同的响应返回相同的多边形。因此,您应该为每个多边形命名一个唯一的id,以便您可以在客户端处理这些重复项


参考资料:

我不知道postgre数据库的详细信息,但概念是您只会请求用户视图边界框内的多边形。传单中有获取当前视图边界框的方法,然后将其传递给服务器以获取多边形。Postgres/GIS有一个ST_AsGeoJSON函数,该函数将简单地将几何体作为GeoJSON返回。如果希望包含属性并返回功能集合,则需要使用array_agg和array_to_json函数。这里有一些示例查询可能会有所帮助。谢谢你们两位的回答。我会试试你的建议和弗朗西马克的回答。谢谢你的回答。我接受这个答案,因为它看起来真的很有希望。我会试试看。