Skip to content

rhinoce23/tarantula

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

tarantula

๋Œ€์šฉ๋Ÿ‰ ์š”์ฒญ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Reverse Geocoding ์„œ๋ฒ„ ๊ตฌํ˜„: ๊ณต๊ณต ๋ฐ์ดํ„ฐ ํ™œ์šฉ๊ณผ ํ•„์š”ํ•œ ๊ธฐ์ˆ  ์Šคํƒ ์ œ์‹œ

Abstract

๋ชจ๋นŒ๋ฆฌํ‹ฐ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ํ˜„์žฌ ์œ„์น˜์˜ ์ฃผ์†Œ๋ฅผ ํ‘œ์‹œํ•ด ์ฃผ๋Š” UX ๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ„๋‹ค.

์ฃผ์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ณ„์ธต ํด๋ฆฌ๊ณค๋“ค์€ ๊ตญ๊ฐ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ณต ๋ฐ์ดํƒ€์ด๋‹ค.

์œ„์น˜๋กœ ์ฃผ์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” reverse geocoding API ๋Š” ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์ค€์˜ ๋ฌด๋ฃŒ ๊ณต๊ณต API ์ฐพ๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค.
๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค ๋“ฑ์˜ ํฌํ„ธ ์œ„์น˜ ์„œ๋น„์Šค ํšŒ์‚ฌ์˜ ์œ ๋ฃŒ API ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ณต๊ณต ๋ฐ์ดํƒ€๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ œ์‹œํ•œ๋‹ค.

Introduction

ํ•œ ์ ์ด ํด๋ฆฌ๊ณค์— ํฌํ•จ ๋˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š”๊ฑด "ray casting algorithm" ์ด๋‹ค.

mysql, postgres ๊ฐ™์€ RDB ์˜ geometry ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋ ค๊ณ  ํ…Œ์ด๋ธ”์— ๋„ฃ๊ณ  ์ฟผ๋ฆฌ๋กœ ํ•˜๋ฉด ์‰ฝ์ง€ ์•Š์„๊นŒ ?
์‰ฝ๋‹ค, ํ•˜์ง€๋งŒ ๋А๋ฆฐ ์‘๋‹ต ์†๋„ ํŠนํžˆ ํŒŒ์ผ์ด ๋ฉ”๋ชจ๋ฆฌ ์บ์‰ฌ๋กœ ์ „ํ™˜๋˜๋Š” ์‹œ์ ์—์„œ ์„œ๋ฒ„๋Š” ํญ์ฃผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๊ทธ๋ ‡๋‹ค๊ณ  ํŒŒ์ผ ๋ณด๋‹ค ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ฃ์–ด์„œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์บ์‰ฌ์— ์˜ฌ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฑด ๊ตณ์ด RDB ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์—†๋‹ค.

์›๋ณธ ํŒŒ์ผ shapefile ์„ ๋กœ๋”ฉํ•ด์„œ spatial index ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉํ•ด์„œ ์„œ๋ฒ„๋กœ ์„œ๋น™ํ•œ๋‹ค.
๋งŽ์€ ๊ฐœ๋ฐœ ํ•ญ๋ชฉ๋“ค์ด ์žˆ์„๊ฑฐ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค 25๋…„ ํ˜„์žฌ ๋„ˆ๋ฌด ์ข‹์€ ์˜คํ”ˆ ์†Œ์Šค๋“ค์ด ๋งŽ๋‹ค.

๊ณต๊ณต ๋ฐ์ดํƒ€๋กœ ๋‹ค์šด๋ฐ›์€ shapfile ์„ ์‚ฌ์šฉํ•ด์„œ ์ฃผ์†Œ ์ง€๋ฒˆ ํด๋ฆฌ๊ณค๊นŒ์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
์ ์ ˆํ•œ ์–ธ์–ด, geometry ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ œ์‹œํ•œ๋‹ค ์ปจ๋ฒ„ํ„ฐ, ํด๋ฆฌ๊ณค ํŽธ์ง‘ํˆด๋„ ๊ตฌํ˜„ํ•œ๋‹ค.

๋ฐ์ดํƒ€๋ฅผ ๊ณต๊ฐœํ• ๋•Œ ๋ช‡๊ฐ€์ง€ ๊ณ ๋ คํ•  ์‚ฌํ•ญ์„ ์ œ์‹œํ•œ๋‹ค.

Implementation

LLM ์—†์—ˆ๋‹ค๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•˜์„๊ฑฐ๋‹ค.

Tech Stack

rust "server"

์ž๋ฐ”/์ฝ”ํŠธ๋ฆฐ, ํŒŒ์ด์„ , node(javascript), ... ๋กœ ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค.
ํฌํ„ธ ์ˆ˜์ค€์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ๋‹นํ•˜๋ ค๋ฉด ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋“ ๋‹ค.
ํŠธํŒจํ”ฝ์ด ๋งŽ์€ ๋ถ€๋ถ„์€ apache/nginx ์˜ c/c++ module, erlang, ๊ฐ™์€ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค.
golang ์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ณณ๋„ ๋งŽ๋‹ค ๋Ÿฌ๋‹์ปค๋ธŒ๋Š” ๋‚ฎ๊ณ  ์ž๋ฐ” ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์ ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋Š” ๋ฌด์—ˆ์ผ๊นŒ?
์ปดํŒŒ์ผ๋งŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ถˆํ•„์š”, ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ณด์žฅ, ... ๋„ˆ๋ฌด ์ข‹๋‹ค.
๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋งŽ์ง€๋งŒ LLM ์„ ์ด์šฉํ•˜๋‹ˆ ๊ทธ๋ฆฌ ๋ถ€๋‹ด์€ ๋˜์ง€ ์•Š์•˜๋‹ค.

์ง€์—ญ๋ณ„ ๊ณ„์ธต ํด๋ฆฌ๊ณค์„ par_iter() ๋กœ ๋ณ‘๋ ฌ ๋กœ๋”ฉํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ

config.districts
  .par_iter()
  .try_for_each(|district| {
    config.district_par
      .par_iter()
      .try_for_each(|name|
        self.load_district_par_polygons(
          config,
          district, 
          name,
          config.debug, 
          &config.debug_name,
        )
      )?;
    config.district_par_any
      .par_iter()
      .try_for_each(|name|
        self.load_district_par_any_polygons(
          config,
          district, 
          name,
          config.debug, 
          &config.debug_name,
        )
      )
    })?;

s2geometry "geometry spatial index"

Eric Veach ๊ฐ€ ๊ตฌ๊ธ€ Maps ์— ๋“ค์–ด์™€์„œ ๋งŒ๋“ค์—ˆ๋‹ค.

S2 is a library for spherical geometry that aims to have the same robustness,
flexibility, and performance as the very best planar geometry libraries.

autocxx "rust binding c++"

s2geometry ๊ฐ€ rust ๋กœ ์ „์ฒด๊ฐ€ ํฌํŒ…๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.
rust ์—์„œ c++ ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด autocxx ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

config "toml"

์„ค์ • ํŒŒ์ผ์„ ํ”„๋กœ๊ทธ๋žจ์„ ์ž์œ ๋กญ๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.
xml, json, yml ... ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.
๊ทธ ์ค‘ ์ตœ์•…์€ ์—ญ์‹œ xml ์ธ๊ฒƒ ๊ฐ™๋‹ค.

config.toml ์„ค์ • ํŒŒ์ผ์—์„œ ๋ฐ์ดํƒ€ ๋กœ๋”ฉ, ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.

[search.shapefile]
path = "./data/converted"

[search.shapefile.attributes]
"TL_SCCO_CTPRVN" = { level = 1, names =  ["CTPRVN_CD", "CTP_KOR_NM", "CTP_ENG_NM"]}
"TL_SCCO_SIG" = { level = 2, names = ["SIG_CD", "SIG_KOR_NM", "SIG_ENG_NM"]}
"TL_SCCO_EMD" = { level = 3, names = ["EMD_CD", "EMD_KOR_NM", "EMD_ENG_NM"]}
"TL_SCCO_LI" = { level = 4, names = ["LI_CD", "LI_KOR_NM", "LI_ENG_NM"]}
"AL_D002_" = { level = 5, names = ["A3", "A4", "A5"]}

[search]
districts = [
  #"11000",    
  #"41000",    
  #"46000", 
  "36000",   
]

hierarchies = [
  "TL_SCCO_CTPRVN",
]

district_par = [
  "TL_SCCO_SIG",
  "TL_SCCO_EMD",
  "TL_SCCO_LI",
]

district_par_any = [
  "AL_D002_"
]

[rest]
port = 8080
host = "localhost"

[grpc]
port = 8090
host = "localhost"

electron "editing geometry"

์˜ค๋ฅ˜ ํด๋ฆฌ๊ณค์„ ํŽธ์ง‘ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
UI ํ”„๋กœ๊ทธ๋žจ์€ ๋ณ„๋„์˜ uikit ์—†์ด ์›น html ๋กœ ํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋‹ค.
shapefile ์„ ๋กœ๋”ฉํ•ด์„œ ํด๋ฆฌ๊ณค์„ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•œ๋‹ค.

์›น ๊ธฐ์ˆ (HTML, CSS, JavaScript)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.
๊ฐ„๋‹จํžˆ ๋งํ•ด, ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์›น ๊ฐœ๋ฐœ ๊ฒฝํ—˜๊ณผ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ
Windows, macOS, Linux์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋‹ค.
LLM ์œผ๋กœ ๋ฐ”์ด๋ธŒ ์ฝ”๋”ฉํ•ด์„œ ๊ฐœ๋ฐœํ•œ๋‹ค.

postman "rest, grpc api test"

rest, grpc ๋ฅผ test ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค

Data

๊ตญ๊ฐ€๋Š” ๋Œ€ํ•œ๋ฏผ๊ตญ์œผ๋กœ ํ•œ๋‹ค.
ํ–‰์ •๊ตฌ์—ญ์€ ๊ณ„์ธต์„ ๊ฐ€์ง„๋‹ค ex) ๊ฒฝ๊ธฐ๋„(์‹œ๋„) > ์šฉ์ธ์‹œ ์ˆ˜์ง€๊ตฌ(์‹œ๊ตฐ๊ตฌ) > ์‹ ๋ด‰๋™(์๋ฉด๋™) > ์‹ ๋ด‰1๋กœ 214
๊ตญ๊ฐ€๋ฅผ level0, ๊ฒฝ๊ธฐ๋„ level1, ... ๋กœ ์ •์˜ ํ•œ๋‹ค

ํ–‰์ •๊ตฌ์—ญ ํด๋ฆฌ๊ณค์€ "์ฃผ์†Œ๊ธฐ๋ฐ˜์‚ฐ์—…์ง€์›์„œ๋น„์Šค(์ œ๊ณตํ•˜๋Š” ์ฃผ์†Œ)" ์—์„œ level1 ๋‹จ์œ„๋กœ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค
์ง€๋ฒˆ์€ "v-world ๋””์ง€ํ„ธ ๊ตญํ†  ํŠธ์œˆ > ์—ฐ์†์ง€์ ๋„ํ˜•์ •๋ณด" ์—์„œ level1 ๋‹จ์œ„๋กœ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ–‰์ •๊ตฌ์—ญ ํด๋ฆฌ๊ณค

์ฃผ์†Œ๊ธฐ๋ฐ˜์‚ฐ์—…์ง€์›์„œ๋น„์Šค(์ œ๊ณตํ•˜๋Š” ์ฃผ์†Œ), ์ขŒํ‘œ๊ณ„(ITRF2000), ๊ธฐ์ค€ํƒ€์›์ฒด(GRS80), ํˆฌ์˜๋ฒ•(UTM), ์žฅ๋ฐ˜๊ฒฝ(6,378,137m)
https://business.juso.go.kr/addrlink/adresInfoProvd/guidance/provdAdresInfo.do
์ „์ž์ง€๋„ ๋‹ค์šด๋กœ๋“œ > ๋„๋กœ๋ช…์ฃผ์†Œ ์ „์ž์ง€๋„

  • ์„ธ์ข…ํŠน๋ณ„์‹œ 36000.zip
์‹œ๋„ TL_SCCO_CTPRVN.shp 
์‹œ๊ตฐ๊ตฌ TL_SCCO_SIG.shp 
์๋ฉด๋„ TL_SCCO_EMD.shp 
๋ฆฌ TL_SCCO_LI.shp 

์ง€๋ฒˆ, premise ํด๋ฆฌ๊ณค

์—ฐ์†์ง€์ ๋„ํ˜•์ •๋ณด, EPSG:5186(GRS80)
https://www.vworld.kr/dtmk/dtmk_ntads_s002.do?svcCde=NA&dsId=23

  • ์„ธ์ข…ํŠน๋ณ„์‹œ
AL_D002_36_20250504.zip

์ด์Šˆ๋“ค

์›๋ณธ ๋ฐ์ดํƒ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…ํ•˜๊ธฐ ๋ถˆํŽธํ•œ ์ด์Šˆ๋“ค์ด ์žˆ๋‹ค.

  • euc_kr ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ
  • ํ†ต์ผ๋˜์ง€ ์•Š์€ ์ขŒํ‘œ๊ณ„
  • ํŒŒ์ผ ํฌ๊ธฐ
์›๋ณธ ์ปจ๋ฒ„์ ผ

convert ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด euc_kr, 5179 ์ขŒํ‘œ๊ณ„๋ฅผ utf8, 4326 ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ 12MB ๊ฐ€ ๋„˜์œผ๋ฉด 60๋งŒ๊ฐœ ๋ณด๊ฐ„์  ํ•œ๊ณ„๋กœ ํŒŒ์ผ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.

go run convert.go -h
../data/source/46000/AL_D002_46_20250204.shp -> ../data/all_converted/46000/AL_D002_46_20250204_part1.shp
../data/all_converted/46000/AL_D002_46_20250204_part2.shp
../data/all_converted/46000/AL_D002_46_20250204_part3.shp
...
../data/all_converted/46000/AL_D002_46_20250204_part24.shp
../data/all_converted/46000/AL_D002_46_20250204_part25.shp
../data/source/46000/TL_SCCO_CTPRVN.shp -> ../data/all_converted/46000/TL_SCCO_CTPRVN.shp
s2gemetry polygon validation

s2geometry ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋กœ๋”ฉํ•  ์ˆ˜ ์—†๋Š” polygon ์„ ๋ˆ„๋ฝ ์‹œํ‚จ๋‹ค.
์•„๋ž˜ ๊ฐ™์€ ์˜ค๋ฅ˜๋“ค์ด ๋‚˜์˜จ๋‹ค.

  • ์ค‘๋ณต ํฌ์ธํŠธ, ERROR Edge 1990 is degenerate (duplicate vertex)
  • ์„œ๋กœ ๊ฒน์น˜๋Š” ์„ ๋ถ„, ERROR Edge 455 crosses edge 457
  • outer, inner curvature
  • empty polygon
cargo test -- --nocapture test_search_polygon   
cargo test -- --nocapture test_load_polygon   
์˜ค๋ฅ˜ ํด๋ฆฌ๊ณค ํŽธ์ง‘

์˜ค๋ฅ˜ ํด๋ฆฌ๊ณค์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
์•„๋ž˜ ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

npm run start -- --shapefile-path ../data/converted/46000/TL_SCCO_EMD.shp    
npm run start -- --shapefile-path ../data/all_converted/46000/AL_D002_46_20250204_6_part22.shp 
'u' ์—…๋ฐ์ดํŠธ, 'x' ์„ ํƒ ์ทจ์†Œ, 's' ์ €์žฅ

์•„๋ž˜ ์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ์›๋ณธ ๋ฐ์ดํƒ€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค
image image image image

์‹คํ–‰

cargo run
    Running `target/debug/tarantula`
load_district_polygons 36000 TL_SCCO_SIG elapsed: 129.599833ms
load_district_polygons 36000 TL_SCCO_EMD elapsed: 297.3095ms
load_district_polygons 36000 TL_SCCO_LI elapsed: 311.834583ms
/github/s2geometry/src/s2/s2loop.cc:131 ERROR Edge 0 crosses edge 2
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part4.shp load_polygon 5-2 error_code: 1
/github/s2geometry/src/s2/s2loop.cc:131 ERROR Edge 18 crosses edge 21
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part4.shp load_polygon 38-4 error_code: 1
/github/s2geometry/src/s2/s2loop.cc:131 ERROR Edge 5 crosses edge 21
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part4.shp load_polygon 81-1 error_code: 1
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part4.shp load_polygon 138-2 error_code: 3
/github/s2geometry/src/s2/s2loop.cc:131 ERROR Edge 0 crosses edge 3
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part2.shp load_polygon 524 error_code: 1
/github/s2geometry/src/s2/s2loop.cc:131 ERROR Edge 767 crosses edge 770
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part3.shp load_polygon 24-1 error_code: 1
/github/s2geometry/src/s2/s2loop.cc:131 ERROR Edge 4 crosses edge 8
/github/tarantula/data/all_converted/36000/AL_D002_36_20250504_part3.shp load_polygon 134-1 error_code: 1
load_district_par_any_polygons 36000 AL_D002_ elapsed: 9.017407292s
Search load elapsed: 9.467750875s
grpc server listening on [::1]:8090
rest api server listening on [::1]:8080
  • rest api
image
  • grpc api
image

์„ฑ๋Šฅ

  • rest api apple m1 pro 32G
ab -n 1000000 -c 60 "http://localhost:8080/tarantula?lon=126.973826366&lat=37.532190912"
Server Software:
Server Hostname:        localhost
Server Port:            8080

Document Path:          /tarantula?lon=126.973826366&lat=37.532190912
Document Length:        208 bytes

Concurrency Level:      60
Time taken for tests:   59.478 seconds
Complete requests:      1000000
Failed requests:        0
Total transferred:      317000000 bytes
HTML transferred:       208000000 bytes
Requests per second:    16812.83 [#/sec] (mean)
Time per request:       3.569 [ms] (mean)
Time per request:       0.059 [ms] (mean, across all concurrent requests)
Transfer rate:          5204.75 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.8      0     116
Processing:     0    3   3.6      3     125
Waiting:        0    3   3.5      3     125
Total:          0    4   3.6      3     125
  • grpc api
bash pref_grpc.sh pref_grpc_req.json

Conclusion

์ •๋ถ€๊ฐ€ ๊ณต๊ณต๋ฐ์ดํƒ€๋‚˜ api ๋ฅผ ๊ณต๊ฐœํ• ๋•Œ ๊ณ ๋ คํ•  ์‚ฌํ•ญ

  • ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ๊ณผ ์ •ํ™•์„ฑ ํฌ๋งท ์˜ค๋ฅ˜๋‚˜ ๋ถˆ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ์€ utf8, ์ขŒํ‘œ๊ณ„ EPSG:4326 ๋กœ ํŠน์ดํ•œ ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด ํ†ต์ผ ํ•œ๋‹ค
    2์ฐจ ๊ฐ€๊ณต์ด ํ•„์š”์—†๊ฒŒ ์„œ๋น„์Šค์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ…Œ์ŠคํŠธ๋„ ํ•ด์•ผ ํ•œ๋‹ค
  • API ๊ธฐ์ˆ ์  ์•ˆ์ •์„ฑ API์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์šฉ๋Ÿ‰, ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ, ์žฅ์•  ๋Œ€์‘ ๊ณ„ํš์„ ์ค€๋น„ํ•ด์•ผ ํ•œ๋‹ค
    ์ด ๋ถ€๋ถ„์ด ์ง€์† ๊ฐ€๋Šฅ์„ฑ์— ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ์ดํƒ€๋ฅผ ๊ณต๊ฐœ ํ•œ๋‹ค
  • ํ™œ์šฉ๋„์™€ ๊ณต๊ณต์„ฑ ๊ณต๊ณต๋ฐ์ดํ„ฐ์˜ ๋ชฉ์ ์ด ๊ตญ๋ฏผ์˜ ํŽธ์ต ์ฆ์ง„๊ณผ ๊ณต๊ณต ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌํšŒ์ ยท๊ฒฝ์ œ์  ๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ์„  ๊ณต๊ฐœํ•œ๋‹ค
    ๋‹ค์–‘ํ•œ ๋ถ„์•ผ(์˜ˆ: ๊ตํ†ต, ์˜๋ฃŒ, ํ™˜๊ฒฝ)์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ๊ณ ๋ คํ•œ๋‹ค
  • ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ๊ณผ ๊ฐœ์„  ๊ณต๊ฐœ ํ›„ ์‚ฌ์šฉ์ž ์˜๊ฒฌ์„ ์ˆ˜์ง‘ํ•ด ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ, API ๊ธฐ๋Šฅ, ๋ฌธ์„œ ๋“ฑ์„ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•œ๋‹ค

๊ธฐ์ˆ  ์Šคํƒ

  • ์„œ๋ฒ„๋Š” rust ์–ธ์–ด
  • geometry ์—”์ง„์€ s2geometry c++, autocxx
  • ๋””๋ฒ„๊น… ์›น์€ electron cross-platform web app

Quick Start

https://www.youtube.com/watch?v=zJDaM0ofj6Y

  • ์›๋ณธ ๋ฐ์ดํƒ€ ์••์ถ• ํ’€๊ธฐ
    ์„ธ์ข…ํŠน๋ณ„์‹œ ๋ฐ์ดํƒ€ data/source/36000.zip (ํ–‰์ •๊ณ„), AL_D002_36_20250504.zip (์ง€๋ฒˆ) ๊ฐ€ ์žˆ๊ณ 
    data/source/36000 ํด๋”์— ์••์ถ•์„ ํ‘ผ๋‹ค
bash data.sh
  • ํ•œ๊ธ€ ์ธ์ฝ”๋”ฉ, ์ขŒํ‘œ๊ณ„, ํŒŒ์ผ ํฌ๊ธฐ ๋ถ„ํ•  ์ปจ๋ฒ„์ ผ data/converted ํด๋”์— ์ปจ๋ฒ„์ ผ ํ•œ๋‹ค
cd shape_convert
go run convert.go
  • ์„œ๋ฒ„ ์‹คํ–‰
cargo run
  • ๋””๋ฒ„๊น… ์›น ์‹คํ–‰
cd shape_edit
npm install --save-dev electron
npm run start

About

Reverse geocoding implemented in Rust using public data

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors