如何编写代码,实现在百度地图上进行覆盖物的绘制,并且可以通过保存按钮存到数据库,再次刷新页面,就可以将绘制的覆盖显示在百度地图上
时间: 2023-06-13 12:08:54 浏览: 185
要在百度地图上绘制覆盖物并保存到数据库,你需要以下步骤:
1. 在前端页面中引入百度地图API和相关的插件,例如DrawingManager,用于绘制覆盖物。
2. 在页面中创建一个地图容器,初始化百度地图。
3. 创建DrawingManager对象,用于绘制覆盖物。在绘制完成后,可以通过事件监听器获取绘制的图形信息。
4. 将绘制的覆盖物信息发送到后端,存储到数据库中。
5. 在后端编写接口,接收前端发送的覆盖物信息,将其存储到数据库中。
6. 在前端编写接口,从后端获取已经存储的覆盖物信息,并在地图上进行显示。
以下是一个简单的代码示例:
前端代码:
```html
<div id="map"></div>
<button onclick="save()">保存</button>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=YOUR_APP_KEY"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
<script>
var map = new BMap.Map("map"); // 创建地图实例
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别
var drawingManager = new BMapLib.DrawingManager(map, {
isOpen: false, // 是否开启绘制模式
enableDrawingTool: true, // 是否显示工具栏
drawingToolOptions: {
anchor: BMAP_ANCHOR_TOP_RIGHT, // 工具栏位置
offset: new BMap.Size(5, 5), // 工具栏偏移量
},
circleOptions: {
strokeColor: "red", // 圆形边框颜色
fillColor: "red", // 圆形填充颜色
strokeWeight: 2, // 圆形边框宽度
strokeOpacity: 0.8, // 圆形边框透明度
fillOpacity: 0.6, // 圆形填充透明度
strokeStyle: "solid", // 圆形边框样式
},
polylineOptions: {}, // 折线样式设置
polygonOptions: {}, // 多边形样式设置
rectangleOptions: {}, // 矩形样式设置
});
drawingManager.addEventListener("overlaycomplete", function (e) {
var overlay = e.overlay; // 获取绘制的图形对象
var type = e.drawingMode; // 获取绘制的图形类型
// 将绘制的图形信息发送到后端保存到数据库中
var data = {
type: type,
points: overlay.getPath(),
};
$.post("/save", data, function (res) {
alert(res.msg);
});
});
function save() {
// 获取已经绘制的覆盖物信息,并保存到数据库中
var overlays = drawingManager.getOverlays();
var data = [];
for (var i = 0; i < overlays.length; i++) {
var overlay = overlays[i];
data.push({
type: overlay.toString(),
points: overlay.getPath(),
});
}
$.post("/save", { data: data }, function (res) {
alert(res.msg);
});
}
// 从后端获取已经保存的覆盖物信息,并在地图上进行显示
$.get("/get", function (data) {
for (var i = 0; i < data.length; i++) {
var item = data[i];
var points = item.points.map(function (point) {
return new BMap.Point(point.lng, point.lat);
});
switch (item.type) {
case "circle":
var circle = new BMap.Circle(points[0], points[1].distance(points[0]));
map.addOverlay(circle);
break;
case "polyline":
var polyline = new BMap.Polyline(points);
map.addOverlay(polyline);
break;
case "polygon":
var polygon = new BMap.Polygon(points);
map.addOverlay(polygon);
break;
case "rectangle":
var rectangle = new BMap.Polygon(points);
map.addOverlay(rectangle);
break;
}
}
});
</script>
```
后端代码:
```python
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///map.db"
db = SQLAlchemy(app)
class Overlay(db.Model):
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String(50))
points = db.Column(db.String(500))
@app.route("/save", methods=["POST"])
def save():
data = request.get_json()
if "data" in data:
for item in data["data"]:
overlay = Overlay(type=item["type"], points=str(item["points"]))
db.session.add(overlay)
else:
overlay = Overlay(type=data["type"], points=str(data["points"]))
db.session.add(overlay)
db.session.commit()
return jsonify({"msg": "保存成功"})
@app.route("/get")
def get():
overlays = Overlay.query.all()
data = []
for overlay in overlays:
data.append({"type": overlay.type, "points": eval(overlay.points)})
return jsonify(data)
if __name__ == "__main__":
db.create_all()
app.run()
```
上述代码演示了如何在百度地图上绘制覆盖物,并将绘制的覆盖物保存到数据库中,再次刷新页面后,从数据库中获取已经保存的覆盖物信息,并在地图上进行显示。
阅读全文