OpenLayers - 缺少圆坐标
OpenLayers - Circle coordinates are missing
我希望可以选择将绘图导出为 geoJSON 文件。到目前为止,我已经完美地处理了所有这些问题,除了圆圈,诚然,圆圈根本没有任何几何形状!
我知道,GeoJSON 格式可以呈现一个纯圆,我们需要按照这个线程将其建模为点:
How to define a circle using GeoJson?
https://docs.mongodb.com/manual/tutorial/query-a-2dsphere-index/
我完全意识到这一点,这就是为什么我开始修改我的代码以使圆圈物理可见的原因。
我的问题与这个非常相似:
类似于下面的解决方案:
http://geoadmin.github.io/ol3/apidoc/sphere.js.html
修改代码后:
var wgs84Sphere = new ol.sphere(6378137);
var circleInteraction = new ol.interaction.Draw({
geometryFunction: function(coordinates, geometry) {
if (!geometry) {
geometry = new ol.geom.Polygon(null);
}
var center = coordinates[0];
var last = coordinates[1];
var dx = center[0] - last[0];
var dy = center[1] - last[1];
var radius = Math.sqrt(dx * dx + dy * dy);
var circle = ol.geom.Polygon.circular(wgs84Sphere, ol.proj.toLonLat(center), radius);
circle.transform('EPSG:4326', 'EPSG:3857');
geometry.setCoordinates(circle.getCoordinates());
return geometry;
},
type: 'Circle',
source: vectorLayer.getSource()
});
circleInteraction.setActive(false);
circleInteraction.on('drawend', onDrawend );
我收到一个错误:
未捕获类型错误:ol.sphere 不是构造函数
这是由 OpenLayers 库升级引起的,从 5.0.0 版本开始不再有效。
https://github.com/openlayers/openlayers/issues/9046
针对这种情况,我尝试更改wgs84Sphere
变量
var polygon_geometry = new ol.geom.Polygon;
var wgs84Sphere = ol.sphere.getArea(polygon_geometry, projection='EPSG:4326', radius=6378137)
但是也没用
Uncaught TypeError: 无法读取未定义的属性(读取 SimpleGeometry.js:170
指向直线
if (coordinates.length === 0) {
那么可以为圆生成 .geoJSON 几何图形吗?
我的完整 JSFiddle 在这里:
ol.geom.Polygon.circular
的参数也改变了,所以你不需要构建一个球体,见https://openlayers.org/en/latest/examples/draw-and-modify-geodesic.html如果你不需要修改你只需要一个多边形
geometryFunction: function(coordinates, geometry, projection) {
if (!geometry) {
geometry = new ol.geom.Polygon([]);
}
var center = ol.proj.transform(coordinates[0], projection, 'EPSG:4326');
var last = ol.proj.transform(coordinates[1], projection, 'EPSG:4326');
var radius = ol.sphere.getDistance(center, last);
var circle = ol.geom.Polygon.circular(center, radius);
circle.transform('EPSG:4326', projection);
geometry.setCoordinates(circle.getCoordinates());
return geometry;
},
我希望可以选择将绘图导出为 geoJSON 文件。到目前为止,我已经完美地处理了所有这些问题,除了圆圈,诚然,圆圈根本没有任何几何形状!
我知道,GeoJSON 格式可以呈现一个纯圆,我们需要按照这个线程将其建模为点:
How to define a circle using GeoJson? https://docs.mongodb.com/manual/tutorial/query-a-2dsphere-index/
我完全意识到这一点,这就是为什么我开始修改我的代码以使圆圈物理可见的原因。
我的问题与这个非常相似:
类似于下面的解决方案:
http://geoadmin.github.io/ol3/apidoc/sphere.js.html
修改代码后:
var wgs84Sphere = new ol.sphere(6378137);
var circleInteraction = new ol.interaction.Draw({
geometryFunction: function(coordinates, geometry) {
if (!geometry) {
geometry = new ol.geom.Polygon(null);
}
var center = coordinates[0];
var last = coordinates[1];
var dx = center[0] - last[0];
var dy = center[1] - last[1];
var radius = Math.sqrt(dx * dx + dy * dy);
var circle = ol.geom.Polygon.circular(wgs84Sphere, ol.proj.toLonLat(center), radius);
circle.transform('EPSG:4326', 'EPSG:3857');
geometry.setCoordinates(circle.getCoordinates());
return geometry;
},
type: 'Circle',
source: vectorLayer.getSource()
});
circleInteraction.setActive(false);
circleInteraction.on('drawend', onDrawend );
我收到一个错误:
未捕获类型错误:ol.sphere 不是构造函数
这是由 OpenLayers 库升级引起的,从 5.0.0 版本开始不再有效。 https://github.com/openlayers/openlayers/issues/9046
针对这种情况,我尝试更改wgs84Sphere
变量
var polygon_geometry = new ol.geom.Polygon;
var wgs84Sphere = ol.sphere.getArea(polygon_geometry, projection='EPSG:4326', radius=6378137)
但是也没用
Uncaught TypeError: 无法读取未定义的属性(读取 SimpleGeometry.js:170
指向直线
if (coordinates.length === 0) {
那么可以为圆生成 .geoJSON 几何图形吗?
我的完整 JSFiddle 在这里:
ol.geom.Polygon.circular
的参数也改变了,所以你不需要构建一个球体,见https://openlayers.org/en/latest/examples/draw-and-modify-geodesic.html如果你不需要修改你只需要一个多边形
geometryFunction: function(coordinates, geometry, projection) {
if (!geometry) {
geometry = new ol.geom.Polygon([]);
}
var center = ol.proj.transform(coordinates[0], projection, 'EPSG:4326');
var last = ol.proj.transform(coordinates[1], projection, 'EPSG:4326');
var radius = ol.sphere.getDistance(center, last);
var circle = ol.geom.Polygon.circular(center, radius);
circle.transform('EPSG:4326', projection);
geometry.setCoordinates(circle.getCoordinates());
return geometry;
},