我目前正在开发用于制作地质图的应用程序。我将Ruby on Rails用于后端,将React用于前端,并将Postgres用于数据库。我正在使用React Leaflet显示地图(将Leaflet.js抽象到React组件)。我正在从OpenTopoMap获取地图。此应用程序非商业用途,我已经检查了他们的使用条款,以确保我没有违反。
我希望用户能够查看地图并能够在其上添加点和绘制多边形(我已经知道如何做这部分)。 一旦完成在地图上的绘制,我希望他们能够保存所做的任何添加的地图。然后,他们应该能够稍后重新打开它并对其进行修改。
我发现保存地图的唯一方法是将其保存为.png,这意味着重新打开后无法对其进行编辑。
仅保存点/多边形并在用户重新打开地图时重新渲染它们是可以接受的解决方案,只要重新打开地图时显示正确的地图区域即可,但是我不确定如何存储这个数据。一个用户可以有许多地图,因此仅适用于单个地图实例的解决方案在这种情况下将不起作用。
我知道我在这里描述的只是复制了许多其他映射应用程序的功能。一旦确定了这一部分,我计划添加专门用于制作地质图的广泛功能。我没有在此描述该功能,因为它与我当前的问题无关。
如何将地图保存为PostgreSQL,以便重新打开时可以对其进行编辑?
而不是用一些JSON列怪异的方法来改造轮子,而请看一下PostGIS。它是Postgres的扩展,它添加了地理空间数据类型,例如点,线和面。它还使您可以编写地理空间数据库查询,例如测试点是否在多边形或邻近搜索中。
对于rails the activerecord-postgis-adapter gem添加以下数据库类型:
:geometry
-任何几何类型:st_point
-点数据:line_string
-LineString数据:st_polygon
-多边形数据:geometry_collection
-任何集合类型:multi_point
-点的集合:multi_line_string
-LineString的集合:multi_polygon
-多边形的集合这提供了创建具有地理空间属性的模型的基础。它不是魔术棒,它可以使您将带有涂鸦的地图塞入Postgres并获得可编辑的内容,并且在研究和实现方面都需要付出大量的努力。
据我了解,您要将复杂的对象保存到数据库中。用户可以在地图上画线,也可以画多边形等。也许可以使用jsonb对象解决此问题。基本上,它是将JSON格式的字段保存到数据库。
一个示例jsonb对象可以像这样。
{
"data": {
"type": "user_map",
"attributes": {
"user_id": "1",
"drawings": {
"points": [],
"lines": {},
"polygons": {}
}
}
}
}
您都可以通过在用户模型上使用has_many :maps
将这些信息保留在用户或单独的模型上。
可以帮助您的链接:
我建议不要以地图(空间数据的呈现)的方式思考,而是以数据(具有属性的点/线/多边形)的方式思考。您将每个用户数据保存在表中,也许还有另一个map_config表,其中包含地图边界框,名称等。
在您的应用中,对用户进行身份验证后,您就可以访问其地图配置(让他选择要显示的地图)和相关数据。然后,您可以直接在Leaflet,Open Layers(或其他方式)中使用原始矢量数据来显示地图,也可以通过地理服务器(Geoserver,Mapserver等)通过管道将其用作wms图像或wfs可编辑矢量数据。您可以将显示的区域缩放或限制为地图配置中保存的区域。