인트라넷에서 지도 서비스를 사용하고 싶은 5-지오코더편 2-

이전 기사

리버스 지오코더



전회, 살락과 소개했지만, 지리원 지도에는 위도 경도로부터 주소를 빼내는 기능이 아래의 화상 빨간 프레임부 등 몇개인가 사용되고 있다.


동대 지오코더가 사용되고 있다.
데이터를 보낸 경우 LonLatToAddress.json이라는 파일이 반환됩니다.
내용에 대해서는, 아래와 같이
h tp // m레ゔぇr 세게오코데 r. g. . jp/레ゔぇr세게오코데 r/ぉ응아아 dd s?ぉ=139.229393 & t=35.521259

LonLatToAddress.json
{
  "results":{
    "muniCd":"14402",
    "lv01Nm":"宮ヶ瀬"
  }
}

이에 관해서는 LonLaToAddress.json을 돌려주면 아래의 빨간색 프레임 부분이 표시된다고 생각했지만, 실제로는 위의 빨간색 프레임 부분에 사용되고 있었다.
전회 사용한 DmGeocoder에 리버스 지오코더 기능도 탑재되고 있으므로, 그것을 바탕으로 만든 리버스 지오코를 소개한다.
DmGeocoder에 위도 경도를 보냈다고해도 muniCd를 돌려주지 않기 때문에, muniCd.js에 기재되어 있는 muniCd를 바탕으로 csv로 미리 muniCd의 리스트를 제작해 둔다.

muniCd.csv
 1101,北海道札幌市中央区

작성한 리스트의 우측의 주소와 DmGeocoder에 위도 경도를 보내 얻은 데이터를 비교해, 일치한 물건의 muniCd와 주소를 json으로 돌려주고 있다.

LonLatToAddress.php
<?php
ini_set('display_errors', 'ON');
error_reporting(E_ALL);
mb_internal_encoding('UTF-8');

$LIB_DIR = realpath(dirname(__FILE__).'/../src/').'/';
require_once $LIB_DIR.'Dm/Geocoder.php';
require_once $LIB_DIR.'Dm/Geocoder/Address.php';
require_once $LIB_DIR.'Dm/Geocoder/Prefecture.php';
require_once $LIB_DIR.'Dm/Geocoder/Query.php';
require_once $LIB_DIR.'Dm/Geocoder/GISCSV.php';
require_once $LIB_DIR.'Dm/Geocoder/GISCSV/Finder.php';
require_once $LIB_DIR.'Dm/Geocoder/GISCSV/Reader.php';

$lat = $_POST['lat'];
$lon = $_POST['lon'];
$Srh = Dm_Geocoder::reverseGeocode($lat,$lon,1);
$a = $Srh[0]->prefectureName;
$b = $Srh[0]->municipalityName;
$c = $Srh[0]->localName;
$Srh = $a.$b.$c;

$csv = file_get_contents(dirname(__File__).'/data/MuniCd.csv');
$csv = explode("\n",$csv);
foreach($csv as &$value){
    $value = mb_substr($value,0,-1,"UTF-8");
    $value = explode(',',$value);
    if(mb_strpos($Srh,$value[1])!==false){
        $hako = array(
            "results" => $point = array(
                "muniCd" => $value[0],
                "lv01Nm" => str_replace ($value[1],"",$Srh),
        ),
    );
    break;
    }
}  

function raw_json_encode($input, $flags = 0) {
    $fails = implode('|', array_filter(array(
        '\\\\',
        $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
        $flags & JSON_HEX_AMP ? 'u0026' : '',
        $flags & JSON_HEX_APOS ? 'u0027' : '',
        $flags & JSON_HEX_QUOT ? 'u0022' : '',
    )));
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    $callback = function ($m) {
        return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
    };
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}

header('Content-type: application/json; charset=utf-8');
echo raw_json_encode($hako);
?>

지리원지도측은, gsimaps.js에 기재가 있는 이하와 같이 기재되어 있으므로 URL을 변경한다.

gsimaps.js
CONFIG.SERVERAPI.GETADDR = "https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress";

또, ajax로 type이 지정되어 있지 않기 때문에 POST를 지정한다.

gsimaps.js
$.ajax({
            type: "POST",
            url: CONFIG.SERVERAPI.GETADDR,
            dataType: "json",
            data: {
              lon: record.geometry.coordinates[0],
              lat: record.geometry.coordinates[1]
            },

반복하지만, 주소 검색 결과 부분은 이것으로 반영된다.

요약



할 수 있는 것은 한정되지만, 지리원 지도에서 사용하고 싶은 기능은 대체로 망라할 수 있었으므로, 이상으로 끝내고 싶다.
졸린 프로그램과 문서에 여기까지 교제해 주신 분 감사합니다.
향후, 변경하는 일이 있으면, 또, 기사에 대해서도 갱신해 간다……지도 모른다.

참고로 한 사이트



국토지리원 정보 보급과 공식 GitHub
국토지리원
국토지리원 -지리원 타일 사양-
국토지리원 -지리원 타일 일람-
국토 교통성 -국토 수치 정보-
국토교통성 -구국토수치정보-
도쿄대학 지오코더
Github demouth -DmGeocoder-
Github Hidenori FUJIMURA-지리원 지도의 지오코더 현상-
y2blog-WEB 맵 시스템 Misc.-
Qiita json_encode의 JSON_UNESCAPED_UNICODE에 PHP5.3으로 대응
Wikipedia -geojson-
webGIS를 직접 만들어보고 싶습니다.

좋은 웹페이지 즐겨찾기