FlatGeobuf를 사용한 서버 없는 역형상 인코딩

이 글은 FlatGeobuf라는 지리 공간 데이터 형식을 사용하여 위도 경도 등 좌표에서 주소 정보를 얻는 역기하학적 인코딩을 실현한 예를 소개한다.
시위는 이쪽부터 시작하세요.

FlatGeobuf란?


https://flatgeobuf.org/
공간 정보(도로와 공항 등의 위치가 있는 정보)에서는 벡터 데이터를 저장하는 형식 중의 하나이다.특징은 대체로 다음과 같은 세 가지다.
  • HTTP 등을 통해 스트리밍 액세스가 가능합니다.
  • 흐름 전송 접근 시 공간 필터를 지정할 수 있습니다.
  • 간소화 기하학(점, 선, 다각형 등의 형상)이 없기 때문에 분석 처리도 가능
  • FlatGeobuf를 HTTP를 통해 접근할 수 있는 곳에 두면 공간 검색 형식으로 벡터의 원시 데이터를 보낼 수 있습니다.
    그리고 파일만 놓으면 된다.(실제로 CORS 등 조금 설정된 부분이 있다)
    이러한 특징을 보면 AWS3과 Google Cloud Storage 등은 클라우드 저장소를 사용하기에 적합한 송신 형식이라고 할 수 있다.개발된 사람들도 클라우드 저장소의 이용에 신경을 쓴 것 같다.
    또한 FlatGeobuf의 읽기, 쓰기에서 GDAL3이 사용됩니다.1 이후, QGIS3.16 이후 대응하기 때문에 전환 처리의 난이도가 높지 않다.
    일반적인 PostGIS와 같은 데이터베이스와MapServer GeoServer에 의존하지 않고 클라우드 저장소에 데이터를 저장하면 역기하학 인코딩 기능을 실현할 수 있다.

    demore Pri


    확인 가능여기서 실제 역기하학 인코딩을 할 수 있어요..

    사전 사용 시 고려 사항


    demore Pri에서 Cloudflare Workers를 사용하여 역형상 인코딩 처리를 수행합니다.
    Cloudflare Workers에 요청하면 입력한 위치 정보(위도, 경도)가 전송됩니다.또한 Cloudflare Workers에 대한 액세스 로그도 제공됩니다.여기서 개인을 식별할 수는 없지만, 자기 집 등 잘 알려지지 않은 위치 정보를 보내지 않는 것을 추천한다.

    해본 일


    나는 이런 느낌을 받았다.
  • 데이터의 가공/변환
  • FaaS의 역형상 인코딩
  • 지도를 보면서 좌표를 지정할 수 있는 전단부 개발
  • 사용할 데이터 세트


    GeoNLP 프로젝트'지명'연구 프로젝트의 일환으로 Geoshape 창고에서 국세조사 정정, 자 등 다른 경계 데이터 집합인 정정, 자의 경계 데이터(다각형)를 공개했다.이 데이터는 TopoJSON(GeoJSON보다 토폴로지로 압축하는 형식)으로 공개된다.이번에는 제가 이걸 다운로드할 수 있도록 허락해 주세요.셰이프 파일처럼 널리 유통되는 형태는 아니지만 웹GIS 등에서는 비교적 사용하기 쉬운 형태다.벡터 타일도 제공된다.
    TopoJSON은 QGIS 등을 통해 읽을 수 있기 때문에 여기에 있는 데이터에 정정급 주소 정보를 추가할 수 있다.
    실제 데이터의 내용을 보면 이런 느낌이다.

    '도쿄도 분쿄(文京)구 후락(後樂) 1정목'과 같은 마치딘(町丁)자 등급의 영역이 분할됐다.이미지에서 데이터 내의 인구 정보를 사용하여 색을 구분한다.노란색은 인구가 많고 파란색은 인구가 적다.

    관동권 전체로 보면 산간부 등 인구가 적은 지역은 정정·자가 상당히 넓고 대도시권은 좁지만 인구가 밀집해 있다.
    본론으로 돌아가서 이번에는 저희 TopoJSON 데이터와 결합하여 거대한 벡터 데이터를 만들어서 FlatGeobuf로 전환했습니다.

    역코딩을 해보도록 하겠습니다.


    데이터만 준비하면 내부 처리가 간단해진다.
  • 요구하고 싶은 좌표를 지정하고 찌르기
  • 핀에 버퍼를 넣고 포위함 만들기
  • 포위함의 데이터만 얻기(FlatGeobuf가 잘하는 처리)
  • 핀의 INTERRSECTS 조건과 일치하는 데이터의 속성 정보를 읽고 주소
  • 를 결정합니다.

    이런 느낌이야.INTERSECTS의 판정 사용turf.js.
    https://turfjs.org/
    실제 인코딩은 이런 느낌입니다.
    import { geojson } from "flatgeobuf"
    import booleanIntersects from "@turf/boolean-intersects"
    import { polygon, point } from "@turf/helpers"
    
    const getTownName = (x, y) => {
      //対象地点
      const target = point([x, y])
      //バウンディングボックスのバッファ
      const buffer = 0.0000001
      //検索対象にするバウンディングボックスの作成
      const rect = { minX: x - buffer, maxX: x + buffer, minY: y - buffer, maxY: y + buffer }
    
    
      //空間フィルタリングをかけながらデータ取得
      for await (const feature of geojson.deserialize(fgbURL, rect)) {
        const prop = feature.properties
        const pref = prop["PREF_NAME"] ? prop["PREF_NAME"] : ""
        const city = prop["CITY_NAME"] ? prop["CITY_NAME"] : ""
        const town = prop["S_NAME"] ? prop["S_NAME"] : ""
        const townName = pref + city + town
        //turfのポリゴンへ
        const geom = polygon(feature.geometry.coordinates)
        //ここでINTERSECTSを判定してさらに絞り込む
        const intersects = booleanIntersects(target, geom)
        if (intersects) return townName
      }
      return "not found."
    }
    
    이번 FlatGeobuf는 Google Cloud Storage에 구성됩니다.요청 헤더에 지정Range할 수 있다면 S3 등 환경에서도 일할 수 있을 것 같습니다.
    주의해야 할 것은 편지봉투에 랑이가 함유되어 있기 때문에 단순히 요구할 수 없다는 것이다.
    또 CDN을 사용할 때는 CORS로 인한 예비비행을 캐시하는 것이 좋다.
    Popular CDNs, like Cloudfront, support Range Requests, but don’t cache the requisite preflight OPTIONS requests by default. Consider enabling OPTIONS request caching . Without this, the preflight authorization request could be much slower than necessary.
    https://flatgeobuf.org/
    이번에는 Cloudflare Workers라는 FaaS에서 일련의 해석(지명이 반환될 때까지)을 실시했지만 클라이언트 측에서 직접 해석할 수도 있다.그러나 현재 FlatGeobuf의 자바스크립트가 낡은 사파리에 설치되어 실행되지 않을 수도 있습니다.(BigInt 연결이 이루어지지 않을 수 있음)
    다른 한편, FlatGeobuf는 속성을 검색하는 용도(예를 들어 전국의'000촌'을 추출하는 용도)에 적용되지 않는다.결국 공간 인덱스를 통해 공간 검색에 적합한 형식이다.일반적인 기하학적 인코딩과 같은 상황에서 각종 DB를 사용하는 것이 비교적 적합하다고 생각한다.

    장치 사전 처리 작업 지침


    기재여기 데모 어플.의 간단한 조작 설명.
    지도를 클릭하거나 지도를 클릭하면 표시가 설정됩니다.
    태그를 설정한 후 [태그의 주소 검색] 버튼을 누르면 주소가 표시됩니다.

    Cloudflare Workers에서 Flatgeobuf를 얻는 것은 속도 방면의 과제이기 때문에 시작하면R2 갈아타고 싶습니다.

    일반 역형상 인코딩 API


    다음은 일반적인 역형상 인코딩 API에 대해 설명합니다.

  • 국토지리원 API
    지리원 지도에서 장소를 선택할 때 "근처 주소"를 표시하는 API입니다.
  • Nominatim
  • Amazon Location Service
  • 국토지리원의 API는 대개 원본이 같기 때문에 비슷한 정보를 회신한다.Nominatim에서 가장 가까운 POI 주소를 반납했을 수도 있습니다.

    최후


    나는 응용 프로그램에서 공간 정보의 원시 데이터를 조금 사용해서 무엇을 하고 싶지만, PostGIS와MapServer 등을 세우는 것은 매우 어렵다. 이런 상황에서 FlatGeobuf는 유용한 특성을 가지고 있다.
    HTTP를 통해 가장 적합한 원시 공간 데이터 형식을 보내는 절차를 마련하는 것이 요즘 뜨겁다.베타(2D)에는 FlatGeobuf, 울타리Cloud Optimized GeoTIFF 등이 있다.
    이대로 두면 필요한 양만 섭취하는 원본 데이터가 편리하고, 자치체의 오픈 데이터 등도 이런 형태로 배포되면 이용자 입장에서는 온라인을 통해 사용하기 쉬워질 수 있다.

    데이터 출처


    인구 센서스 정정자 등 경계 데이터 집합 | Geoshape 창고
    '국세조사 정정·자 등 별경계 데이터집'(CODH 제작)'평성 27년 국세조사 정정·자 등 별경계 데이터'(NICT 가공)
    상술한 데이터를 가공 이용하다.

    좋은 웹페이지 즐겨찾기