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 结构中尝试一些启发式方法将其添加到映射中。例如,如果您有列名
latitude
和 longitude
,那么 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 相关的帖子
我已使用 .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 结构中尝试一些启发式方法将其添加到映射中。例如,如果您有列名
latitude
和longitude
,那么 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 相关的帖子