首页 / 浏览问题 / WebGIS / 问题详情
L.circle画出来的不是正圆
20EXP 2023年09月19日
使用产品:iserver 11i 操作系统:win10x64 数据类型: postgre sql 问题详细描述:1、L.circle画出来的不是正圆,是个椭圆,怎么让变正圆,2、坐标系怎么改
问题重现步骤: 1.
问题关闭原因: 1

1个回答

你好,1、leaflet中经纬度是和地理坐标系中的经纬度相反的,具体可以参考:

2、转换坐标,引入leaflet插件Proj4Leaflet,具体可以参考:https://blog.csdn.net/weixin_42066016/article/details/120450789

1,865EXP 2023年09月19日
不是很明确你这个是什么意思,iclient-leaflet的经纬度和坐标系的相反,那是应该要怎样,是改什么能让他不变形
一般的坐标是:[经度,纬度] ,在leaflet中是相反的:[纬度,经度]。所以如果你要绘制的圆中心点比如[104,30]的位置,在leaflet中就要用[30,104]。请看一下截图的代码。
写的就是L.circle([纬度,经度], {radius: 2000}).addTo(map),  画出来的图变形, 不是正圆 是椭圆,离赤道越近画出来的越圆, 怎么阻止它变形
请问你是什么坐标系下添加的,如果是4326,纬度离赤道越远圆变形越大,离赤道越近变形越小。绘制出来的圆有变形是正确的结果。

可以考虑根据半径和中心点去构造polygon类型的圆,例如:

var radius = 2;
//点集
var parts = [];
//计算圆的边缘所有点
for (var i = 0; i < 360; i++) {
var radians = (i + 1) * Math.PI / 180;
var circlePoint = [Math.cos(radians) * radius + 34, Math.sin(radians) * radius + 108];
parts[i] = circlePoint;
}
var polygon1 = L.polygon(parts, {
color: ‘green’
}).addTo(map);
draw_Circle() {
      if (this.circleLayer != null) {
        this.map.removeLayer(this.circleLayer)
      }
      this.r = 0;
      this.i = null;
      this.circleLayer = new L.circle();
      this.map.dragging.disable(); // 将mousemove事件移动地图禁用
      this.map.on('mousedown', (e) => {
        this.i = e.latlng
        this.map.on('mousemove', (ev) => {
          this.r = L.latLng(ev.latlng).distanceTo(this.i) // 计算半径
          if (this.i) {
            // 绘制圆心位置与半径
            this.circleLayer.setLatLng(this.i)
            this.circleLayer.setRadius(this.r)
            this.circleLayer.setStyle({color: '#2260b4', fillOpacity: 0.3})
            this.map.addLayer(this.circleLayer)
          }
        })
        this.map.on('mouseup', (ev) => {
          var circle = L.circle(this.i, {radius: this.r, color: '#2260b4', fillOpacity: 0.3})
          this.map.addLayer(this.circleLayer)
          this.map.dragging.enable()
          // this.map.setView(this.i, 13)
          this.i = null
          this.r = 0
          this.map.off('mousedown')
          this.map.off('mouseup')
          this.map.off('mousemove')
        })
      })
    },

这个是我的代码,应该怎么把circle替换成polygon呢,

之后想用画好的圆查询圈选区域内的数据应该怎么做

自定义圆,就是传入对应的中心点位置,比如[34,108],根据中心点和半径,计算圆上坐标点,这是一个基本的数学公式,原理可以了解一下:

https://blog.csdn.net/can3981132/article/details/52559402

示例代码如下,radius就是半径,parts[]圆上所有点集,最后传入坐标传,构造 L.polygon绘图。你可以根据你的代码,将对应参数替换即可。

...