geom怎么把Z 轴改为负数

GIS技术:更新3D线数据并设置坐标系统
文章描述了在GIS数据库中使用SQL命令对3D线数据(line3d2)进行操作,包括合并点生成线并设置新的空间参考系。第一部分提取每两点间的线,第二部分对非特定gid的线对象调整z坐标并更新几何对象的SRID。


SELECT 
  ST_AsText(ST_MakeLine(
    ST_MakePoint(ST_X(ST_PointN(geom, 1)), ST_Y(ST_PointN(geom, 1)), ST_Z(ST_PointN(geom, 1))*10),
    ST_MakePoint(ST_X(ST_PointN(geom, 2)), ST_Y(ST_PointN(geom, 2)), ST_Z(ST_PointN(geom, 2)))
  )) AS merged_line
FROM "line3d2" 
WHERE gid = 20570;

UPDATE line3d2
SET geom = ST_SetSRID(
    ST_MakeLine(
        ST_MakePoint(ST_X(ST_PointN(geom, 1)), ST_Y(ST_PointN(geom, 1)), -ST_Z(ST_PointN(geom, 1))),
        ST_MakePoint(ST_X(ST_PointN(geom, 2)), ST_Y(ST_PointN(geom, 2)), -ST_Z(ST_PointN(geom, 2)))
    ),
    ST_SRID(geom)
)
WHERE gid != 20570;

> # 加载所需库 > suppressPackageStartupMessages({ + library(dplyr) + library(readxl) + library(ggplot2) + }) > # ---- 路径设置 ---- > data_path <- "D:/桌面/output_fewe_pairs/fewe_maps/final_merged_data.xlsx" # Excel 文件路径 > out_dir <- "D:/桌面/output_fewe_pairs/fewe_maps/scaling_results" > dir.create(out_dir, showWarnings = FALSE, recursive = TRUE) > # --- 1. 读取数据并检查 --- > df_raw <- read_excel(data_path) > # --- 2. 检查 population 列的前几行数据并查看是否有特殊符号或非数值字符 --- > message("检查 population 列的前几行:") 检查 population 列的前几行: > head(df_raw$population) # 查看前几行数据 [1] 660000 660000 660000 660000 660000 660000 > # 检查 population 列是否有任何特殊字符或者非数值字符 > message("检查是否有特殊字符:", any(grepl("[^0-9.]", df_raw$population))) 检查是否有特殊字符:TRUE > # 如果有非数值字符,去除所有非数字字符并转换为数值型 > df_raw <- df_raw %>% + mutate( + population = gsub("[^0-9.]", "", population), # 去除所有非数字字符 + population = as.numeric(population) # 转换为数值型 + ) > # --- 3. 检查 population 数据范围 --- > message("检查 population 数据范围:", summary(df_raw$population)) 检查 population 数据范围:905217042533500504517790.01666667548647531914300 > # 检查是否有过大的 population 值 > if(any(df_raw$population > 1e10)) { + message("存在异常的 population 值!") + } > # --- 4. 计算 log(population) 和 Fisher Z --- > df_raw <- df_raw %>% + mutate( + # 限制 rho 范围,避免 atanh(rho) 计算溢出 + rho_c = pmin(pmax(rho, -0.999), 0.999), # 将 rho 限制在 [-0.999, 0.999] + # 计算 Fisher Z 强度(绝对值) + z_abs = abs(atanh(rho_c)), + # 计算 log(population) + log_pop = log10(population) + ) > # --- 5. 检查计算后的结果 --- > message("📊 log(population) 范围:", round(min(df_raw$log_pop, na.rm = TRUE), 3), " ~ ", round(max(df_raw$log_pop, na.rm = TRUE), 3)) 📊 log(population) 范围:2.957 ~ 7.504 > message("📊 z_abs 范围:", round(min(df_raw$z_abs, na.rm = TRUE), 3), " ~ ", round(max(df_raw$z_abs, na.rm = TRUE), 3)) 📊 z_abs 范围:0 ~ 2.004 > # --- 6. 检查是否有无效的 z_abs 和 log_pop --- > sum(is.na(df_raw$z_abs)) # 检查 NA [1] 0 > sum(is.infinite(df_raw$z_abs)) # 检查 Inf [1] 0 > sum(is.na(df_raw$log_pop)) # 检查 log_pop NA [1] 0 > sum(is.infinite(df_raw$log_pop)) # 检查 log_pop Inf [1] 0 > # --- 7. 过滤:去掉无效值 --- > df_raw <- df_raw %>% filter(is.finite(z_abs), is.finite(log_pop)) # 只过滤无效值 > cat("过滤后的样本数:", nrow(df_raw), "\n") 过滤后的样本数: 1800 > # --- 8. 检查每个 pair 的记录数 --- > pair_counts <- df_raw %>% group_by(pair) %>% summarise(count = n(), .groups = "drop") > print(pair_counts) # A tibble: 6 × 2 pair count <chr> <int> 1 水-生态 300 2 粮食-水 300 3 粮食-生态 300 4 粮食-能源 300 5 能源-水 300 6 能源-生态 300 > # --- 9. 检查每个 pair 的 z_abs 和 log_pop 的最小、最大和标准差 --- > for (p in unique(df_raw$pair)) { + sub <- df_raw %>% filter(pair == p) + + message(paste("Pair:", p)) + message("z_abs 最小值:", min(sub$z_abs)) + message("z_abs 最大值:", max(sub$z_abs)) + message("z_abs 标准差:", sd(sub$z_abs)) + message("log_pop 最小值:", min(sub$log_pop)) + message("log_pop 最大值:", max(sub$log_pop)) + } Pair: 粮食-能源 z_abs 最小值:Inf z_abs 最大值:-Inf z_abs 标准差:NA log_pop 最小值:Inf log_pop 最大值:-Inf Pair: 粮食-水 z_abs 最小值:Inf z_abs 最大值:-Inf z_abs 标准差:NA log_pop 最小值:Inf log_pop 最大值:-Inf Pair: 粮食-生态 z_abs 最小值:Inf z_abs 最大值:-Inf z_abs 标准差:NA log_pop 最小值:Inf log_pop 最大值:-Inf Pair: 能源-水 z_abs 最小值:Inf z_abs 最大值:-Inf z_abs 标准差:NA log_pop 最小值:Inf log_pop 最大值:-Inf Pair: 能源-生态 z_abs 最小值:Inf z_abs 最大值:-Inf z_abs 标准差:NA log_pop 最小值:Inf log_pop 最大值:-Inf Pair: 水-生态 z_abs 最小值:Inf z_abs 最大值:-Inf z_abs 标准差:NA log_pop 最小值:Inf log_pop 最大值:-Inf 共有24个警告 (用warnings()来显示) 这个是运行出来的结果,一直在重复出现这一错误
10-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值