CARTO 从 table 使用零 the_geom 参数创建地图

Creating map by CARTO from table with zero the_geom parameter

我已使用 .csv 文件将新数据集添加到 carto Builder。但是有空 the_geom 列。因此,当我使用 reactjs 和 carto.js 通过以下方式创建地图时:

this.cartoClient = new carto.Client({ apiKey: 'key', username: 'user' });
<Map center={center} zoom={zoom} ref={node => { this.nativeMap = node && node.leafletElement }}>
          <Basemap attribution="" url={CARTO_BASEMAP} />

          <Layer
            source={airbnb.source}
            style={this.state.layerStyle}
            client={this.cartoClient}
            hidden={this.state.hidelayers}
          />
        </Map>

并使用 airbnb.source

SELECT
  cartodb_id,  field_1,field_8, field_7, field_6, field_2, field_4, field_3, field_5,
  ST_SetSRID(    ST_MakePoint(
      field_4,
      field_3
    ),
    4326
  ) AS the_geom,
  ST_Transform(ST_Buffer(the_geom,0.001), 3857) as the_geom_webmercator
FROM (SELECT * FROM allreports) AS _camshaft_georeference_long_lat_analysis

Carto.js 没有在我的地图上标记点,所以我明白了。我应该如何解决 the_geom,the_geom_webmercator 以获得带点的地图或问题出在其他地方?

同样 SQL 在 Builder 中工作吗?你从哪里得到的?在没有看到实际数据的情况下,只能推测可以做什么,而且您的字段名称在这里也不是很有帮助。或者它是由 Builder 自动生成的 SQL?我不确定绕过那个是不是个好主意,即使它现在可以工作,那么这些内部结构可以随时更改。通常有以下几种情况如何获取要映射的数据:

  • 导入器尝试从 table 结构中尝试一些启发式方法将其添加到映射中。例如,如果您有列名 latitudelongitude,那么 table 将自动进行地理编码,即 geom 字段被填充并且 table 正常工作。或者如果有包含英文城市名称的列 city,那么它也很有可能会出现在地图上。因此,最简单的方法是使用这些字段名称,如果您的数据中已有这些字段名称的话。
  • 您可以使用 Carto SQL API 持续地理编码 table,在命名地点的情况下使用类似 UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, {province_column}, {country_column}) 的东西,或者如果您有 wgs lat/lon 字段然后 UPDATE {tablename} SET the_geom = st_setsrid(st_point({lon_column}, {lat_column}),4326)。这样 the_geom 就会被填满。为了确保我也会这样做 UPDATE {tablename} SET the_geom_webercator = st_transform(the_geom, 3857)。当然你可以在这里使用st_buffer等
  • 您也可以像现在尝试的那样进行实时地理编码查询,只要确保有唯一的 cartodb_id、适当的 the_geom(在 wgs84 中)和 the_geom_webmercator (在 epsg3857 投影中,就像你一样)。如果您的数据以某种方式动态更新,这更有意义,否则我会一次性 UPDATE 到 table.
  • 使用 Builder 地理编码分析。这会创建另一个包含地理编码数据的 'virtual' 实时数据集,这可以用于地图视图或进一步分析。恐怕这不能在 carto.js 地图中 done/shown,这仅在 Builder 中。

p.s。您可以在 https://gis.stackexchange.com/questions/tagged/carto

中找到更多与 carto 相关的帖子