【高精地图】GEOJSON标准格式学习

最近做的项目需要详细了解geojson,因此查了一些资料,现在整理一份标准格式的记录,要理解本文需要首先了解json的基本知识,这里不过多展开,可以去参考w3school上的教程,简言之,json是通过键值对表示数据对象的一种格式,可以很好地表达数据,其全称为JavaScript Object Notation(JavaScript Object Notation),正如这个名称,JavaScript和json联系紧密,但是json可以应用的范围很广,不止于前端,它比XML数据更轻量、更容易解析(某种角度上说xml可以更自由地封装更多的数据)。很多编程语言都有对应的json解析库,例如Python的json库,C#的Newtonsoft.Json,Java的org.json。geojson是用json的语法表达和存储地理数据,可以说是json的子集。

例如下面就是一个点数据:

{
  "type": "FeatureCollection",
  "features": [
        {"type":"Feature",
        "properties":{},
        "geometry":{
            "type":"Point",
            "coordinates":[105.380859375,31.57853542647338]
            }
        }
    ]
}
例子图片

(注:以下geojson的效果截图都来自geojson.io在线生成)

geojson将所有的地理要素分为Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon、GeometryCollection。首先是将这些要素封装到单个的geometry里,然后作为一个个的Feature(也就是要素);要素放到一个要素集合里,从树状结构来理解FeatureCollection就是根节点,表示为:

{
  "type": "FeatureCollection",
  "features": []
}

所有地理要素放在features的列表里。

点要素Point

点要素是最简单的,类型type对应Point,然后坐标是一个1维的数组,里面有两个元素(如果是立体的坐标就是三维x,y,z),分别为经度和纬度。properties里面可以封装各种属性,例如名称、标识颜色等等。

{"type":"Feature",
    "properties":{},
    "geometry":{
        "type":"Point",
        "coordinates":[105.380859375,31.57853542647338]
        }
    }

多点要素MultiPoint

{"type":"Feature",
    "properties":{},
    "geometry":{
        "type":"MultiPoint",
        "coordinates":[[105.380859375,31.57853542647338],
                [105.580859375,31.52853542647338]
            ]
        }
        }

其核心坐标:

105.380859375,31.57853542647338
105.580859375,31.52853542647338

线要素LineString

线要素就是指线段,记录的是线的端点坐标,可视化时会按照记录顺序联结。对于曲线(如贝塞尔曲线)目前还没有很好的表达,但是在地理数据中,曲线一般会用LineString去拟合,现实地理世界中也没有标准的曲线地理要素。

线要素的坐标coordinates里的二维数组和多点要素基本一样,区别就在type上了。

{"type":"Feature",
    "properties":{},
    "geometry":{
        "type":"LineString",
        "coordinates":[[105.6005859375,30.65681556429287],
        [107.95166015624999,31.98944183792288],
        [109.3798828125,30.031055426540206],
        [107.7978515625,29.935895213372444]]
        }
    }

对应的Kml表达:

<Placemark>
    <ExtendedData></ExtendedData>
    <LineString>
        <coordinates>108.65753173828125,34.1873818599505 108.72413635253905,34.25154099726973 108.77151489257812,34.16977214177208 108.88481140136719,34.229970811273084
        </coordinates>
    </LineString>
</Placemark>

MultiLineString

也是一个三维数组(和多边形一样);

{"type":"Feature",
    "properties":{},
    "geometry":{
        "type":"MultiLineString",
        "coordinates":
        [
            [
                [105.6005859375,30.65681556429287],
                [107.95166015624999,31.98944183792288],
                [109.3798828125,30.031055426540206],
                [107.7978515625,29.935895213372444]
            ],
            [
                [109.3798828125,30.031055426540206],
                [107.1978515625,31.235895213372444]
            ]
        ]
                }
    }

多边形Polygon

注:单个多边形是一个3维数组,可以包含多个二维数组,这种情况和MultiPolygon效果很像。

{"type":"Feature",
    "properties":{},
    "geometry":{
        "type":"Polygon",
        "coordinates":[
                        [
                          [106.10595703125,33.33970700424026],
                          [106.32568359375,32.41706632846282],
                          [108.03955078125,32.2313896627376],
                          [108.25927734375,33.15594830078649],
                          [106.10595703125,33.33970700424026]
                        ]
                      ]
        }
    }

多多边形MultiPolygon

type 1 两个不会相交的多边形
{
  "type": "Feature",
  "properties": {},
  "geometry": {
  "type": "MultiPolygon",
  "coordinates":
    [ 
        [
            [
                [109.2041015625,30.088107753367257],
                [115.02685546875,30.088107753367257],
                [115.02685546875,32.7872745269555],
                [109.2041015625,32.7872745269555],
                [109.2041015625,30.088107753367257]
        <span class="token punctuation">]</span>
    <span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token punctuation">[</span>
        <span class="token punctuation">[</span>
            <span class="token punctuation">[</span><span class="token number">112.9833984375</span><span class="token punctuation">,</span><span class="token number">26.82407078047018</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">116.69677734375</span><span class="token punctuation">,</span><span class="token number">26.82407078047018</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">116.69677734375</span><span class="token punctuation">,</span><span class="token number">29.036960648558267</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">112.9833984375</span><span class="token punctuation">,</span><span class="token number">29.036960648558267</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">112.9833984375</span><span class="token punctuation">,</span><span class="token number">26.82407078047018</span><span class="token punctuation">]</span>
        <span class="token punctuation">]</span>
    <span class="token punctuation">]</span>
<span class="token punctuation">]</span>
         <span class="token punctuation">}</span>

}

两个不相交的多边形
type 2 两个镶套的多边形

小的在前面,范围大的在后面,用上4个中括号,但效果不是有洞的

    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "MultiPolygon",
        "coordinates":
        [ 
            [
                [
                    [101.6455078125,27.68352808378776],
                    [114.78515624999999,27.68352808378776],
                    [114.78515624999999,35.209721645221386],
                    [101.6455078125,35.209721645221386],
                    [101.6455078125,27.68352808378776]
                ]   
            ],
            [
                [
                    [104.2822265625,30.107117887092357],
                    [108.896484375,30.107117887092357],
                    [108.896484375,33.76088200086917],
                    [104.2822265625,33.76088200086917],
                    [104.2822265625,30.107117887092357]
                ]
            ]
        ]
      }
    }

两个镶套的多边形
type 3 有孔洞的多边形
{
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "MultiPolygon",
        "coordinates":
    [ 
        [
            [
                [101.6455078125,27.68352808378776],
                [114.78515624999999,27.68352808378776],
                [114.78515624999999,35.209721645221386],
                [101.6455078125,35.209721645221386],
                [101.6455078125,27.68352808378776]
        <span class="token punctuation">]</span><span class="token punctuation">,</span>
        <span class="token punctuation">[</span>
            <span class="token punctuation">[</span><span class="token number">104.2822265625</span><span class="token punctuation">,</span><span class="token number">30.107117887092357</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">108.896484375</span><span class="token punctuation">,</span><span class="token number">30.107117887092357</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">108.896484375</span><span class="token punctuation">,</span><span class="token number">33.76088200086917</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">104.2822265625</span><span class="token punctuation">,</span><span class="token number">33.76088200086917</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
            <span class="token punctuation">[</span><span class="token number">104.2822265625</span><span class="token punctuation">,</span><span class="token number">30.107117887092357</span><span class="token punctuation">]</span>
        
        <span class="token punctuation">]</span>
    <span class="token punctuation">]</span>
<span class="token punctuation">]</span>
            <span class="token punctuation">}</span>

}

有孔洞的多边形

可以仔细去品味type2和type3的区别。它们对应的kml表达区别是比较大的。

GeometryCollection

GeometryCollection是多种基本地理要素的集合,就是里面可以包含点、线、面要素。

{
    "type": "GeometryCollection",
    "geometries": [
        {
         "type": "Point",
          "coordinates": [108.62, 31.02819]
         }, {
         "type": "LineString",
          "coordinates": [[108.896484375,30.1071178870],
          [108.2184375,30.91717870],
          [109.5184375,31.2175780]]
         }]
}

GeometryCollection不需要放在FeatureCollection里:

{
  "type": "FeatureCollection",
  "features": []
}

geojson里面还有其他标签表达其他的属性,如外包矩形等,其中特别重要的是坐标系统,一般里面的坐标默认为WGS84,当然也可以是其他坐标系统的坐标,但是要标识。这部分内容之后再补充了。

<think>好的,用户想了解如何在地图上标注ROS相关内容,具体是在GIS或地图应用中使用ROS进行标注。首先,我需要回忆ROS(Robot Operating System)在地图标注中的应用场景和相关工具。 首先,ROS常用于机器人导航和感知,其中地图标注可能涉及SLAM(同步定位与地图构建)。用户可能需要将传感器数据(如激光雷达或摄像头)生成的地图与GIS系统结合,进行POI(兴趣点)或路径的标注。比如,使用gmapping或cartographer生成地图后,可能需要将地图数据导出到GIS格式,如GeoTIFF或Shapefile,以便在GIS软件中进一步处理。 接下来,考虑ROS与GIS的数据转换。ROS中的地图通常以Occupancy Grid格式存储,而GIS使用经纬度坐标系。因此,坐标转换是关键步骤,可能需要使用proj库或ROS的tf库来处理坐标变换。例如,将机器人本地的地图坐标转换为WGS84坐标系,以便在GIS中正确显示。 然后,标注的具体内容可能包括路径、POI或区域(AOI)。ROS中的导航包如move_base可以生成路径,这些路径数据可以通过编写ROS节点导出为GeoJSON或KML格式,再导入到GIS应用中。对于动态标注,比如实时传感器数据,可能需要使用ROS的topic来持续更新GIS中的图层,这可以通过ROSbridge与Web GIS工具如Leaflet或Mapbox集成实现。 另外,用户可能想了解具体的工具链。例如,使用RViz进行可视化,然后通过rosbag记录数据,再使用Python脚本处理数据并导出到QGIS或ArcGIS。此外,ROS中有一些现有的包,如world_canvas或mapviz,可能支持地图标注功能,需要检查这些包的文档是否适合用户需求。 还要考虑用户的实际应用场景,比如是用于机器人导航测试、环境监测还是城市规划。根据引用[1]提到的GIS智能体分析数据生成建议,可能需要将ROS处理的数据与城市规划文档或卫星图像结合,进行自动化标注。例如,将机器人采集的实时环境数据与规划文档叠加,自动标注施工区域或危险区域。 最后,用户可能需要性能优化或与其他系统集成的方法,比如引用[2]中提到的传感器融合或高精度地图,可能需要将ROS与高精地图数据结合,确保标注的精确性。同时,引用[3]提到的POI、AOI和路径轨迹,需要确保ROS生成的数据符合这些地理特征的标准格式,便于在导航应用中直接使用。 总结步骤:1. 使用ROS生成或加载地图数据;2. 转换坐标系和数据格式;3. 利用ROS工具或自定义节点进行标注;4. 导出到GIS应用或实时集成。需要提供具体的代码示例和工具推荐,确保用户能够逐步操作。</think>在地理信息系统(GIS)或地图应用中使用ROS(机器人操作系统)进行标注,可通过以下步骤实现: --- ### 1. **地图生成与加载** - **SLAM建图**:使用ROS中的SLAM工具包(如`gmapping`、`cartographer`)生成环境地图,地图格式为Occupancy Grid(栅格地图)。 ```bash roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping ``` - **地图保存与加载**:通过`map_server`包保存为PGM文件,并转换为GIS兼容格式(如GeoTIFF)[^1]。 --- ### 2. **坐标系转换** - **全局坐标对齐**:将ROS的局部坐标系(如`map`或`odom`)转换为WGS84或UTM坐标系,需使用`tf`库和`proj`库进行转换。 ```python # 示例:使用tf2_ros获取坐标变换 from tf2_ros import Buffer, TransformListener buffer = Buffer() listener = TransformListener(buffer) transform = buffer.lookup_transform('world', 'base_link', rospy.Time()) ``` --- ### 3. **标注类型实现** - **POI标注**:通过ROS节点订阅传感器数据(如GPS、摄像头),识别兴趣点并导出为GeoJSON。 ```python # 发布POI到GIS import rospy from geometry_msgs.msg import PointStamped pub = rospy.Publisher('/poi_markers', PointStamped, queue_size=10) ``` - **路径标注**:记录机器人导航路径(`nav_msgs/Path`),转换为GIS路径轨迹(如KML)。 ```python # 将Path消息导出为CSV with open('path.csv', 'w') as f: for pose in path.poses: f.write(f"{pose.pose.position.x},{pose.pose.position.y}\n") ``` - **AOI标注**:通过多边形绘制工具(如`rviz`插件)定义区域,导出为Shapefile。 --- ### 4. **与GIS工具集成** - **数据导出**:使用Python库(如`geopandas`、`GDAL`)将ROS数据转换为GIS格式。 - **实时可视化**:通过`rosbridge`与Web GIS(如Leaflet、CesiumJS)连接,实现动态标注[^3]。 --- ### 5. **应用场景示例** - **应急响应**:机器人实时采集灾害区域数据,标注危险区域(AOI)和救援路径。 - **智能导航**:将ROS生成的路径与高精度地图(如NDS格式)叠加,优化导航逻辑[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值