Leaflet.js 圆到多边形的转换
Leaflet.js Circle to Polygon Conversion
我正在使用 Leaflet.js 来保存覆盖图,并让用户可以选择使用多边形或圆形。
为了使所有对象保持相同的格式,我在保存之前将圆形转换为多边形。
但是,当我重新加载圆时,它是椭圆形的。
我知道这是由于地球的曲线,但我不确定如何更正我的方法以将其考虑在内? (我看过但找不到任何能提供我想要的解决方案的东西)。
主要问题是我在下面使用的 javascript 方法,因为它没有考虑地球的曲线。
// GenerateCirlcePolygon - Creates Circle from 360 line Segments
function GenerateCirlcePolygon(origin, radius) {
var earthRadius = 6371;
//latitude in radians
var lat = (origin.Latitude * Math.PI) / 180;
//longitude in radians
var lon = (origin.Longitude * Math.PI) / 180;
//angular distance covered on earth's surface
var d = parseFloat(radius) / earthRadius;
polyPoints = new Array();
for (i = 0; i <= 360; i++) {
var point = new VELatLong(0, 0)
var bearing = i * Math.PI / 180; //rad
point.Latitude = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(bearing));
point.Longitude = ((lon + Math.atan2(Math.sin(bearing) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(point.Latitude))) * 180) / Math.PI;
point.Latitude = (point.Latitude * 180) / Math.PI;
polyPoints.push(point);
}
任何建议都很好。
您可以使用 leaflet-geoman
中的内置函数:L.PM.Utils.circleToPolygon(circle, sides)
L.PM.Utils.circleToPolygon(circle, 60).addTo(map)
我正在使用 Leaflet.js 来保存覆盖图,并让用户可以选择使用多边形或圆形。
为了使所有对象保持相同的格式,我在保存之前将圆形转换为多边形。
但是,当我重新加载圆时,它是椭圆形的。
我知道这是由于地球的曲线,但我不确定如何更正我的方法以将其考虑在内? (我看过但找不到任何能提供我想要的解决方案的东西)。
主要问题是我在下面使用的 javascript 方法,因为它没有考虑地球的曲线。
// GenerateCirlcePolygon - Creates Circle from 360 line Segments
function GenerateCirlcePolygon(origin, radius) {
var earthRadius = 6371;
//latitude in radians
var lat = (origin.Latitude * Math.PI) / 180;
//longitude in radians
var lon = (origin.Longitude * Math.PI) / 180;
//angular distance covered on earth's surface
var d = parseFloat(radius) / earthRadius;
polyPoints = new Array();
for (i = 0; i <= 360; i++) {
var point = new VELatLong(0, 0)
var bearing = i * Math.PI / 180; //rad
point.Latitude = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(bearing));
point.Longitude = ((lon + Math.atan2(Math.sin(bearing) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(point.Latitude))) * 180) / Math.PI;
point.Latitude = (point.Latitude * 180) / Math.PI;
polyPoints.push(point);
}
任何建议都很好。
您可以使用 leaflet-geoman
中的内置函数:L.PM.Utils.circleToPolygon(circle, sides)
L.PM.Utils.circleToPolygon(circle, 60).addTo(map)