Katsaus Helsingin kaupungin aluejakojen ja palvelukartan rajapintoihin

data
lahiohanke
wfs
spatial data
paikkatieto
R
Tekijä

Markus Kainu

Julkaistu

2. helmikuuta 2021

Helsingin kaupungilla on (ainakin) kaksi WFS-rajapintaa paikkatiedon jakamiseen: geoserver.hel.fi/geoserver/ows ja kartta.hel.fi/ws/geoserver/avoindata/wfs. Tässä katsauksessa käydään läpi rajapintojen sisältöä eri aluerajojen/-jakojen osalta.

Aluerajapinnat

Rajapinta: geoserver.hel.fi/geoserver/ows

Tämän rajapinnan aluejaot käsittävät sekä Helsingin, mutta etenkin koko pääkaupunkiseudun ja Uudenmaan muiden kuntien sisäisiä aluejakoja. Taulukkoon ja karttaan on otettu mukaan jaot, joiden nimi sisältää jonkin seuraavista alue|piiri|raja|kaupunginosa sanoista, mutta EI sisällä mitään näistä viher|melu|vesi|meri|nuohous|katu|lento|teollisuus|suojelu|nimet|postinume|asuinal. Kaikenkaikkiaan 109 aluejaosta 52 täyttävät nämä ehdot. Hoveroimalla osoitinta alueen päällä näet kerroksen tiedot!

[/kode]
if (FALSE){
  library(ows4R)
  wfs <- WFSClient$new("http://geoserver.hel.fi/geoserver/ows",
                       serviceVersion = "1.0.0",
                       logger = "INFO")
  caps <- wfs$getCapabilities()
  ft <- caps$findFeatureTypeByName("", exact = FALSE)
  data_lst <- list()
  if (length(ft) == 0) next()
  
  for (i in 1:length(ft)){
    data_lst[[i]] <- tibble(name = ft[[i]]$getName(),
                            title = ft[[i]]$getTitle())
  }
  api_df01 <- do.call(bind_rows, data_lst)

  # suodatetaan
  # api_df01 <- readRDS("./api_df01.RDS")
  apitmp <- api_df01[grepl("alue|piiri|raja|kaupunginosa", api_df01$name, ignore.case = T),]
  apitmp2 <- apitmp[!grepl("viher|melu|vesi|meri|nuohous|katu|lento|teollisuus|suojelu|nimet|postinume|asuinal", apitmp$name, ignore.case = T),]
  # print(apitmp2, n = 200)
  saveRDS(apitmp2, "./api_df01.RDS")
    
  shapelist <- list()
  # rm(shape)
  for (i in 1:nrow(apitmp2)){
    if (!exists("shape")) rm(shape)
    ft <- caps$findFeatureTypeByName(apitmp2$name[i], exact = TRUE)
    try(shape <- ft$getFeatures())
    if (!exists("shape")) next()
    st_crs(shape) <- ft$getDefaultCRS()
    
    # Jos ei yhtään riviä
    if (nrow(shape) == 0) next()
    # Jos rivejä mutta ei sf-objekti
    if (!any(is(shape) %in% "sf")) next()
    geometry_type <- as.character(unique(sf::st_geometry_type(shape)))
    if (geometry_type == "CURVEPOLYGON") next()
    if (geometry_type %in% "MULTISURFACE"){
      shape <- st_cast(shape, "GEOMETRYCOLLECTION") %>%
         st_collection_extract("POLYGON")
    }
    geometry_type <- as.character(unique(sf::st_geometry_type(shape)))
    # print(geometry_type)
    # try(shape %>% select(1) %>% plot())
    # if (geometry_type %in% "CURVEPOLYGON") next()

# if (F){
  
  # espoo <- "+proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=25500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"
  
  # sf::st_crs(shape) <- espoo
    # shape <- sf::st_transform(x = shape, crs = espoo)
  
    # sf::st_crs(shape) <- "+init=epsg:3067"
    # shape <- sf::st_transform(x = shape, crs = "+init=epsg:3067")
    shape <- sf::st_transform(x = shape, crs = "+proj=longlat +datum=WGS84")
    leaflet(shape) %>% addTiles() %>% addPolygons()
    
    
    
    shapelist[[i]] <- list("name" = apitmp2$name[i],
                           "title" = apitmp2$title[i],
                           "shape" = shape,
                           "geometry_original" = geometry_type#,
                           # "geometry_converted" = geometry_type_new
                           )
  }
  names(shapelist) <- seq_along(shapelist)
  shapelist01 <- Filter(Negate(is.null), shapelist)
  saveRDS(shapelist01, "./shapelist01.RDS")
}
api_df01 <- readRDS("./api_df01.RDS")
reactable::reactable(api_df01, filterable = TRUE)
[/kode]
shapelist01 <- readRDS("./shapelist01.RDS")
library(leaflet)

lflet <- leaflet() %>% 
  addTiles()
basegroups <- vector()
# for (ii in 32){
for (ii in 1:length(shapelist01)){
  if (ii %in% c(32)) next()
  # if (ii > 30) next()
  shape_wgs84 <- shapelist01[[ii]]$shape
  shape_name <- shapelist01[[ii]]$name
  geotype <- as.character(unique(sf::st_geometry_type(shape_wgs84)))
  if (geotype %in% "MULTISURFACE"){
            shape_wgs84 <- st_cast(shape_wgs84, "GEOMETRYCOLLECTION") %>%
               st_collection_extract("POLYGON")
  }
  
  label_data <- shape_wgs84 %>% st_drop_geometry()
  
  labs <- purrr::map(1:nrow(label_data), get_values, dat = label_data)

  lflet <- lflet %>% 
    addPolygons(data = shape_wgs84, group = shape_name, label = lapply(labs, HTML))
  
  lflet <- lflet %>% 
    addPolygons(data = shape_wgs84, group = shape_name)
  basegroups <- c(basegroups, shape_name)
}
lflet %>% addLayersControl(baseGroups = basegroups)