library(ggmap)
## Cargando paquete requerido: ggplot2
## ℹ Google's Terms of Service: <https://mapsplatform.google.com>
##   Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
##   OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
register_stadiamaps(key = "6340e866-7c8b-424d-a4a2-1a3587de8c87")
library(sf)
## Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
library(ggplot2)
library(ggmap)
library(sp)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Registrar la clave de API de Stadia Maps (reemplaza "TU_API_KEY" con tu clave)
register_stadiamaps(key = "6340e866-7c8b-424d-a4a2-1a3587de8c87")

# 1. Definir las coordenadas de los clientes en formato geográfico (lat, lon)
clientes <- data.frame(
  id = c("Cliente A", "Cliente B", "Cliente C", "Cliente D"),
  lat = c(19.434, 19.497, 19.424, 19.459),
  lon = c(-99.133, -99.146, -99.196, -99.091)
)

# Asegurarnos de que el objeto `clientes` sea un `data.frame`
clientes <- as.data.frame(clientes)

# Verificar las primeras filas y nombres de las columnas
head(clientes)  # Verifica las primeras filas
##          id    lat     lon
## 1 Cliente A 19.434 -99.133
## 2 Cliente B 19.497 -99.146
## 3 Cliente C 19.424 -99.196
## 4 Cliente D 19.459 -99.091
colnames(clientes)  # Asegúrate de que las columnas sean lat, lon, id
## [1] "id"  "lat" "lon"
# 2. Corregir los nombres de las columnas si es necesario
clientes <- clientes %>%
  rename(lon = lon, lat = lat, id = id)  # Asegúrate de que los nombres estén bien

# 3. Mostrar las coordenadas originales en un mapa de la Ciudad de México
cdmx_map <- get_stadiamap(bbox = c(left = -99.25, bottom = 19.3, right = -98.95, top = 19.6), zoom = 12, maptype = "stamen_terrain")
## ℹ © Stadia Maps © Stamen Design © OpenMapTiles © OpenStreetMap contributors.
# Mostrar el mapa con las ubicaciones de los clientes
ggmap(cdmx_map) +
  geom_point(data = clientes, aes(x = lon, y = lat, color = id), size = 3) +
  labs(title = "Ubicaciones Originales de los Clientes en la Ciudad de México") +
  theme_minimal()

# 4. Convertir coordenadas geográficas (lat, lon) a coordenadas cartesianas (UTM)
coordinates(clientes) <- ~ lon + lat
proj4string(clientes) <- CRS("+proj=longlat +datum=WGS84")

# Convierte a coordenadas UTM (cartesianas)
clientes_utm <- spTransform(clientes, CRS("+proj=utm +zone=14 +datum=WGS84"))
clientes_utm_df <- as.data.frame(coordinates(clientes_utm))
names(clientes_utm_df) <- c("x", "y")

# 5. Aplicar el método k-medias para determinar las ubicaciones óptimas de los almacenes
set.seed(0)
kmeans_result <- kmeans(clientes_utm_df, centers = 2)

# Obtener los centroides de cada cluster en coordenadas cartesianas
centroides_cartesianos <- kmeans_result$centers

# 6. Convertir las coordenadas de los centroides de vuelta a geográficas (lat, lon)
centroides_df <- data.frame(centroides_cartesianos)
coordinates(centroides_df) <- ~ x + y
proj4string(centroides_df) <- CRS("+proj=utm +zone=14 +datum=WGS84")
centroides_geo <- spTransform(centroides_df, CRS("+proj=longlat +datum=WGS84"))
centroides_geo_df <- as.data.frame(coordinates(centroides_geo))
names(centroides_geo_df) <- c("lon", "lat")


clientes <- as.data.frame(clientes)
centroides_geo_df <- as.data.frame(centroides_geo_df)
is.data.frame(clientes)  # Esto debe devolver TRUE
## [1] TRUE
is.data.frame(centroides_geo_df)  # Esto debe devolver TRUE
## [1] TRUE
colnames(clientes)
## [1] "id"  "lat" "lon"
colnames(centroides_geo_df)
## [1] "lon" "lat"
clientes$lat <- as.numeric(clientes$lat)
clientes$lon <- as.numeric(clientes$lon)

centroides_geo_df$lat <- as.numeric(centroides_geo_df$lat)
centroides_geo_df$lon <- as.numeric(centroides_geo_df$lon)

library(ggplot2)
library(ggmap)



# 7. Mostrar los resultados en un mapa con las ubicaciones finales en la Ciudad de México
# Mostrar en el mapa las ubicaciones de los clientes y los posibles almacenes
ggmap(cdmx_map) +
  geom_point(data = clientes, aes(x = lon, y = lat, color = id), size = 6) +
  geom_point(data = centroides_geo_df, aes(x = lon, y = lat), color = "yellow", size = 2, shape = 15) +
  labs(title = "Ubicaciones de Clientes y Posibles Almacenes en la Ciudad de México") +
  theme_minimal()

# Mostrar las coordenadas de los clientes y los centroides de almacenes
cat("Coordenadas geográficas de los clientes (Lat/Lon):\n")
## Coordenadas geográficas de los clientes (Lat/Lon):
print(clientes[, c("lat", "lon")])
##      lat     lon
## 1 19.434 -99.133
## 2 19.497 -99.146
## 3 19.424 -99.196
## 4 19.459 -99.091
cat("\nCoordenadas geográficas de los centroides de almacenes (Lat/Lon):\n")
## 
## Coordenadas geográficas de los centroides de almacenes (Lat/Lon):
print(centroides_geo_df[, c("lat", "lon")])
##        lat       lon
## 1 19.42400 -99.19600
## 2 19.46333 -99.12333
# Crear un objeto sf (Simple Feature) para las coordenadas geográficas
clientes_sf <- st_as_sf(clientes, coords = c("lon", "lat"), crs = 4326)
centroides_sf <- st_as_sf(centroides_geo_df, coords = c("lon", "lat"), crs = 4326)

# Convertir de geográficas (CRS: 4326) a un sistema cartesiano (CRS: 3857)
clientes_cartesianos <- st_transform(clientes_sf, crs = 3857)
centroides_cartesianos <- st_transform(centroides_sf, crs = 3857)

# Mostrar las coordenadas cartesianas
cat("\nCoordenadas cartesianas de los clientes (X/Y):\n")
## 
## Coordenadas cartesianas de los clientes (X/Y):
print(st_coordinates(clientes_cartesianos))
##              X       Y
## [1,] -11035435 2206100
## [2,] -11036882 2213538
## [3,] -11042448 2204919
## [4,] -11030760 2209051
cat("\nCoordenadas cartesianas de los centroides de almacenes (X/Y):\n")
## 
## Coordenadas cartesianas de los centroides de almacenes (X/Y):
print(st_coordinates(centroides_cartesianos))
##              X       Y
## [1,] -11042448 2204919
## [2,] -11034359 2209563
# Mostrar las coordenadas finales de los puntos de almacenes
cat("\nDatos de coordenadas finales de los puntos de almacenes (Lat/Lon):\n")
## 
## Datos de coordenadas finales de los puntos de almacenes (Lat/Lon):
print(centroides_geo_df[, c("lat", "lon")])
##        lat       lon
## 1 19.42400 -99.19600
## 2 19.46333 -99.12333
cat("\nDatos de coordenadas cartesianas finales de los puntos de almacenes (X/Y):\n")
## 
## Datos de coordenadas cartesianas finales de los puntos de almacenes (X/Y):
print(st_coordinates(centroides_cartesianos))
##              X       Y
## [1,] -11042448 2204919
## [2,] -11034359 2209563
library(ggplot2)
library(ggmap)
library(dplyr)
library(sf)

# Asegúrate de que los datos de clientes y centroides están listos
clientes <- as.data.frame(clientes)
centroides_geo_df <- as.data.frame(centroides_geo_df)

# Asegúrate de que las coordenadas son numéricas
clientes$lat <- as.numeric(clientes$lat)
clientes$lon <- as.numeric(clientes$lon)
centroides_geo_df$lat <- as.numeric(centroides_geo_df$lat)
centroides_geo_df$lon <- as.numeric(centroides_geo_df$lon)

# Crear un objeto sf (Simple Feature) para las coordenadas geográficas
clientes_sf <- st_as_sf(clientes, coords = c("lon", "lat"), crs = 4326)
centroides_sf <- st_as_sf(centroides_geo_df, coords = c("lon", "lat"), crs = 4326)

# Convertir de geográficas (CRS: 4326) a un sistema cartesiano (CRS: 3857)
clientes_cartesianos <- st_transform(clientes_sf, crs = 3857)
centroides_cartesianos <- st_transform(centroides_sf, crs = 3857)

# Convertir de cartesianas (CRS: 3857) de vuelta a geográficas (CRS: 4326)
clientes_geograficas_revertidas <- st_transform(clientes_cartesianos, crs = 4326)
centroides_geograficas_revertidas <- st_transform(centroides_cartesianos, crs = 4326)

# Mostrar las coordenadas originales y las revertidas para verificar
cat("Coordenadas originales de los clientes (Lat/Lon):\n")
## Coordenadas originales de los clientes (Lat/Lon):
print(clientes[, c("lat", "lon")])
##      lat     lon
## 1 19.434 -99.133
## 2 19.497 -99.146
## 3 19.424 -99.196
## 4 19.459 -99.091
cat("\nCoordenadas revertidas de los clientes (Lat/Lon):\n")
## 
## Coordenadas revertidas de los clientes (Lat/Lon):
print(st_coordinates(clientes_geograficas_revertidas))
##            X      Y
## [1,] -99.133 19.434
## [2,] -99.146 19.497
## [3,] -99.196 19.424
## [4,] -99.091 19.459
cat("\nCoordenadas originales de los centroides de almacenes (Lat/Lon):\n")
## 
## Coordenadas originales de los centroides de almacenes (Lat/Lon):
print(centroides_geo_df[, c("lat", "lon")])
##        lat       lon
## 1 19.42400 -99.19600
## 2 19.46333 -99.12333
cat("\nCoordenadas revertidas de los centroides de almacenes (Lat/Lon):\n")
## 
## Coordenadas revertidas de los centroides de almacenes (Lat/Lon):
print(st_coordinates(centroides_geograficas_revertidas))
##              X        Y
## [1,] -99.19600 19.42400
## [2,] -99.12333 19.46333
# Comparar las diferencias entre las coordenadas originales y revertidas
clientes_diff <- cbind(clientes[, c("lat", "lon")], st_coordinates(clientes_geograficas_revertidas))
colnames(clientes_diff) <- c("lat_original", "lon_original", "lat_revertida", "lon_revertida")

cat("\nDiferencias de coordenadas para los clientes (Lat/Lon):\n")
## 
## Diferencias de coordenadas para los clientes (Lat/Lon):
print(clientes_diff)
##   lat_original lon_original lat_revertida lon_revertida
## 1       19.434      -99.133       -99.133        19.434
## 2       19.497      -99.146       -99.146        19.497
## 3       19.424      -99.196       -99.196        19.424
## 4       19.459      -99.091       -99.091        19.459
centroides_diff <- cbind(centroides_geo_df[, c("lat", "lon")], st_coordinates(centroides_geograficas_revertidas))
colnames(centroides_diff) <- c("lat_original", "lon_original", "lat_revertida", "lon_revertida")

cat("\nDiferencias de coordenadas para los centroides de almacenes (Lat/Lon):\n")
## 
## Diferencias de coordenadas para los centroides de almacenes (Lat/Lon):
print(centroides_diff)
##   lat_original lon_original lat_revertida lon_revertida
## 1     19.42400    -99.19600     -99.19600      19.42400
## 2     19.46333    -99.12333     -99.12333      19.46333
# Calcular las distancias entre las coordenadas originales y las revertidas para verificar la precisión
# Usamos la distancia en metros (distancia en el espacio proyectado)
clientes_distancia <- st_distance(clientes_sf, clientes_geograficas_revertidas)
centroides_distancia <- st_distance(centroides_sf, centroides_geograficas_revertidas)

cat("\nDistancias de los clientes entre las coordenadas originales y revertidas (en metros):\n")
## 
## Distancias de los clientes entre las coordenadas originales y revertidas (en metros):
print(clientes_distancia)
## Units: [m]
##              [,1]         [,2]         [,3]         [,4]
## [1,] 1.879740e-09 7.136641e+03 6.699296e+03 5.207776e+03
## [2,] 7.136641e+03 3.536621e-10 9.662794e+03 7.148266e+03
## [3,] 6.699296e+03 9.662794e+03 1.060986e-09 1.167739e+04
## [4,] 5.207776e+03 7.148266e+03 1.167739e+04 1.591479e-09
cat("\nDistancias de los centroides de almacenes entre las coordenadas originales y revertidas (en metros):\n")
## 
## Distancias de los centroides de almacenes entre las coordenadas originales y revertidas (en metros):
print(centroides_distancia)
## Units: [m]
##              [,1]         [,2]
## [1,] 1.581625e-09 8.785625e+03
## [2,] 8.785625e+03 1.060986e-09
# Realizar un gráfico para comparar la ubicación en el mapa
ggmap(cdmx_map) +
  geom_point(data = clientes, aes(x = lon, y = lat, color = id), size = 3) +
  geom_point(data = centroides_geo_df, aes(x = lon, y = lat), color = "blue", size = 4, shape = 15) +
  labs(title = "Ubicaciones de Clientes y Posibles Almacenes en la Ciudad de México") +
  theme_minimal()