Térkép poligon koordináták letöltése Openstreetmap adatokból

1
0

R-ben szeretnék települési poligonokat tartalmazó térképet:
olyat, amilyen itt is van:

enter image description here
Forrás:KSH

Ha ggplot2-t használok, akkor elég, ha a települési poligonok koordinátái és valami településazonosító van hozzá (lat, long, id). Ha van shapefile, akkor persze egyszerű, de települési szintű teljes shapefile nincs az országról.

Az openstreetmap alapján elvileg le lehet kérni ilyen adatokat, de sajnos nem minden településre.

Van egy kis program, amivel elég sokadatot ki lehet nyerni:

# települések neve egy vektorba
stl <- osm_telep[,1]

# függvény a koordináták összegyűjtéséhez =====================

osm_poly <- function(settlement_q){

  # web lekérdezéshez állandó részek: 
  nmt1 <- "http://nominatim.openstreetmap.org/search?q="
  nmt2 <-"&format=xml&polygon=1&limit=1&countrycodes=hu"
  # kereső kifejezés:
  search_string <- paste0(nmt1, settlement_q, nmt2, collapse = "")  

  require(XML2R)
  # Település koordinátái és egyebek
  dt <- XML2R(search_string)
  # poligonok
  pp <- dt[[2]][6]
  # tisztogatás
  pp2 <- substr(x = pp, start = 2, stop = nchar(pp)-1)
  # poligon koordináták kinyerése
  pp3 <- unlist(regmatches(x = pp2, gregexpr("[[:digit:]]+.[[:digit:]]+", pp2)))
  # koordináták rendezése
  long <- as.numeric(pp3[seq(from = 1,to = length(pp3), by = 2)])
  lat <- as.numeric(pp3[seq(from = 2,to = length(pp3), by = 2)])

  # települési adat
  dt_k <- data.frame(long=long, lat=lat, NEV=settlement_q)

  if (i==1) {
    map <<- dt_k
  } else{
    map <<-rbind(map, dt_k)  
  }
  return(map)
}

# ============== fg. vége =============================

# végrehajtás
for (i in 1:length(stl)){
  osm_poly(settlement_q = stl[i])
}

Hogyan lehetne a hiányzó adatokat letölteni? Úgy tűnik, a poligonok ott vannak valami adatbázisban, hiszen láthatóak, csak mintha rossz helyen keresném. A cél az lenne, hogy az ország összes települési poligonjának koordinátái egy állományban legyenek, és egyszerű legyen olyasmit rajzolni, mint a fenti képen.
pl.: Balatoncsicsó

  • H.Gergely kérdezte 3 év ago
  • Utoljára szerkesztve 3 év ago
  • You must to post comments
1
0

Végül sikerült.

osm_ways <- function(settlement_q){
  require(XML2R)
  # web lekérdezéshez állandó részek: 
  nmt1 <- "http://api.openstreetmap.org/api/0.6/relation/"
  # keresõ kifejezés:
  search_string <- paste0(nmt1, settlement_q, collapse = "")  
  # Település koordinátái és egyebek
  dt <- XML2R(search_string)
  # település határoló vonalai és még néhány más
  dt_k <- as.data.frame(dt[[3]][,1:3], stringsAsFactors = F)
  dt_k$osm_id=settlement_q
  return(dt_k)
}

Ez csak a letöltés, és csak egy településre. az összes településre le kell futtatni. Az eredmény egy jó nagy data.frame, amit még ki kell tisztítani, hogy csak a határoló vonalak maradjanak meg. Majd fel kell dolgozni a hungary-latest.osm-et, ami letölthető, és pl. QGIS segítségével egyszerűen lehet belőle sqlite adatbázist készíteni, amit mát használhatunk.
Tehát a vonalak pontjait kiszedjük az adatbázisból. (select way_id as way, node_id as node, way_pos, lat, lon as long from ways_nodes as t1 left join nodes as t2 on t1.node_id = t2.id) Aztán településenként rendezzük, úgy, hogy a szakaszok (és pontjaik) egymás után következzenek. Mivel vannak több darabból álló települések is, ezt a maradékkal is el kell játszani. A teljes kód elég hosszú, és még finomítani kellene.
Programok Az adatok nincsenek ott, és még csak ismerkedem a githubbal.

  • You must to post comments
1 találat mutatása
Új válasz írása

Please first to submit.