@sk-global/js-msearch-gsi-jp 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,8 +11,9 @@
11
11
 
12
12
  ## Supported APIs
13
13
 
14
- - Geocoding API - `GET https://msearch.gsi.go.jp/address-search/AddressSearch?q=XXXX`
15
- - Reverse Geocoding API - `GET https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress?lat=XXXX&lon=XXXX`
14
+ * Geocoding API - `GET https://msearch.gsi.go.jp/address-search/AddressSearch?q=XXXX`
15
+ * Reverse Geocoding API - `GET https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress?lat=XXXX&lon=XXXX`
16
+
16
17
 
17
18
  ## Installation
18
19
 
@@ -26,62 +27,56 @@ Ensure you have Node.js version 18.0.0 or higher.
26
27
 
27
28
  ## How to use
28
29
 
29
- Import the library in your project and use the provided functions. Here is an example of how to use the openReverseGeocoder function:
30
+ Import the library in your project and use the provided functions. Here is an example of how to use the latLonToAddress function:
30
31
 
31
- ```javascript
32
- import { openReverseGeocoder } from '@sk-global/js-msearch-gsi-jp';
32
+ ```js
33
+ import { latLonToAddress } from '@sk-global/js-msearch-gsi-jp';
33
34
 
34
- const lnglat = [139.6917, 35.6895];
35
- const address = await openReverseGeocoder(lnglat);
35
+ const address = await latLonToAddress(35.6895, 139.6917);
36
36
 
37
- console.log(address);
38
37
  // Output:
39
- // { code: '13101', city: 'Chiyoda-ku' }
38
+ // { results: { muniCd: '13104', lv01Nm: '西新宿二丁目' } }
40
39
  ```
41
40
 
42
41
  ## Examples
43
42
 
44
- ### Example 1: Reverse Geocoding
43
+ Example 1: Reverse Geocoding
45
44
 
46
- ```javascript
47
- import { openReverseGeocoder } from '@sk-global/js-msearch-gsi-jp';
45
+ ```js
46
+ import { latLonToAddress } from '@sk-global/js-msearch-gsi-jp';
48
47
 
49
48
  async function getAddress() {
50
- const lnglat = [139.6917, 35.6895];
51
- const address = await openReverseGeocoder(lnglat);
49
+ const address = await latLonToAddress(35.6895, 139.6917);
52
50
 
53
- console.log(address);
54
51
  // Output:
55
- // { code: '13101', city: 'Chiyoda-ku' }
52
+ // { results: { muniCd: '13104', lv01Nm: '西新宿二丁目' } }
56
53
  }
57
-
58
- getAddress();
59
54
  ```
60
55
 
61
- ### Example 2: Search for a location by address
56
+ Example 2: Search for a location by address
62
57
 
63
- ```javascript
64
- import { searchAddress } from '@sk-global/js-msearch-gsi-jp';
58
+ ```js
59
+ import { searchResults } from '@sk-global/js-msearch-gsi-jp';
60
+ const q = '北海道';
61
+ const searchResults = await searchAddress(q);
62
+ console.log(searchResults);
65
63
 
66
- async function searchLocation() {
67
- const q = '北海道';
68
- const searchResults = await searchAddress(q);
69
- console.log(searchResults);
70
-
71
- // Output:
72
- // [
73
- // {
74
- // geometry: { coordinates: [Array], type: 'Point' },
75
- // type: 'Feature',
76
- // properties: { addressCode: '', title: '北海道' }
77
- // },
78
- // ...
79
- // ]
80
- }
81
-
82
- searchLocation();
64
+ // Output:
65
+ // [
66
+ // {
67
+ // geometry: { coordinates: [Array], type: 'Point' },
68
+ // type: 'Feature',
69
+ // properties: { addressCode: '', title: '北海道' }
70
+ // },
71
+ // {
72
+ // geometry: { coordinates: [Array], type: 'Point' },
73
+ // type: 'Feature',
74
+ // properties: { addressCode: '', title: '北海道' }
75
+ // },
76
+ // ...
77
+ // ]
83
78
  ```
84
79
 
85
80
  ## License
86
81
 
87
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
82
+ This library is released under the MIT License. For more information, see the [LICENSE](LICENSE) file.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { ReverseGeocodingResult } from './interfaces';
2
+ import { getMuniMap } from './muni';
2
3
  /**
3
4
  * Retrieves the elevation for a given longitude and latitude using the GSI API.
4
5
  *
@@ -31,4 +32,4 @@ declare const reverseGeocoder: ({ lon, lat, }: {
31
32
  lon: number;
32
33
  lat: number;
33
34
  }) => Promise<ReverseGeocodingResult>;
34
- export { reverseGeocoder, getElevation };
35
+ export { reverseGeocoder, getElevation, getMuniMap as getCityMap };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("global-mercator"),r=require("axios"),t=require("axios-cache-interceptor"),o=require("d3-geo"),n=require("mapbox-vector-tile");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/a(r);function s(){return s=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},s.apply(null,arguments)}var l={JP:{zoomBase:10,tileUrl:"https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf",layer:"japanese-admins",getResult:function(e){var r,t;return{code:5===String(e.id).length?String(e.id):"0"+String(e.id),prefecture:null==(r=e.properties)?void 0:r.prefecture,city:null==(t=e.properties)?void 0:t.city}}}};l.DEFAULT=l.JP;var c=t.setupCache(i.default.create({timeout:2e3}),{ttl:864e5});c.interceptors.request.use(function(e){var r=""+e.baseURL+e.url+"?"+new URLSearchParams(e.params).toString();return console.log("Full URL:",r),e});var u=l.DEFAULT;exports.getElevation=function(e){var r=e.lon,t=e.lat;try{return Promise.resolve(c.get("https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php",{responseType:"json",params:{lat:t,lon:r}})).then(function(e){var o=parseFloat(e.data.elevation);return{longitude:r,latitude:t,elevation:o}})}catch(e){return Promise.reject(e)}},exports.reverseGeocoder=function(r){var t=r.lon,a=r.lat;try{return Promise.resolve(function(r,l){try{var v=Promise.resolve(function(r){try{var t=s({},u,void 0),a=e.lngLatToGoogle(r,t.zoomBase),l=a[0],v=a[1];return Promise.resolve(function(e,r,t,o){void 0===o&&(o=i.default);try{var a,s=function(e){return new n.VectorTile(a)},l=t.tileUrl.replace("{z}",String(t.zoomBase)).replace("{x}",String(e)).replace("{y}",String(r)),c=function(e,r){try{var t=Promise.resolve(o.get(l,{responseType:"arraybuffer"})).then(function(e){a=Buffer.from(e.data,"binary")})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){throw e});return Promise.resolve(c&&c.then?c.then(s):s())}catch(e){return Promise.reject(e)}}(l,v,t,c)).then(function(e){return function(e,r,t,n,a){var i=Object.keys(e.layers);Array.isArray(i)||(i=[i]);var s={};return i.forEach(function(l){var c=e.layers[l];if(c&&a.layer===c.name)for(var u=0;u<c.length;u++){var v=c.feature(u).toGeoJSON(r,t,a.zoomBase);i.length>1&&(v.properties.vt_layer=l),o.geoContains({type:"FeatureCollection",features:[v]},n)&&(s=a.getResult(v))}}),s}(e,l,v,r,t)})}catch(e){return Promise.reject(e)}}([t,a]))}catch(e){return l()}return v&&v.then?v.then(void 0,l):v}(0,function(){return console.log("Failed to get city code from open reverse geocoder"),function(e){var r=e.lat,t=e.lon;try{return Promise.resolve(c.get("https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress",{responseType:"json",params:{lat:r,lon:t}})).then(function(e){var r=e.data.results;return{code:r.muniCd,city:r.lv01Nm}})}catch(e){return Promise.reject(e)}}({lat:a,lon:t})}))}catch(e){return Promise.reject(e)}};
1
+ var e=require("global-mercator"),r=require("axios"),t=require("axios-cache-interceptor"),o=require("d3-geo"),n=require("mapbox-vector-tile");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/a(r);function s(){return s=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},s.apply(null,arguments)}var c={JP:{zoomBase:10,tileUrl:"https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf",layer:"japanese-admins",getResult:function(e){var r,t;return{code:5===String(e.id).length?String(e.id):"0"+String(e.id),prefecture:null==(r=e.properties)?void 0:r.prefecture,city:null==(t=e.properties)?void 0:t.city}}}};c.DEFAULT=c.JP;var u=/GSI\.MUNI_ARRAY\["\d+"\]\s*=\s*'(.*?)';/g,l=t.setupCache(i.default.create({timeout:2e3}),{ttl:864e5});l.interceptors.request.use(function(e){var r=""+e.baseURL+e.url+"?"+new URLSearchParams(e.params).toString();return console.log("Full URL:",r),e});var p=c.DEFAULT;exports.getCityMap=function(){try{return Promise.resolve(function(e,r){try{var t=Promise.resolve(i.default.get("https://maps.gsi.go.jp/js/muni.js",{responseType:"text",timeout:500})).then(function(e){return r={},e.data.split("\n").forEach(function(e){if(u.test(e)){var t=function(e){var r=e.replace(u,"$1"),t=r.split(",");if(4!==t.length)throw new Error("invalid muni record: "+r);var o=t[0],n=t[1],a=t[2],i=t[3];return a=a.padStart(5,"0"),{prefCode:o=o.padStart(2,"0"),prefName:n,cityCode:a,cityName:i}}(e);r[t.cityCode]=t}}),r;var r})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){return console.log("Failed to get muni map: "+e),{}}))}catch(e){return Promise.reject(e)}},exports.getElevation=function(e){var r=e.lon,t=e.lat;try{return Promise.resolve(l.get("https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php",{responseType:"json",params:{lat:t,lon:r}})).then(function(e){var o=parseFloat(e.data.elevation);return{longitude:r,latitude:t,elevation:o}})}catch(e){return Promise.reject(e)}},exports.reverseGeocoder=function(r){var t=r.lon,a=r.lat;try{return Promise.resolve(function(r,c){try{var u=Promise.resolve(function(r){try{var t=s({},p,void 0),a=e.lngLatToGoogle(r,t.zoomBase),c=a[0],u=a[1];return Promise.resolve(function(e,r,t,o){void 0===o&&(o=i.default);try{var a,s=function(e){return new n.VectorTile(a)},c=t.tileUrl.replace("{z}",String(t.zoomBase)).replace("{x}",String(e)).replace("{y}",String(r)),u=function(e,r){try{var t=Promise.resolve(o.get(c,{responseType:"arraybuffer"})).then(function(e){a=Buffer.from(e.data,"binary")})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){throw e});return Promise.resolve(u&&u.then?u.then(s):s())}catch(e){return Promise.reject(e)}}(c,u,t,l)).then(function(e){return function(e,r,t,n,a){var i=Object.keys(e.layers);Array.isArray(i)||(i=[i]);var s={};return i.forEach(function(c){var u=e.layers[c];if(u&&a.layer===u.name)for(var l=0;l<u.length;l++){var p=u.feature(l).toGeoJSON(r,t,a.zoomBase);i.length>1&&(p.properties.vt_layer=c),o.geoContains({type:"FeatureCollection",features:[p]},n)&&(s=a.getResult(p))}}),s}(e,c,u,r,t)})}catch(e){return Promise.reject(e)}}([t,a]))}catch(e){return c()}return u&&u.then?u.then(void 0,c):u}(0,function(){return console.log("Failed to get city code from open reverse geocoder"),function(e){var r=e.lat,t=e.lon;try{return Promise.resolve(l.get("https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress",{responseType:"json",params:{lat:r,lon:t}})).then(function(e){var r=e.data.results;return{code:r.muniCd,city:r.lv01Nm}})}catch(e){return Promise.reject(e)}}({lat:a,lon:t})}))}catch(e){return Promise.reject(e)}};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/countryOptions.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n ReverseGeocodingOptions,\n ReverseGeocodingResultJP,\n} from './interfaces';\n\n/**\n * vector tiles settings for each country\n */\nconst countryOptions: { [s: string]: ReverseGeocodingOptions } = {\n JP: {\n zoomBase: 10,\n // tileUrl: `http://127.0.0.1:5500/docs/tiles/{z}/{x}/{y}.pbf`,\n tileUrl: 'https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf',\n layer: 'japanese-admins',\n getResult: function (feature: GeoJSON.Feature) {\n const res: ReverseGeocodingResultJP = {\n code:\n 5 === String(feature.id).length\n ? String(feature.id)\n : `0${String(feature.id)}`,\n prefecture: feature.properties?.prefecture,\n city: feature.properties?.city,\n };\n return res;\n },\n },\n};\n\n// default country options\ncountryOptions.DEFAULT = countryOptions.JP;\n\nexport default countryOptions;\n","import { lngLatToGoogle } from 'global-mercator';\nimport axios from 'axios';\nimport { setupCache } from 'axios-cache-interceptor';\nimport {\n ReverseGeocodingOptions,\n ReverseGeocodingResult,\n ReverseGeocodingResultJP,\n} from './interfaces';\nimport countryOptions from './countryOptions';\nimport { getTile, getTileResult } from './utils';\n\ntype LngLat = [number, number];\n\nconst api = setupCache(\n axios.create({\n timeout: 2000,\n }),\n {\n ttl: 60 * 60 * 24 * 1000, // 1 day\n }\n);\n\napi.interceptors.request.use((config) => {\n const fullUrl = `${config.baseURL}${config.url}?${new URLSearchParams(\n config.params\n ).toString()}`;\n console.log('Full URL:', fullUrl);\n return config;\n});\n\nconst defaultOptions = countryOptions.DEFAULT;\n\n/**\n * Performs reverse geocoding to obtain location information based on longitude and latitude.\n *\n * @param lnglat - The longitude and latitude coordinates.\n * @param options - Optional parameters for reverse geocoding.\n * @returns A promise that resolves to the reverse geocoding result.\n */\nconst openReverseGeocoder = async (\n lnglat: LngLat,\n options?: ReverseGeocodingOptions\n): Promise<ReverseGeocodingResult> => {\n const opt = { ...defaultOptions, ...options };\n const [x, y] = lngLatToGoogle(lnglat, opt.zoomBase);\n const tile = await getTile(x, y, opt, api);\n return getTileResult(tile, x, y, lnglat, opt);\n};\n\n/**\n * Performs reverse geocoding using the GSI (Geospatial Information Authority of Japan) API.\n * Given latitude and longitude coordinates, it returns the corresponding municipality code and city name.\n *\n * @param {Object} params - The parameters for the reverse geocoding request.\n * @param {number} params.lat - The latitude coordinate.\n * @param {number} params.lon - The longitude coordinate.\n * @returns {Promise<ReverseGeocodingResultJP>} A promise that resolves to an object containing the municipality code and city name.\n *\n * @example\n * const result = await gsiReverseGeocoder({ lat: 35.6895, lon: 139.6917 });\n * console.log(result); // { code: '13101', city: 'Chiyoda-ku' }\n */\nconst gsiReverseGeocoder = async ({\n lat,\n lon,\n}: {\n lat: number;\n lon: number;\n}) => {\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n const result = response.data;\n const {\n results: { muniCd: code, lv01Nm: city },\n } = result;\n return { code, city } as ReverseGeocodingResultJP;\n};\n\n/**\n * Retrieves the elevation for a given longitude and latitude using the GSI API.\n *\n * @param {Object} coordinates - The coordinates for which to get the elevation.\n * @param {number} coordinates.lon - The longitude of the location.\n * @param {number} coordinates.lat - The latitude of the location.\n * @returns {Promise<{ longitude: number, latitude: number, elevation: number }>}\n * A promise that resolves to an object containing the longitude, latitude, and elevation.\n */\nconst getElevation = async ({ lon, lat }: { lon: number; lat: number }) => {\n // first, get elevation from GSI\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n\n const elevation = parseFloat(response.data.elevation);\n return { longitude: lon, latitude: lat, elevation };\n};\n\n/**\n * Reverse geocodes the given longitude and latitude to obtain a city code.\n *\n * @param {Object} params - The parameters for reverse geocoding.\n * @param {number} params.lon - The longitude of the location.\n * @param {number} params.lat - The latitude of the location.\n *\n * @returns {Promise<ReverseGeocodingResult>} A promise that resolves to the reverse geocoding result.\n *\n * @throws Will attempt to use an alternative geocoding service if the primary service fails.\n */\nconst reverseGeocoder = async ({\n lon,\n lat,\n}: {\n lon: number;\n lat: number;\n}): Promise<ReverseGeocodingResult> => {\n // first, get city code from open reverse geocoder(local)\n try {\n const result = await openReverseGeocoder([lon, lat]);\n return result;\n } catch (error) {\n // if failed, get city code from GSI\n console.log('Failed to get city code from open reverse geocoder');\n return gsiReverseGeocoder({ lat, lon });\n }\n};\n\nexport { reverseGeocoder, getElevation };\n","import { geoContains } from 'd3-geo';\nimport axios, { AxiosInstance } from 'axios';\nimport { VectorTile } from 'mapbox-vector-tile';\nimport { ReverseGeocodingOptions, ReverseGeocodingResult } from './interfaces';\n\n/**\n * Get a tile from targeted country's tilesets by using x and y tile index\n * @param x x tile index\n * @param y y tile index\n * @param options ReverseGeocodingOptions\n * @param api Axios object\n * @returns VectorTile object\n */\nexport const getTile = async (\n x: number,\n y: number,\n options: ReverseGeocodingOptions,\n api: AxiosInstance = axios\n): Promise<VectorTile> => {\n const tileUrl = options.tileUrl\n .replace('{z}', String(options.zoomBase))\n .replace('{x}', String(x))\n .replace('{y}', String(y));\n\n let buffer;\n\n try {\n const res = await api.get(tileUrl, { responseType: 'arraybuffer' });\n buffer = Buffer.from(res.data, 'binary');\n } catch (error) {\n throw error;\n }\n\n const tile = new VectorTile(buffer);\n return tile;\n};\n\n/**\n * Get a result of reverse geocoding\n * @param tile VectorTile object\n * @param x x tile index\n * @param y y tile index\n * @param lnglat number[] longitude, latitude\n * @param options ReverseGeocodingOptions\n * @returns an object of result of reverse gecoding\n */\nexport const getTileResult = (\n tile: VectorTile,\n x: number,\n y: number,\n lnglat: [number, number],\n options: ReverseGeocodingOptions\n): ReverseGeocodingResult => {\n let layers = Object.keys(tile.layers);\n\n if (!Array.isArray(layers)) layers = [layers];\n\n let geocodingResult: ReverseGeocodingResult = {};\n layers.forEach((layerID) => {\n const layer = tile.layers[layerID];\n if (layer && options.layer === layer.name) {\n for (let i = 0; i < layer.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feature: any = layer.feature(i).toGeoJSON(x, y, options.zoomBase);\n if (layers.length > 1) feature.properties.vt_layer = layerID;\n\n const geojson = {\n type: 'FeatureCollection',\n features: [feature],\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = geoContains(geojson as any, lnglat);\n if (res) {\n geocodingResult = options.getResult(feature);\n }\n }\n }\n });\n return geocodingResult;\n};\n\n"],"names":["countryOptions","JP","zoomBase","tileUrl","layer","getResult","feature","_feature$properties","_feature$properties2","code","String","id","length","prefecture","properties","city","DEFAULT","api","setupCache","axios","create","timeout","ttl","interceptors","request","use","config","fullUrl","baseURL","url","URLSearchParams","params","toString","console","log","defaultOptions","_ref2","lon","lat","Promise","resolve","get","responseType","then","response","elevation","parseFloat","data","longitude","latitude","e","reject","_ref3","lnglat","opt","_extends","openReverseGeocoder","_lngLatToGoogle","lngLatToGoogle","x","y","options","buffer","_temp2","_result","VectorTile","replace","_temp","res","Buffer","from","_catch","error","getTile","tile","layers","Object","keys","Array","isArray","geocodingResult","forEach","layerID","name","i","toGeoJSON","vt_layer","geoContains","type","features","getTileResult","_ref","_result$results","results","muniCd","lv01Nm","gsiReverseGeocoder"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/countryOptions.ts","../src/muni.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n ReverseGeocodingOptions,\n ReverseGeocodingResultJP,\n} from './interfaces';\n\n/**\n * vector tiles settings for each country\n */\nconst countryOptions: { [s: string]: ReverseGeocodingOptions } = {\n JP: {\n zoomBase: 10,\n // tileUrl: `http://127.0.0.1:5500/docs/tiles/{z}/{x}/{y}.pbf`,\n tileUrl: 'https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf',\n layer: 'japanese-admins',\n getResult: function (feature: GeoJSON.Feature) {\n const res: ReverseGeocodingResultJP = {\n code:\n 5 === String(feature.id).length\n ? String(feature.id)\n : `0${String(feature.id)}`,\n prefecture: feature.properties?.prefecture,\n city: feature.properties?.city,\n };\n return res;\n },\n },\n};\n\n// default country options\ncountryOptions.DEFAULT = countryOptions.JP;\n\nexport default countryOptions;\n","// Muni file url\nconst MuniURL = 'https://maps.gsi.go.jp/js/muni.js';\nconst MuniRegex = /GSI\\.MUNI_ARRAY\\[\"\\d+\"\\]\\s*=\\s*'(.*?)';/g;\n\nimport axios from 'axios';\n\ninterface MuniRecord {\n prefCode: string;\n prefName: string;\n cityCode: string;\n cityName: string;\n}\n\ninterface MuniMap {\n [key: string]: MuniRecord;\n}\n\ninterface AddressResults {\n muniCd: string;\n lv01Nm: string;\n mesh_code?: string;\n notes?: string;\n}\n\n/**\n * parse muni.js\n * @param muniMap\n */\nconst parseMuniMap = (muniMap: string) => {\n const muniMapObj: MuniMap = {};\n const lines = muniMap.split('\\n');\n lines.forEach((line) => {\n if (MuniRegex.test(line)) {\n const muniRecord = parseMuniRecord(line);\n muniMapObj[muniRecord.cityCode] = muniRecord;\n }\n });\n return muniMapObj;\n};\n\n/**\n * parse muni record\n * @param line\n */\nconst parseMuniRecord = (line: string) => {\n const muniRecord = line.replace(MuniRegex, '$1');\n\n const muniRecordArray = muniRecord.split(',');\n\n // validate muni record\n if (muniRecordArray.length !== 4) {\n throw new Error(`invalid muni record: ${muniRecord}`);\n }\n\n let [prefCode, prefName, cityCode, cityName] = muniRecordArray;\n\n // if cityCode is not 5 digits, add 0 to the beginning\n cityCode = cityCode.padStart(5, '0');\n\n // if prefCode is not 2 digits, add 0 to the beginning\n prefCode = prefCode.padStart(2, '0');\n\n return {\n prefCode: prefCode,\n prefName: prefName,\n cityCode: cityCode,\n cityName: cityName,\n };\n};\n\n/**\n * Fetches the municipality map data from a specified URL.\n *\n * @returns {Promise<object>} A promise that resolves to the parsed municipality map data.\n *\n * @throws Will log an error message and return an empty object if the request fails.\n */\nconst getMuniMap = async () => {\n try {\n const response = await axios.get(MuniURL, {\n responseType: 'text',\n timeout: 500,\n });\n\n const muniMap = response.data;\n return parseMuniMap(muniMap);\n } catch (error) {\n console.log(`Failed to get muni map: ${error}`);\n return {};\n }\n};\n\n/**\n * converts muni code to address name.\n *\n * @param muniMap\n * @param muniCode\n */\nconst muniCodeToAddressName = (muniMap: MuniMap, muniCode: string) => {\n const muniRecord = muniMap[muniCode];\n if (!muniRecord) {\n throw new Error(`muni code ${muniCode} not found`);\n }\n\n const add = `${muniRecord.prefName}${muniRecord.cityName}`;\n return add.replace(/ /g, '');\n};\n\n/**\n * converts address result to address name.\n * @param muniMap\n * @param addressResults\n */\nconst addressResultsToAddressName = (\n muniMap: MuniMap,\n addressResults: AddressResults\n) => {\n const mc = addressResults.muniCd;\n const muniName = muniCodeToAddressName(muniMap, mc);\n const addrName = `${muniName}${addressResults.lv01Nm}`;\n return addrName;\n};\n\nconst getMuniMapLocations = async () => {\n const muniMap = await getMuniMap();\n // muniMap is a map of all cities and wards in Japan\n // key: city code, value: { prefCode, prefName, cityCode, cityName }\n // we need to convert this to a map of all locations in Japan\n // key: prefCode , value: { prefName, cities: { key: cityCode, value: { cityCode, cityName, wards: { key: wardCode, value: { wardCode, wardName } } } } }\n\n const muniMapLocations = {};\n Object.keys(muniMap).forEach((cityCode) => {\n const muniRecord = muniMap[cityCode];\n const { prefCode, prefName, cityName } = muniRecord;\n if (!muniMapLocations[prefCode]) {\n muniMapLocations[prefCode] = { prefName, cities: {} };\n }\n\n // if cityName contains ' ', it is a ward\n // otherwise, it is a city\n if (cityName.includes(' ')) {\n // ward name is after ' '\n const [name, wardName] = cityName.split(' ');\n // find city has the same name\n const city: any = Object.values(muniMap).find(\n (c: any) => c.cityName === name\n );\n if (!city) {\n console.log(`City ${name} not found in prefCode ${prefCode}`);\n } else {\n // add ward to city\n muniMapLocations[prefCode].cities[city.cityCode].wards[cityCode] = {\n prefCode,\n cityCode: cityCode,\n cityName: `${name}${wardName}`,\n bigCityFlag: '1',\n bigCityCode: city.cityCode,\n };\n }\n } else {\n muniMapLocations[prefCode].cities[cityCode] = {\n prefCode,\n cityCode,\n cityName,\n wards: {},\n };\n }\n });\n\n // assign bigCityFlag to each city\n Object.keys(muniMapLocations).forEach((prefCode) => {\n const pref = muniMapLocations[prefCode];\n Object.keys(pref.cities).forEach((cityCode) => {\n const city = pref.cities[cityCode];\n const isBigCity = Object.values(city.wards).length > 0;\n if (isBigCity) {\n city.bigCityFlag = '2';\n } else {\n // delete wards\n delete city.wards;\n // if city is tokyo then bigCityFlag is 3, otherwise 0\n if (city.prefCode === '13') {\n city.bigCityFlag = '3';\n } else {\n city.bigCityFlag = '0';\n }\n }\n });\n });\n\n return muniMapLocations;\n};\n\nexport { getMuniMap };\n","import { lngLatToGoogle } from 'global-mercator';\nimport axios from 'axios';\nimport { setupCache } from 'axios-cache-interceptor';\nimport {\n ReverseGeocodingOptions,\n ReverseGeocodingResult,\n ReverseGeocodingResultJP,\n} from './interfaces';\nimport countryOptions from './countryOptions';\nimport { getTile, getTileResult } from './utils';\n\nimport { getMuniMap } from './muni';\n\ntype LngLat = [number, number];\n\nconst api = setupCache(\n axios.create({\n timeout: 2000,\n }),\n {\n ttl: 60 * 60 * 24 * 1000, // 1 day\n }\n);\n\napi.interceptors.request.use((config) => {\n const fullUrl = `${config.baseURL}${config.url}?${new URLSearchParams(\n config.params\n ).toString()}`;\n console.log('Full URL:', fullUrl);\n return config;\n});\n\nconst defaultOptions = countryOptions.DEFAULT;\n\n/**\n * Performs reverse geocoding to obtain location information based on longitude and latitude.\n *\n * @param lnglat - The longitude and latitude coordinates.\n * @param options - Optional parameters for reverse geocoding.\n * @returns A promise that resolves to the reverse geocoding result.\n */\nconst openReverseGeocoder = async (\n lnglat: LngLat,\n options?: ReverseGeocodingOptions\n): Promise<ReverseGeocodingResult> => {\n const opt = { ...defaultOptions, ...options };\n const [x, y] = lngLatToGoogle(lnglat, opt.zoomBase);\n const tile = await getTile(x, y, opt, api);\n return getTileResult(tile, x, y, lnglat, opt);\n};\n\n/**\n * Performs reverse geocoding using the GSI (Geospatial Information Authority of Japan) API.\n * Given latitude and longitude coordinates, it returns the corresponding municipality code and city name.\n *\n * @param {Object} params - The parameters for the reverse geocoding request.\n * @param {number} params.lat - The latitude coordinate.\n * @param {number} params.lon - The longitude coordinate.\n * @returns {Promise<ReverseGeocodingResultJP>} A promise that resolves to an object containing the municipality code and city name.\n *\n * @example\n * const result = await gsiReverseGeocoder({ lat: 35.6895, lon: 139.6917 });\n * console.log(result); // { code: '13101', city: 'Chiyoda-ku' }\n */\nconst gsiReverseGeocoder = async ({\n lat,\n lon,\n}: {\n lat: number;\n lon: number;\n}) => {\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n const result = response.data;\n const {\n results: { muniCd: code, lv01Nm: city },\n } = result;\n return { code, city } as ReverseGeocodingResultJP;\n};\n\n/**\n * Retrieves the elevation for a given longitude and latitude using the GSI API.\n *\n * @param {Object} coordinates - The coordinates for which to get the elevation.\n * @param {number} coordinates.lon - The longitude of the location.\n * @param {number} coordinates.lat - The latitude of the location.\n * @returns {Promise<{ longitude: number, latitude: number, elevation: number }>}\n * A promise that resolves to an object containing the longitude, latitude, and elevation.\n */\nconst getElevation = async ({ lon, lat }: { lon: number; lat: number }) => {\n // first, get elevation from GSI\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n\n const elevation = parseFloat(response.data.elevation);\n return { longitude: lon, latitude: lat, elevation };\n};\n\n/**\n * Reverse geocodes the given longitude and latitude to obtain a city code.\n *\n * @param {Object} params - The parameters for reverse geocoding.\n * @param {number} params.lon - The longitude of the location.\n * @param {number} params.lat - The latitude of the location.\n *\n * @returns {Promise<ReverseGeocodingResult>} A promise that resolves to the reverse geocoding result.\n *\n * @throws Will attempt to use an alternative geocoding service if the primary service fails.\n */\nconst reverseGeocoder = async ({\n lon,\n lat,\n}: {\n lon: number;\n lat: number;\n}): Promise<ReverseGeocodingResult> => {\n // first, get city code from open reverse geocoder(local)\n try {\n const result = await openReverseGeocoder([lon, lat]);\n return result;\n } catch (error) {\n // if failed, get city code from GSI\n console.log('Failed to get city code from open reverse geocoder');\n return gsiReverseGeocoder({ lat, lon });\n }\n};\n\nexport { reverseGeocoder, getElevation, getMuniMap as getCityMap };\n","import { geoContains } from 'd3-geo';\nimport axios, { AxiosInstance } from 'axios';\nimport { VectorTile } from 'mapbox-vector-tile';\nimport { ReverseGeocodingOptions, ReverseGeocodingResult } from './interfaces';\n\n/**\n * Get a tile from targeted country's tilesets by using x and y tile index\n * @param x x tile index\n * @param y y tile index\n * @param options ReverseGeocodingOptions\n * @param api Axios object\n * @returns VectorTile object\n */\nexport const getTile = async (\n x: number,\n y: number,\n options: ReverseGeocodingOptions,\n api: AxiosInstance = axios\n): Promise<VectorTile> => {\n const tileUrl = options.tileUrl\n .replace('{z}', String(options.zoomBase))\n .replace('{x}', String(x))\n .replace('{y}', String(y));\n\n let buffer;\n\n try {\n const res = await api.get(tileUrl, { responseType: 'arraybuffer' });\n buffer = Buffer.from(res.data, 'binary');\n } catch (error) {\n throw error;\n }\n\n const tile = new VectorTile(buffer);\n return tile;\n};\n\n/**\n * Get a result of reverse geocoding\n * @param tile VectorTile object\n * @param x x tile index\n * @param y y tile index\n * @param lnglat number[] longitude, latitude\n * @param options ReverseGeocodingOptions\n * @returns an object of result of reverse gecoding\n */\nexport const getTileResult = (\n tile: VectorTile,\n x: number,\n y: number,\n lnglat: [number, number],\n options: ReverseGeocodingOptions\n): ReverseGeocodingResult => {\n let layers = Object.keys(tile.layers);\n\n if (!Array.isArray(layers)) layers = [layers];\n\n let geocodingResult: ReverseGeocodingResult = {};\n layers.forEach((layerID) => {\n const layer = tile.layers[layerID];\n if (layer && options.layer === layer.name) {\n for (let i = 0; i < layer.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feature: any = layer.feature(i).toGeoJSON(x, y, options.zoomBase);\n if (layers.length > 1) feature.properties.vt_layer = layerID;\n\n const geojson = {\n type: 'FeatureCollection',\n features: [feature],\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = geoContains(geojson as any, lnglat);\n if (res) {\n geocodingResult = options.getResult(feature);\n }\n }\n }\n });\n return geocodingResult;\n};\n\n"],"names":["countryOptions","JP","zoomBase","tileUrl","layer","getResult","feature","_feature$properties","_feature$properties2","code","String","id","length","prefecture","properties","city","DEFAULT","MuniRegex","api","setupCache","axios","create","timeout","ttl","interceptors","request","use","config","fullUrl","baseURL","url","URLSearchParams","params","toString","console","log","defaultOptions","Promise","resolve","get","responseType","then","response","muniMapObj","data","split","forEach","line","test","muniRecord","replace","muniRecordArray","Error","prefCode","prefName","cityCode","cityName","padStart","parseMuniRecord","_catch","error","e","reject","_ref2","lon","lat","elevation","parseFloat","longitude","latitude","_ref3","lnglat","opt","_extends","openReverseGeocoder","_lngLatToGoogle","lngLatToGoogle","x","y","options","buffer","_temp2","_result","VectorTile","_temp","res","Buffer","from","getTile","tile","layers","Object","keys","Array","isArray","geocodingResult","layerID","name","i","toGeoJSON","vt_layer","geoContains","type","features","getTileResult","_ref","_result$results","results","muniCd","lv01Nm","gsiReverseGeocoder"],"mappings":"qcAQA,IAAMA,EAA2D,CAC/DC,GAAI,CACFC,SAAU,GAEVC,QAAS,6EACTC,MAAO,kBACPC,UAAW,SAAUC,GAAwB,IAAAC,EAAAC,EAS3C,MARsC,CACpCC,KACE,IAAMC,OAAOJ,EAAQK,IAAIC,OACrBF,OAAOJ,EAAQK,QACXD,OAAOJ,EAAQK,IACzBE,WAAYN,OAAFA,EAAED,EAAQQ,iBAARP,EAAAA,EAAoBM,WAChCE,KAAMP,OAAFA,EAAEF,EAAQQ,iBAARN,EAAAA,EAAoBO,KAG9B,IAKJf,EAAegB,QAAUhB,EAAeC,GC5BxC,IACMgB,EAAY,2CCaZC,EAAMC,EAAAA,WACVC,EAAAA,QAAMC,OAAO,CACXC,QAAS,MAEX,CACEC,IAAK,QAITL,EAAIM,aAAaC,QAAQC,IAAI,SAACC,GAC5B,IAAMC,EAAO,GAAMD,EAAOE,QAAUF,EAAOG,IAAO,IAAA,IAAIC,gBACpDJ,EAAOK,QACPC,WAEF,OADAC,QAAQC,IAAI,YAAaP,GAClBD,CACT,GAEA,IAAMS,EAAiBpC,EAAegB,2BD6ChC,WAAU,WAAcqB,QAAAC,gCACxBD,QAAAC,QACqBlB,EAAK,QAACmB,IA9EjB,oCA8E8B,CACxCC,aAAc,OACdlB,QAAS,OACTmB,KAAA,SAHIC,GAMN,OAxDIC,EAAsB,CAAE,EAuDZD,EAASE,KAtDLC,MAAM,MACtBC,QAAQ,SAACC,GACb,GAAI9B,EAAU+B,KAAKD,GAAO,CACxB,IAAME,EAWY,SAACF,GACvB,IAAME,EAAaF,EAAKG,QAAQjC,EAAW,MAErCkC,EAAkBF,EAAWJ,MAAM,KAGzC,GAA+B,IAA3BM,EAAgBvC,OAClB,UAAUwC,8BAA8BH,GAG1C,IAAKI,EAA0CF,EAAe,GAA/CG,EAAgCH,KAAtBI,EAAsBJ,EAAZK,GAAAA,EAAYL,EAAe,GAQ9D,OALAI,EAAWA,EAASE,SAAS,EAAG,KAKzB,CACLJ,SAHFA,EAAWA,EAASI,SAAS,EAAG,KAI9BH,SAAUA,EACVC,SAAUA,EACVC,SAAUA,EAEd,CAnCyBE,CAAgBX,GACnCJ,EAAWM,EAAWM,UAAYN,CACnC,CACH,GACON,EATY,IACbA,CAwDyB,4DARHgB,GAS3B,SAAQC,GAEP,OADA1B,QAAQC,+BAA+ByB,GAChC,CAAA,CACR,GACH,CAAC,MAAAC,GAAA,OAAAxB,QAAAyB,OAAAD,EAAA,CAAA,uBCOiB,SAAAE,GAAA,IAAYC,EAAGD,EAAHC,IAAKC,EAAGF,EAAHE,IAAuC,IAAA,OAAA5B,QAAAC,QAEjDpB,EAAIqB,IACzB,0EACA,CACEC,aAAc,OACdR,OAAQ,CACNiC,IAAAA,EACAD,IAAAA,MAGLvB,KAAA,SATKC,GAWN,IAAMwB,EAAYC,WAAWzB,EAASE,KAAKsB,WAC3C,MAAO,CAAEE,UAAWJ,EAAKK,SAAUJ,EAAKC,UAAAA,EAAY,EACtD,CAAC,MAAAL,GAAA,OAAAxB,QAAAyB,OAAAD,EAaD,CAAA,0BAAM,SAAeS,GACnB,IAAAN,EAAGM,EAAHN,IACAC,EAAGK,EAAHL,IAIoC,IAAA,OAAA5B,QAAAC,gCAEhCD,QAAAC,QA5FA,SACJiC,GAEmC,IACnC,IAAMC,EAAGC,EAAQrC,CAAAA,EAAAA,OAyFMsC,GAxFvBC,EAAeC,EAAcA,eAACL,EAAQC,EAAItE,UAAnC2E,EAACF,EAAEG,GAAAA,EAACH,KAAyC,OAAAtC,QAAAC,QCjClC,SAClBuC,EACAC,EACAC,EACA7D,QAAqB,IAArBA,IAAAA,EAAqBE,EAAAA,SACE,IAAA,IAMnB4D,EANmBC,EAAA,SAAAC,GAgBvB,OADa,IAAIC,EAAUA,WAACH,EAChB,EAfN7E,EAAU4E,EAAQ5E,QACrB+C,QAAQ,MAAOxC,OAAOqE,EAAQ7E,WAC9BgD,QAAQ,MAAOxC,OAAOmE,IACtB3B,QAAQ,MAAOxC,OAAOoE,IAEdM,0BAEP/C,QAAAC,QACgBpB,EAAIqB,IAAIpC,EAAS,CAAEqC,aAAc,iBAAgBC,KAAA,SAA7D4C,GACNL,EAASM,OAAOC,KAAKF,EAAIzC,KAAM,SAAU,4DAJhCe,CAEP,EAGKC,SAAAA,GACP,MAAMA,CACP,GAAA,OAAAvB,QAAAC,QAAA8C,GAAAA,EAAA3C,KAAA2C,EAAA3C,KAAAwC,GAAAA,IAIH,CAAC,MAAApB,GAAA,OAAAxB,QAAAyB,OAAAD,EAWD,CAAA,CDCqB2B,CAAQX,EAAGC,EAAGN,EAAKtD,IAAIuB,cAApCgD,GACN,OCF2B,SAC3BA,EACAZ,EACAC,EACAP,EACAQ,GAEA,IAAIW,EAASC,OAAOC,KAAKH,EAAKC,QAEzBG,MAAMC,QAAQJ,KAASA,EAAS,CAACA,IAEtC,IAAIK,EAA0C,CAAA,EAsB9C,OArBAL,EAAO5C,QAAQ,SAACkD,GACd,IAAM5F,EAAQqF,EAAKC,OAAOM,GAC1B,GAAI5F,GAAS2E,EAAQ3E,QAAUA,EAAM6F,KACnC,IAAK,IAAIC,EAAI,EAAGA,EAAI9F,EAAMQ,OAAQsF,IAAK,CAErC,IAAM5F,EAAeF,EAAME,QAAQ4F,GAAGC,UAAUtB,EAAGC,EAAGC,EAAQ7E,UAC1DwF,EAAO9E,OAAS,IAAGN,EAAQQ,WAAWsF,SAAWJ,GAQzCK,EAAWA,YANP,CACdC,KAAM,oBACNC,SAAU,CAACjG,IAI2BiE,KAEtCwB,EAAkBhB,EAAQ1E,UAAUC,GAEvC,CAEL,GACOyF,CACT,CDhCSS,CAAcf,EAAMZ,EAAGC,EAAGP,EAAQC,EAAK,EAChD,CAAC,MAAAX,GAAA,OAAAxB,QAAAyB,OAAAD,EAeD,CAAA,CAsEyBa,CAAoB,CAACV,EAAKC,6DAHbN,CAAA,EAKnC,WAGC,OADAzB,QAAQC,IAAI,sDA1EV,SAAkBsE,GACtB,IAAAxC,EAAGwC,EAAHxC,IACAD,EAAGyC,EAAHzC,IAAG,IAIA3B,OAAAA,QAAAC,QACoBpB,EAAIqB,IACzB,sEACA,CACEC,aAAc,OACdR,OAAQ,CACNiC,IAAAA,EACAD,IAAAA,MAGLvB,KAAA,SATKC,GAUN,IACAgE,EADehE,EAASE,KAEtB+D,QAEF,MAAO,CAAElG,KAFgBiG,EAAZE,OAEE7F,KAFwB2F,EAAZG,OAEuB,EACpD,CAAC,MAAAhD,GAAA,OAAAxB,QAAAyB,OAAAD,EAAA,CAAA,CAqDUiD,CAAmB,CAAE7C,IAAAA,EAAKD,IAAAA,GAClC,GACH,CAAC,MAAAH,GAAA,OAAAxB,QAAAyB,OAAAD,EAED,CAAA"}
@@ -1,2 +1,2 @@
1
- import{lngLatToGoogle as e}from"global-mercator";import r from"axios";import{setupCache as t}from"axios-cache-interceptor";import{geoContains as o}from"d3-geo";import{VectorTile as n}from"mapbox-vector-tile";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},a.apply(null,arguments)}var i={JP:{zoomBase:10,tileUrl:"https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf",layer:"japanese-admins",getResult:function(e){var r,t;return{code:5===String(e.id).length?String(e.id):"0"+String(e.id),prefecture:null==(r=e.properties)?void 0:r.prefecture,city:null==(t=e.properties)?void 0:t.city}}}};i.DEFAULT=i.JP;var s=t(r.create({timeout:2e3}),{ttl:864e5});s.interceptors.request.use(function(e){var r=""+e.baseURL+e.url+"?"+new URLSearchParams(e.params).toString();return console.log("Full URL:",r),e});var c=i.DEFAULT,l=function(e){var r=e.lon,t=e.lat;try{return Promise.resolve(s.get("https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php",{responseType:"json",params:{lat:t,lon:r}})).then(function(e){var o=parseFloat(e.data.elevation);return{longitude:r,latitude:t,elevation:o}})}catch(e){return Promise.reject(e)}},u=function(t){var i=t.lon,l=t.lat;try{return Promise.resolve(function(t,u){try{var p=Promise.resolve(function(t){try{var i=a({},c,void 0),l=e(t,i.zoomBase),u=l[0],p=l[1];return Promise.resolve(function(e,t,o,a){void 0===a&&(a=r);try{var i,s=function(e){return new n(i)},c=o.tileUrl.replace("{z}",String(o.zoomBase)).replace("{x}",String(e)).replace("{y}",String(t)),l=function(e,r){try{var t=Promise.resolve(a.get(c,{responseType:"arraybuffer"})).then(function(e){i=Buffer.from(e.data,"binary")})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){throw e});return Promise.resolve(l&&l.then?l.then(s):s())}catch(e){return Promise.reject(e)}}(u,p,i,s)).then(function(e){return function(e,r,t,n,a){var i=Object.keys(e.layers);Array.isArray(i)||(i=[i]);var s={};return i.forEach(function(c){var l=e.layers[c];if(l&&a.layer===l.name)for(var u=0;u<l.length;u++){var p=l.feature(u).toGeoJSON(r,t,a.zoomBase);i.length>1&&(p.properties.vt_layer=c),o({type:"FeatureCollection",features:[p]},n)&&(s=a.getResult(p))}}),s}(e,u,p,t,i)})}catch(e){return Promise.reject(e)}}([i,l]))}catch(e){return u()}return p&&p.then?p.then(void 0,u):p}(0,function(){return console.log("Failed to get city code from open reverse geocoder"),function(e){var r=e.lat,t=e.lon;try{return Promise.resolve(s.get("https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress",{responseType:"json",params:{lat:r,lon:t}})).then(function(e){var r=e.data.results;return{code:r.muniCd,city:r.lv01Nm}})}catch(e){return Promise.reject(e)}}({lat:l,lon:i})}))}catch(e){return Promise.reject(e)}};export{l as getElevation,u as reverseGeocoder};
1
+ import{lngLatToGoogle as e}from"global-mercator";import r from"axios";import{setupCache as t}from"axios-cache-interceptor";import{geoContains as o}from"d3-geo";import{VectorTile as n}from"mapbox-vector-tile";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},a.apply(null,arguments)}var i={JP:{zoomBase:10,tileUrl:"https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf",layer:"japanese-admins",getResult:function(e){var r,t;return{code:5===String(e.id).length?String(e.id):"0"+String(e.id),prefecture:null==(r=e.properties)?void 0:r.prefecture,city:null==(t=e.properties)?void 0:t.city}}}};i.DEFAULT=i.JP;var s=/GSI\.MUNI_ARRAY\["\d+"\]\s*=\s*'(.*?)';/g,c=function(){try{return Promise.resolve(function(e,t){try{var o=Promise.resolve(r.get("https://maps.gsi.go.jp/js/muni.js",{responseType:"text",timeout:500})).then(function(e){return r={},e.data.split("\n").forEach(function(e){if(s.test(e)){var t=function(e){var r=e.replace(s,"$1"),t=r.split(",");if(4!==t.length)throw new Error("invalid muni record: "+r);var o=t[0],n=t[1],a=t[2],i=t[3];return a=a.padStart(5,"0"),{prefCode:o=o.padStart(2,"0"),prefName:n,cityCode:a,cityName:i}}(e);r[t.cityCode]=t}}),r;var r})}catch(e){return t(e)}return o&&o.then?o.then(void 0,t):o}(0,function(e){return console.log("Failed to get muni map: "+e),{}}))}catch(e){return Promise.reject(e)}},u=t(r.create({timeout:2e3}),{ttl:864e5});u.interceptors.request.use(function(e){var r=""+e.baseURL+e.url+"?"+new URLSearchParams(e.params).toString();return console.log("Full URL:",r),e});var l=i.DEFAULT,p=function(e){var r=e.lon,t=e.lat;try{return Promise.resolve(u.get("https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php",{responseType:"json",params:{lat:t,lon:r}})).then(function(e){var o=parseFloat(e.data.elevation);return{longitude:r,latitude:t,elevation:o}})}catch(e){return Promise.reject(e)}},v=function(t){var i=t.lon,s=t.lat;try{return Promise.resolve(function(t,c){try{var p=Promise.resolve(function(t){try{var i=a({},l,void 0),s=e(t,i.zoomBase),c=s[0],p=s[1];return Promise.resolve(function(e,t,o,a){void 0===a&&(a=r);try{var i,s=function(e){return new n(i)},c=o.tileUrl.replace("{z}",String(o.zoomBase)).replace("{x}",String(e)).replace("{y}",String(t)),u=function(e,r){try{var t=Promise.resolve(a.get(c,{responseType:"arraybuffer"})).then(function(e){i=Buffer.from(e.data,"binary")})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){throw e});return Promise.resolve(u&&u.then?u.then(s):s())}catch(e){return Promise.reject(e)}}(c,p,i,u)).then(function(e){return function(e,r,t,n,a){var i=Object.keys(e.layers);Array.isArray(i)||(i=[i]);var s={};return i.forEach(function(c){var u=e.layers[c];if(u&&a.layer===u.name)for(var l=0;l<u.length;l++){var p=u.feature(l).toGeoJSON(r,t,a.zoomBase);i.length>1&&(p.properties.vt_layer=c),o({type:"FeatureCollection",features:[p]},n)&&(s=a.getResult(p))}}),s}(e,c,p,t,i)})}catch(e){return Promise.reject(e)}}([i,s]))}catch(e){return c()}return p&&p.then?p.then(void 0,c):p}(0,function(){return console.log("Failed to get city code from open reverse geocoder"),function(e){var r=e.lat,t=e.lon;try{return Promise.resolve(u.get("https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress",{responseType:"json",params:{lat:r,lon:t}})).then(function(e){var r=e.data.results;return{code:r.muniCd,city:r.lv01Nm}})}catch(e){return Promise.reject(e)}}({lat:s,lon:i})}))}catch(e){return Promise.reject(e)}};export{c as getCityMap,p as getElevation,v as reverseGeocoder};
2
2
  //# sourceMappingURL=index.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/countryOptions.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n ReverseGeocodingOptions,\n ReverseGeocodingResultJP,\n} from './interfaces';\n\n/**\n * vector tiles settings for each country\n */\nconst countryOptions: { [s: string]: ReverseGeocodingOptions } = {\n JP: {\n zoomBase: 10,\n // tileUrl: `http://127.0.0.1:5500/docs/tiles/{z}/{x}/{y}.pbf`,\n tileUrl: 'https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf',\n layer: 'japanese-admins',\n getResult: function (feature: GeoJSON.Feature) {\n const res: ReverseGeocodingResultJP = {\n code:\n 5 === String(feature.id).length\n ? String(feature.id)\n : `0${String(feature.id)}`,\n prefecture: feature.properties?.prefecture,\n city: feature.properties?.city,\n };\n return res;\n },\n },\n};\n\n// default country options\ncountryOptions.DEFAULT = countryOptions.JP;\n\nexport default countryOptions;\n","import { lngLatToGoogle } from 'global-mercator';\nimport axios from 'axios';\nimport { setupCache } from 'axios-cache-interceptor';\nimport {\n ReverseGeocodingOptions,\n ReverseGeocodingResult,\n ReverseGeocodingResultJP,\n} from './interfaces';\nimport countryOptions from './countryOptions';\nimport { getTile, getTileResult } from './utils';\n\ntype LngLat = [number, number];\n\nconst api = setupCache(\n axios.create({\n timeout: 2000,\n }),\n {\n ttl: 60 * 60 * 24 * 1000, // 1 day\n }\n);\n\napi.interceptors.request.use((config) => {\n const fullUrl = `${config.baseURL}${config.url}?${new URLSearchParams(\n config.params\n ).toString()}`;\n console.log('Full URL:', fullUrl);\n return config;\n});\n\nconst defaultOptions = countryOptions.DEFAULT;\n\n/**\n * Performs reverse geocoding to obtain location information based on longitude and latitude.\n *\n * @param lnglat - The longitude and latitude coordinates.\n * @param options - Optional parameters for reverse geocoding.\n * @returns A promise that resolves to the reverse geocoding result.\n */\nconst openReverseGeocoder = async (\n lnglat: LngLat,\n options?: ReverseGeocodingOptions\n): Promise<ReverseGeocodingResult> => {\n const opt = { ...defaultOptions, ...options };\n const [x, y] = lngLatToGoogle(lnglat, opt.zoomBase);\n const tile = await getTile(x, y, opt, api);\n return getTileResult(tile, x, y, lnglat, opt);\n};\n\n/**\n * Performs reverse geocoding using the GSI (Geospatial Information Authority of Japan) API.\n * Given latitude and longitude coordinates, it returns the corresponding municipality code and city name.\n *\n * @param {Object} params - The parameters for the reverse geocoding request.\n * @param {number} params.lat - The latitude coordinate.\n * @param {number} params.lon - The longitude coordinate.\n * @returns {Promise<ReverseGeocodingResultJP>} A promise that resolves to an object containing the municipality code and city name.\n *\n * @example\n * const result = await gsiReverseGeocoder({ lat: 35.6895, lon: 139.6917 });\n * console.log(result); // { code: '13101', city: 'Chiyoda-ku' }\n */\nconst gsiReverseGeocoder = async ({\n lat,\n lon,\n}: {\n lat: number;\n lon: number;\n}) => {\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n const result = response.data;\n const {\n results: { muniCd: code, lv01Nm: city },\n } = result;\n return { code, city } as ReverseGeocodingResultJP;\n};\n\n/**\n * Retrieves the elevation for a given longitude and latitude using the GSI API.\n *\n * @param {Object} coordinates - The coordinates for which to get the elevation.\n * @param {number} coordinates.lon - The longitude of the location.\n * @param {number} coordinates.lat - The latitude of the location.\n * @returns {Promise<{ longitude: number, latitude: number, elevation: number }>}\n * A promise that resolves to an object containing the longitude, latitude, and elevation.\n */\nconst getElevation = async ({ lon, lat }: { lon: number; lat: number }) => {\n // first, get elevation from GSI\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n\n const elevation = parseFloat(response.data.elevation);\n return { longitude: lon, latitude: lat, elevation };\n};\n\n/**\n * Reverse geocodes the given longitude and latitude to obtain a city code.\n *\n * @param {Object} params - The parameters for reverse geocoding.\n * @param {number} params.lon - The longitude of the location.\n * @param {number} params.lat - The latitude of the location.\n *\n * @returns {Promise<ReverseGeocodingResult>} A promise that resolves to the reverse geocoding result.\n *\n * @throws Will attempt to use an alternative geocoding service if the primary service fails.\n */\nconst reverseGeocoder = async ({\n lon,\n lat,\n}: {\n lon: number;\n lat: number;\n}): Promise<ReverseGeocodingResult> => {\n // first, get city code from open reverse geocoder(local)\n try {\n const result = await openReverseGeocoder([lon, lat]);\n return result;\n } catch (error) {\n // if failed, get city code from GSI\n console.log('Failed to get city code from open reverse geocoder');\n return gsiReverseGeocoder({ lat, lon });\n }\n};\n\nexport { reverseGeocoder, getElevation };\n","import { geoContains } from 'd3-geo';\nimport axios, { AxiosInstance } from 'axios';\nimport { VectorTile } from 'mapbox-vector-tile';\nimport { ReverseGeocodingOptions, ReverseGeocodingResult } from './interfaces';\n\n/**\n * Get a tile from targeted country's tilesets by using x and y tile index\n * @param x x tile index\n * @param y y tile index\n * @param options ReverseGeocodingOptions\n * @param api Axios object\n * @returns VectorTile object\n */\nexport const getTile = async (\n x: number,\n y: number,\n options: ReverseGeocodingOptions,\n api: AxiosInstance = axios\n): Promise<VectorTile> => {\n const tileUrl = options.tileUrl\n .replace('{z}', String(options.zoomBase))\n .replace('{x}', String(x))\n .replace('{y}', String(y));\n\n let buffer;\n\n try {\n const res = await api.get(tileUrl, { responseType: 'arraybuffer' });\n buffer = Buffer.from(res.data, 'binary');\n } catch (error) {\n throw error;\n }\n\n const tile = new VectorTile(buffer);\n return tile;\n};\n\n/**\n * Get a result of reverse geocoding\n * @param tile VectorTile object\n * @param x x tile index\n * @param y y tile index\n * @param lnglat number[] longitude, latitude\n * @param options ReverseGeocodingOptions\n * @returns an object of result of reverse gecoding\n */\nexport const getTileResult = (\n tile: VectorTile,\n x: number,\n y: number,\n lnglat: [number, number],\n options: ReverseGeocodingOptions\n): ReverseGeocodingResult => {\n let layers = Object.keys(tile.layers);\n\n if (!Array.isArray(layers)) layers = [layers];\n\n let geocodingResult: ReverseGeocodingResult = {};\n layers.forEach((layerID) => {\n const layer = tile.layers[layerID];\n if (layer && options.layer === layer.name) {\n for (let i = 0; i < layer.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feature: any = layer.feature(i).toGeoJSON(x, y, options.zoomBase);\n if (layers.length > 1) feature.properties.vt_layer = layerID;\n\n const geojson = {\n type: 'FeatureCollection',\n features: [feature],\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = geoContains(geojson as any, lnglat);\n if (res) {\n geocodingResult = options.getResult(feature);\n }\n }\n }\n });\n return geocodingResult;\n};\n\n"],"names":["countryOptions","JP","zoomBase","tileUrl","layer","getResult","feature","_feature$properties","_feature$properties2","code","String","id","length","prefecture","properties","city","DEFAULT","api","setupCache","axios","create","timeout","ttl","interceptors","request","use","config","fullUrl","baseURL","url","URLSearchParams","params","toString","console","log","defaultOptions","getElevation","_ref2","lon","lat","Promise","resolve","get","responseType","then","response","elevation","parseFloat","data","longitude","latitude","e","reject","reverseGeocoder","_ref3","lnglat","opt","_extends","openReverseGeocoder","_lngLatToGoogle","lngLatToGoogle","x","y","options","buffer","_temp2","_result","VectorTile","replace","_temp","res","Buffer","from","_catch","error","getTile","tile","layers","Object","keys","Array","isArray","geocodingResult","forEach","layerID","name","i","toGeoJSON","vt_layer","geoContains","type","features","getTileResult","_ref","_result$results","results","muniCd","lv01Nm","gsiReverseGeocoder"],"mappings":"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"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/countryOptions.ts","../src/muni.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n ReverseGeocodingOptions,\n ReverseGeocodingResultJP,\n} from './interfaces';\n\n/**\n * vector tiles settings for each country\n */\nconst countryOptions: { [s: string]: ReverseGeocodingOptions } = {\n JP: {\n zoomBase: 10,\n // tileUrl: `http://127.0.0.1:5500/docs/tiles/{z}/{x}/{y}.pbf`,\n tileUrl: 'https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf',\n layer: 'japanese-admins',\n getResult: function (feature: GeoJSON.Feature) {\n const res: ReverseGeocodingResultJP = {\n code:\n 5 === String(feature.id).length\n ? String(feature.id)\n : `0${String(feature.id)}`,\n prefecture: feature.properties?.prefecture,\n city: feature.properties?.city,\n };\n return res;\n },\n },\n};\n\n// default country options\ncountryOptions.DEFAULT = countryOptions.JP;\n\nexport default countryOptions;\n","// Muni file url\nconst MuniURL = 'https://maps.gsi.go.jp/js/muni.js';\nconst MuniRegex = /GSI\\.MUNI_ARRAY\\[\"\\d+\"\\]\\s*=\\s*'(.*?)';/g;\n\nimport axios from 'axios';\n\ninterface MuniRecord {\n prefCode: string;\n prefName: string;\n cityCode: string;\n cityName: string;\n}\n\ninterface MuniMap {\n [key: string]: MuniRecord;\n}\n\ninterface AddressResults {\n muniCd: string;\n lv01Nm: string;\n mesh_code?: string;\n notes?: string;\n}\n\n/**\n * parse muni.js\n * @param muniMap\n */\nconst parseMuniMap = (muniMap: string) => {\n const muniMapObj: MuniMap = {};\n const lines = muniMap.split('\\n');\n lines.forEach((line) => {\n if (MuniRegex.test(line)) {\n const muniRecord = parseMuniRecord(line);\n muniMapObj[muniRecord.cityCode] = muniRecord;\n }\n });\n return muniMapObj;\n};\n\n/**\n * parse muni record\n * @param line\n */\nconst parseMuniRecord = (line: string) => {\n const muniRecord = line.replace(MuniRegex, '$1');\n\n const muniRecordArray = muniRecord.split(',');\n\n // validate muni record\n if (muniRecordArray.length !== 4) {\n throw new Error(`invalid muni record: ${muniRecord}`);\n }\n\n let [prefCode, prefName, cityCode, cityName] = muniRecordArray;\n\n // if cityCode is not 5 digits, add 0 to the beginning\n cityCode = cityCode.padStart(5, '0');\n\n // if prefCode is not 2 digits, add 0 to the beginning\n prefCode = prefCode.padStart(2, '0');\n\n return {\n prefCode: prefCode,\n prefName: prefName,\n cityCode: cityCode,\n cityName: cityName,\n };\n};\n\n/**\n * Fetches the municipality map data from a specified URL.\n *\n * @returns {Promise<object>} A promise that resolves to the parsed municipality map data.\n *\n * @throws Will log an error message and return an empty object if the request fails.\n */\nconst getMuniMap = async () => {\n try {\n const response = await axios.get(MuniURL, {\n responseType: 'text',\n timeout: 500,\n });\n\n const muniMap = response.data;\n return parseMuniMap(muniMap);\n } catch (error) {\n console.log(`Failed to get muni map: ${error}`);\n return {};\n }\n};\n\n/**\n * converts muni code to address name.\n *\n * @param muniMap\n * @param muniCode\n */\nconst muniCodeToAddressName = (muniMap: MuniMap, muniCode: string) => {\n const muniRecord = muniMap[muniCode];\n if (!muniRecord) {\n throw new Error(`muni code ${muniCode} not found`);\n }\n\n const add = `${muniRecord.prefName}${muniRecord.cityName}`;\n return add.replace(/ /g, '');\n};\n\n/**\n * converts address result to address name.\n * @param muniMap\n * @param addressResults\n */\nconst addressResultsToAddressName = (\n muniMap: MuniMap,\n addressResults: AddressResults\n) => {\n const mc = addressResults.muniCd;\n const muniName = muniCodeToAddressName(muniMap, mc);\n const addrName = `${muniName}${addressResults.lv01Nm}`;\n return addrName;\n};\n\nconst getMuniMapLocations = async () => {\n const muniMap = await getMuniMap();\n // muniMap is a map of all cities and wards in Japan\n // key: city code, value: { prefCode, prefName, cityCode, cityName }\n // we need to convert this to a map of all locations in Japan\n // key: prefCode , value: { prefName, cities: { key: cityCode, value: { cityCode, cityName, wards: { key: wardCode, value: { wardCode, wardName } } } } }\n\n const muniMapLocations = {};\n Object.keys(muniMap).forEach((cityCode) => {\n const muniRecord = muniMap[cityCode];\n const { prefCode, prefName, cityName } = muniRecord;\n if (!muniMapLocations[prefCode]) {\n muniMapLocations[prefCode] = { prefName, cities: {} };\n }\n\n // if cityName contains ' ', it is a ward\n // otherwise, it is a city\n if (cityName.includes(' ')) {\n // ward name is after ' '\n const [name, wardName] = cityName.split(' ');\n // find city has the same name\n const city: any = Object.values(muniMap).find(\n (c: any) => c.cityName === name\n );\n if (!city) {\n console.log(`City ${name} not found in prefCode ${prefCode}`);\n } else {\n // add ward to city\n muniMapLocations[prefCode].cities[city.cityCode].wards[cityCode] = {\n prefCode,\n cityCode: cityCode,\n cityName: `${name}${wardName}`,\n bigCityFlag: '1',\n bigCityCode: city.cityCode,\n };\n }\n } else {\n muniMapLocations[prefCode].cities[cityCode] = {\n prefCode,\n cityCode,\n cityName,\n wards: {},\n };\n }\n });\n\n // assign bigCityFlag to each city\n Object.keys(muniMapLocations).forEach((prefCode) => {\n const pref = muniMapLocations[prefCode];\n Object.keys(pref.cities).forEach((cityCode) => {\n const city = pref.cities[cityCode];\n const isBigCity = Object.values(city.wards).length > 0;\n if (isBigCity) {\n city.bigCityFlag = '2';\n } else {\n // delete wards\n delete city.wards;\n // if city is tokyo then bigCityFlag is 3, otherwise 0\n if (city.prefCode === '13') {\n city.bigCityFlag = '3';\n } else {\n city.bigCityFlag = '0';\n }\n }\n });\n });\n\n return muniMapLocations;\n};\n\nexport { getMuniMap };\n","import { lngLatToGoogle } from 'global-mercator';\nimport axios from 'axios';\nimport { setupCache } from 'axios-cache-interceptor';\nimport {\n ReverseGeocodingOptions,\n ReverseGeocodingResult,\n ReverseGeocodingResultJP,\n} from './interfaces';\nimport countryOptions from './countryOptions';\nimport { getTile, getTileResult } from './utils';\n\nimport { getMuniMap } from './muni';\n\ntype LngLat = [number, number];\n\nconst api = setupCache(\n axios.create({\n timeout: 2000,\n }),\n {\n ttl: 60 * 60 * 24 * 1000, // 1 day\n }\n);\n\napi.interceptors.request.use((config) => {\n const fullUrl = `${config.baseURL}${config.url}?${new URLSearchParams(\n config.params\n ).toString()}`;\n console.log('Full URL:', fullUrl);\n return config;\n});\n\nconst defaultOptions = countryOptions.DEFAULT;\n\n/**\n * Performs reverse geocoding to obtain location information based on longitude and latitude.\n *\n * @param lnglat - The longitude and latitude coordinates.\n * @param options - Optional parameters for reverse geocoding.\n * @returns A promise that resolves to the reverse geocoding result.\n */\nconst openReverseGeocoder = async (\n lnglat: LngLat,\n options?: ReverseGeocodingOptions\n): Promise<ReverseGeocodingResult> => {\n const opt = { ...defaultOptions, ...options };\n const [x, y] = lngLatToGoogle(lnglat, opt.zoomBase);\n const tile = await getTile(x, y, opt, api);\n return getTileResult(tile, x, y, lnglat, opt);\n};\n\n/**\n * Performs reverse geocoding using the GSI (Geospatial Information Authority of Japan) API.\n * Given latitude and longitude coordinates, it returns the corresponding municipality code and city name.\n *\n * @param {Object} params - The parameters for the reverse geocoding request.\n * @param {number} params.lat - The latitude coordinate.\n * @param {number} params.lon - The longitude coordinate.\n * @returns {Promise<ReverseGeocodingResultJP>} A promise that resolves to an object containing the municipality code and city name.\n *\n * @example\n * const result = await gsiReverseGeocoder({ lat: 35.6895, lon: 139.6917 });\n * console.log(result); // { code: '13101', city: 'Chiyoda-ku' }\n */\nconst gsiReverseGeocoder = async ({\n lat,\n lon,\n}: {\n lat: number;\n lon: number;\n}) => {\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n const result = response.data;\n const {\n results: { muniCd: code, lv01Nm: city },\n } = result;\n return { code, city } as ReverseGeocodingResultJP;\n};\n\n/**\n * Retrieves the elevation for a given longitude and latitude using the GSI API.\n *\n * @param {Object} coordinates - The coordinates for which to get the elevation.\n * @param {number} coordinates.lon - The longitude of the location.\n * @param {number} coordinates.lat - The latitude of the location.\n * @returns {Promise<{ longitude: number, latitude: number, elevation: number }>}\n * A promise that resolves to an object containing the longitude, latitude, and elevation.\n */\nconst getElevation = async ({ lon, lat }: { lon: number; lat: number }) => {\n // first, get elevation from GSI\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n\n const elevation = parseFloat(response.data.elevation);\n return { longitude: lon, latitude: lat, elevation };\n};\n\n/**\n * Reverse geocodes the given longitude and latitude to obtain a city code.\n *\n * @param {Object} params - The parameters for reverse geocoding.\n * @param {number} params.lon - The longitude of the location.\n * @param {number} params.lat - The latitude of the location.\n *\n * @returns {Promise<ReverseGeocodingResult>} A promise that resolves to the reverse geocoding result.\n *\n * @throws Will attempt to use an alternative geocoding service if the primary service fails.\n */\nconst reverseGeocoder = async ({\n lon,\n lat,\n}: {\n lon: number;\n lat: number;\n}): Promise<ReverseGeocodingResult> => {\n // first, get city code from open reverse geocoder(local)\n try {\n const result = await openReverseGeocoder([lon, lat]);\n return result;\n } catch (error) {\n // if failed, get city code from GSI\n console.log('Failed to get city code from open reverse geocoder');\n return gsiReverseGeocoder({ lat, lon });\n }\n};\n\nexport { reverseGeocoder, getElevation, getMuniMap as getCityMap };\n","import { geoContains } from 'd3-geo';\nimport axios, { AxiosInstance } from 'axios';\nimport { VectorTile } from 'mapbox-vector-tile';\nimport { ReverseGeocodingOptions, ReverseGeocodingResult } from './interfaces';\n\n/**\n * Get a tile from targeted country's tilesets by using x and y tile index\n * @param x x tile index\n * @param y y tile index\n * @param options ReverseGeocodingOptions\n * @param api Axios object\n * @returns VectorTile object\n */\nexport const getTile = async (\n x: number,\n y: number,\n options: ReverseGeocodingOptions,\n api: AxiosInstance = axios\n): Promise<VectorTile> => {\n const tileUrl = options.tileUrl\n .replace('{z}', String(options.zoomBase))\n .replace('{x}', String(x))\n .replace('{y}', String(y));\n\n let buffer;\n\n try {\n const res = await api.get(tileUrl, { responseType: 'arraybuffer' });\n buffer = Buffer.from(res.data, 'binary');\n } catch (error) {\n throw error;\n }\n\n const tile = new VectorTile(buffer);\n return tile;\n};\n\n/**\n * Get a result of reverse geocoding\n * @param tile VectorTile object\n * @param x x tile index\n * @param y y tile index\n * @param lnglat number[] longitude, latitude\n * @param options ReverseGeocodingOptions\n * @returns an object of result of reverse gecoding\n */\nexport const getTileResult = (\n tile: VectorTile,\n x: number,\n y: number,\n lnglat: [number, number],\n options: ReverseGeocodingOptions\n): ReverseGeocodingResult => {\n let layers = Object.keys(tile.layers);\n\n if (!Array.isArray(layers)) layers = [layers];\n\n let geocodingResult: ReverseGeocodingResult = {};\n layers.forEach((layerID) => {\n const layer = tile.layers[layerID];\n if (layer && options.layer === layer.name) {\n for (let i = 0; i < layer.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feature: any = layer.feature(i).toGeoJSON(x, y, options.zoomBase);\n if (layers.length > 1) feature.properties.vt_layer = layerID;\n\n const geojson = {\n type: 'FeatureCollection',\n features: [feature],\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = geoContains(geojson as any, lnglat);\n if (res) {\n geocodingResult = options.getResult(feature);\n }\n }\n }\n });\n return geocodingResult;\n};\n\n"],"names":["countryOptions","JP","zoomBase","tileUrl","layer","getResult","feature","_feature$properties","_feature$properties2","code","String","id","length","prefecture","properties","city","DEFAULT","MuniRegex","getMuniMap","Promise","resolve","axios","get","responseType","timeout","then","response","muniMapObj","data","split","forEach","line","test","muniRecord","replace","muniRecordArray","Error","prefCode","prefName","cityCode","cityName","padStart","parseMuniRecord","_catch","error","console","log","e","reject","api","setupCache","create","ttl","interceptors","request","use","config","fullUrl","baseURL","url","URLSearchParams","params","toString","defaultOptions","getElevation","_ref2","lon","lat","elevation","parseFloat","longitude","latitude","reverseGeocoder","_ref3","lnglat","opt","_extends","openReverseGeocoder","_lngLatToGoogle","lngLatToGoogle","x","y","options","buffer","_temp2","_result","VectorTile","_temp","res","Buffer","from","getTile","tile","layers","Object","keys","Array","isArray","geocodingResult","layerID","name","i","toGeoJSON","vt_layer","geoContains","type","features","getTileResult","_ref","_result$results","results","muniCd","lv01Nm","gsiReverseGeocoder"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("global-mercator"),require("axios"),require("axios-cache-interceptor"),require("d3-geo"),require("mapbox-vector-tile")):"function"==typeof define&&define.amd?define(["exports","global-mercator","axios","axios-cache-interceptor","d3-geo","mapbox-vector-tile"],r):r((e||self).jsMsearchGsiJp={},e.globalMercator,e.axios,e.axiosCacheInterceptor,e.d3Geo,e.mapboxVectorTile)}(this,function(e,r,t,o,n,a){function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=/*#__PURE__*/i(t);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},c.apply(null,arguments)}var l={JP:{zoomBase:10,tileUrl:"https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf",layer:"japanese-admins",getResult:function(e){var r,t;return{code:5===String(e.id).length?String(e.id):"0"+String(e.id),prefecture:null==(r=e.properties)?void 0:r.prefecture,city:null==(t=e.properties)?void 0:t.city}}}};l.DEFAULT=l.JP;var u=o.setupCache(s.default.create({timeout:2e3}),{ttl:864e5});u.interceptors.request.use(function(e){var r=""+e.baseURL+e.url+"?"+new URLSearchParams(e.params).toString();return console.log("Full URL:",r),e});var f=l.DEFAULT;e.getElevation=function(e){var r=e.lon,t=e.lat;try{return Promise.resolve(u.get("https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php",{responseType:"json",params:{lat:t,lon:r}})).then(function(e){var o=parseFloat(e.data.elevation);return{longitude:r,latitude:t,elevation:o}})}catch(e){return Promise.reject(e)}},e.reverseGeocoder=function(e){var t=e.lon,o=e.lat;try{return Promise.resolve(function(e,i){try{var l=Promise.resolve(function(e){try{var t=c({},f,void 0),o=r.lngLatToGoogle(e,t.zoomBase),i=o[0],l=o[1];return Promise.resolve(function(e,r,t,o){void 0===o&&(o=s.default);try{var n,i=function(e){return new a.VectorTile(n)},c=t.tileUrl.replace("{z}",String(t.zoomBase)).replace("{x}",String(e)).replace("{y}",String(r)),l=function(e,r){try{var t=Promise.resolve(o.get(c,{responseType:"arraybuffer"})).then(function(e){n=Buffer.from(e.data,"binary")})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){throw e});return Promise.resolve(l&&l.then?l.then(i):i())}catch(e){return Promise.reject(e)}}(i,l,t,u)).then(function(r){return function(e,r,t,o,a){var i=Object.keys(e.layers);Array.isArray(i)||(i=[i]);var s={};return i.forEach(function(c){var l=e.layers[c];if(l&&a.layer===l.name)for(var u=0;u<l.length;u++){var f=l.feature(u).toGeoJSON(r,t,a.zoomBase);i.length>1&&(f.properties.vt_layer=c),n.geoContains({type:"FeatureCollection",features:[f]},o)&&(s=a.getResult(f))}}),s}(r,i,l,e,t)})}catch(e){return Promise.reject(e)}}([t,o]))}catch(e){return i()}return l&&l.then?l.then(void 0,i):l}(0,function(){return console.log("Failed to get city code from open reverse geocoder"),function(e){var r=e.lat,t=e.lon;try{return Promise.resolve(u.get("https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress",{responseType:"json",params:{lat:r,lon:t}})).then(function(e){var r=e.data.results;return{code:r.muniCd,city:r.lv01Nm}})}catch(e){return Promise.reject(e)}}({lat:o,lon:t})}))}catch(e){return Promise.reject(e)}}});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("global-mercator"),require("axios"),require("axios-cache-interceptor"),require("d3-geo"),require("mapbox-vector-tile")):"function"==typeof define&&define.amd?define(["exports","global-mercator","axios","axios-cache-interceptor","d3-geo","mapbox-vector-tile"],r):r((e||self).jsMsearchGsiJp={},e.globalMercator,e.axios,e.axiosCacheInterceptor,e.d3Geo,e.mapboxVectorTile)}(this,function(e,r,t,o,n,a){function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=/*#__PURE__*/i(t);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},c.apply(null,arguments)}var l={JP:{zoomBase:10,tileUrl:"https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf",layer:"japanese-admins",getResult:function(e){var r,t;return{code:5===String(e.id).length?String(e.id):"0"+String(e.id),prefecture:null==(r=e.properties)?void 0:r.prefecture,city:null==(t=e.properties)?void 0:t.city}}}};l.DEFAULT=l.JP;var u=/GSI\.MUNI_ARRAY\["\d+"\]\s*=\s*'(.*?)';/g,p=o.setupCache(s.default.create({timeout:2e3}),{ttl:864e5});p.interceptors.request.use(function(e){var r=""+e.baseURL+e.url+"?"+new URLSearchParams(e.params).toString();return console.log("Full URL:",r),e});var f=l.DEFAULT;e.getCityMap=function(){try{return Promise.resolve(function(e,r){try{var t=Promise.resolve(s.default.get("https://maps.gsi.go.jp/js/muni.js",{responseType:"text",timeout:500})).then(function(e){return r={},e.data.split("\n").forEach(function(e){if(u.test(e)){var t=function(e){var r=e.replace(u,"$1"),t=r.split(",");if(4!==t.length)throw new Error("invalid muni record: "+r);var o=t[0],n=t[1],a=t[2],i=t[3];return a=a.padStart(5,"0"),{prefCode:o=o.padStart(2,"0"),prefName:n,cityCode:a,cityName:i}}(e);r[t.cityCode]=t}}),r;var r})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){return console.log("Failed to get muni map: "+e),{}}))}catch(e){return Promise.reject(e)}},e.getElevation=function(e){var r=e.lon,t=e.lat;try{return Promise.resolve(p.get("https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php",{responseType:"json",params:{lat:t,lon:r}})).then(function(e){var o=parseFloat(e.data.elevation);return{longitude:r,latitude:t,elevation:o}})}catch(e){return Promise.reject(e)}},e.reverseGeocoder=function(e){var t=e.lon,o=e.lat;try{return Promise.resolve(function(e,i){try{var l=Promise.resolve(function(e){try{var t=c({},f,void 0),o=r.lngLatToGoogle(e,t.zoomBase),i=o[0],l=o[1];return Promise.resolve(function(e,r,t,o){void 0===o&&(o=s.default);try{var n,i=function(e){return new a.VectorTile(n)},c=t.tileUrl.replace("{z}",String(t.zoomBase)).replace("{x}",String(e)).replace("{y}",String(r)),l=function(e,r){try{var t=Promise.resolve(o.get(c,{responseType:"arraybuffer"})).then(function(e){n=Buffer.from(e.data,"binary")})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){throw e});return Promise.resolve(l&&l.then?l.then(i):i())}catch(e){return Promise.reject(e)}}(i,l,t,p)).then(function(r){return function(e,r,t,o,a){var i=Object.keys(e.layers);Array.isArray(i)||(i=[i]);var s={};return i.forEach(function(c){var l=e.layers[c];if(l&&a.layer===l.name)for(var u=0;u<l.length;u++){var p=l.feature(u).toGeoJSON(r,t,a.zoomBase);i.length>1&&(p.properties.vt_layer=c),n.geoContains({type:"FeatureCollection",features:[p]},o)&&(s=a.getResult(p))}}),s}(r,i,l,e,t)})}catch(e){return Promise.reject(e)}}([t,o]))}catch(e){return i()}return l&&l.then?l.then(void 0,i):l}(0,function(){return console.log("Failed to get city code from open reverse geocoder"),function(e){var r=e.lat,t=e.lon;try{return Promise.resolve(p.get("https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress",{responseType:"json",params:{lat:r,lon:t}})).then(function(e){var r=e.data.results;return{code:r.muniCd,city:r.lv01Nm}})}catch(e){return Promise.reject(e)}}({lat:o,lon:t})}))}catch(e){return Promise.reject(e)}}});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/countryOptions.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n ReverseGeocodingOptions,\n ReverseGeocodingResultJP,\n} from './interfaces';\n\n/**\n * vector tiles settings for each country\n */\nconst countryOptions: { [s: string]: ReverseGeocodingOptions } = {\n JP: {\n zoomBase: 10,\n // tileUrl: `http://127.0.0.1:5500/docs/tiles/{z}/{x}/{y}.pbf`,\n tileUrl: 'https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf',\n layer: 'japanese-admins',\n getResult: function (feature: GeoJSON.Feature) {\n const res: ReverseGeocodingResultJP = {\n code:\n 5 === String(feature.id).length\n ? String(feature.id)\n : `0${String(feature.id)}`,\n prefecture: feature.properties?.prefecture,\n city: feature.properties?.city,\n };\n return res;\n },\n },\n};\n\n// default country options\ncountryOptions.DEFAULT = countryOptions.JP;\n\nexport default countryOptions;\n","import { lngLatToGoogle } from 'global-mercator';\nimport axios from 'axios';\nimport { setupCache } from 'axios-cache-interceptor';\nimport {\n ReverseGeocodingOptions,\n ReverseGeocodingResult,\n ReverseGeocodingResultJP,\n} from './interfaces';\nimport countryOptions from './countryOptions';\nimport { getTile, getTileResult } from './utils';\n\ntype LngLat = [number, number];\n\nconst api = setupCache(\n axios.create({\n timeout: 2000,\n }),\n {\n ttl: 60 * 60 * 24 * 1000, // 1 day\n }\n);\n\napi.interceptors.request.use((config) => {\n const fullUrl = `${config.baseURL}${config.url}?${new URLSearchParams(\n config.params\n ).toString()}`;\n console.log('Full URL:', fullUrl);\n return config;\n});\n\nconst defaultOptions = countryOptions.DEFAULT;\n\n/**\n * Performs reverse geocoding to obtain location information based on longitude and latitude.\n *\n * @param lnglat - The longitude and latitude coordinates.\n * @param options - Optional parameters for reverse geocoding.\n * @returns A promise that resolves to the reverse geocoding result.\n */\nconst openReverseGeocoder = async (\n lnglat: LngLat,\n options?: ReverseGeocodingOptions\n): Promise<ReverseGeocodingResult> => {\n const opt = { ...defaultOptions, ...options };\n const [x, y] = lngLatToGoogle(lnglat, opt.zoomBase);\n const tile = await getTile(x, y, opt, api);\n return getTileResult(tile, x, y, lnglat, opt);\n};\n\n/**\n * Performs reverse geocoding using the GSI (Geospatial Information Authority of Japan) API.\n * Given latitude and longitude coordinates, it returns the corresponding municipality code and city name.\n *\n * @param {Object} params - The parameters for the reverse geocoding request.\n * @param {number} params.lat - The latitude coordinate.\n * @param {number} params.lon - The longitude coordinate.\n * @returns {Promise<ReverseGeocodingResultJP>} A promise that resolves to an object containing the municipality code and city name.\n *\n * @example\n * const result = await gsiReverseGeocoder({ lat: 35.6895, lon: 139.6917 });\n * console.log(result); // { code: '13101', city: 'Chiyoda-ku' }\n */\nconst gsiReverseGeocoder = async ({\n lat,\n lon,\n}: {\n lat: number;\n lon: number;\n}) => {\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n const result = response.data;\n const {\n results: { muniCd: code, lv01Nm: city },\n } = result;\n return { code, city } as ReverseGeocodingResultJP;\n};\n\n/**\n * Retrieves the elevation for a given longitude and latitude using the GSI API.\n *\n * @param {Object} coordinates - The coordinates for which to get the elevation.\n * @param {number} coordinates.lon - The longitude of the location.\n * @param {number} coordinates.lat - The latitude of the location.\n * @returns {Promise<{ longitude: number, latitude: number, elevation: number }>}\n * A promise that resolves to an object containing the longitude, latitude, and elevation.\n */\nconst getElevation = async ({ lon, lat }: { lon: number; lat: number }) => {\n // first, get elevation from GSI\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n\n const elevation = parseFloat(response.data.elevation);\n return { longitude: lon, latitude: lat, elevation };\n};\n\n/**\n * Reverse geocodes the given longitude and latitude to obtain a city code.\n *\n * @param {Object} params - The parameters for reverse geocoding.\n * @param {number} params.lon - The longitude of the location.\n * @param {number} params.lat - The latitude of the location.\n *\n * @returns {Promise<ReverseGeocodingResult>} A promise that resolves to the reverse geocoding result.\n *\n * @throws Will attempt to use an alternative geocoding service if the primary service fails.\n */\nconst reverseGeocoder = async ({\n lon,\n lat,\n}: {\n lon: number;\n lat: number;\n}): Promise<ReverseGeocodingResult> => {\n // first, get city code from open reverse geocoder(local)\n try {\n const result = await openReverseGeocoder([lon, lat]);\n return result;\n } catch (error) {\n // if failed, get city code from GSI\n console.log('Failed to get city code from open reverse geocoder');\n return gsiReverseGeocoder({ lat, lon });\n }\n};\n\nexport { reverseGeocoder, getElevation };\n","import { geoContains } from 'd3-geo';\nimport axios, { AxiosInstance } from 'axios';\nimport { VectorTile } from 'mapbox-vector-tile';\nimport { ReverseGeocodingOptions, ReverseGeocodingResult } from './interfaces';\n\n/**\n * Get a tile from targeted country's tilesets by using x and y tile index\n * @param x x tile index\n * @param y y tile index\n * @param options ReverseGeocodingOptions\n * @param api Axios object\n * @returns VectorTile object\n */\nexport const getTile = async (\n x: number,\n y: number,\n options: ReverseGeocodingOptions,\n api: AxiosInstance = axios\n): Promise<VectorTile> => {\n const tileUrl = options.tileUrl\n .replace('{z}', String(options.zoomBase))\n .replace('{x}', String(x))\n .replace('{y}', String(y));\n\n let buffer;\n\n try {\n const res = await api.get(tileUrl, { responseType: 'arraybuffer' });\n buffer = Buffer.from(res.data, 'binary');\n } catch (error) {\n throw error;\n }\n\n const tile = new VectorTile(buffer);\n return tile;\n};\n\n/**\n * Get a result of reverse geocoding\n * @param tile VectorTile object\n * @param x x tile index\n * @param y y tile index\n * @param lnglat number[] longitude, latitude\n * @param options ReverseGeocodingOptions\n * @returns an object of result of reverse gecoding\n */\nexport const getTileResult = (\n tile: VectorTile,\n x: number,\n y: number,\n lnglat: [number, number],\n options: ReverseGeocodingOptions\n): ReverseGeocodingResult => {\n let layers = Object.keys(tile.layers);\n\n if (!Array.isArray(layers)) layers = [layers];\n\n let geocodingResult: ReverseGeocodingResult = {};\n layers.forEach((layerID) => {\n const layer = tile.layers[layerID];\n if (layer && options.layer === layer.name) {\n for (let i = 0; i < layer.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feature: any = layer.feature(i).toGeoJSON(x, y, options.zoomBase);\n if (layers.length > 1) feature.properties.vt_layer = layerID;\n\n const geojson = {\n type: 'FeatureCollection',\n features: [feature],\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = geoContains(geojson as any, lnglat);\n if (res) {\n geocodingResult = options.getResult(feature);\n }\n }\n }\n });\n return geocodingResult;\n};\n\n"],"names":["countryOptions","JP","zoomBase","tileUrl","layer","getResult","feature","_feature$properties","_feature$properties2","code","String","id","length","prefecture","properties","city","DEFAULT","api","setupCache","axios","create","timeout","ttl","interceptors","request","use","config","fullUrl","baseURL","url","URLSearchParams","params","toString","console","log","defaultOptions","_ref2","lon","lat","Promise","resolve","get","responseType","then","response","elevation","parseFloat","data","longitude","latitude","e","reject","_ref3","lnglat","opt","_extends","openReverseGeocoder","_lngLatToGoogle","lngLatToGoogle","x","y","options","buffer","_temp2","_result","VectorTile","replace","_temp","res","Buffer","from","_catch","error","getTile","tile","layers","Object","keys","Array","isArray","geocodingResult","forEach","layerID","name","i","toGeoJSON","vt_layer","geoContains","type","features","getTileResult","_ref","_result$results","results","muniCd","lv01Nm","gsiReverseGeocoder"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/countryOptions.ts","../src/muni.ts","../src/index.ts","../src/utils.ts"],"sourcesContent":["import {\n ReverseGeocodingOptions,\n ReverseGeocodingResultJP,\n} from './interfaces';\n\n/**\n * vector tiles settings for each country\n */\nconst countryOptions: { [s: string]: ReverseGeocodingOptions } = {\n JP: {\n zoomBase: 10,\n // tileUrl: `http://127.0.0.1:5500/docs/tiles/{z}/{x}/{y}.pbf`,\n tileUrl: 'https://skglobal-jsc.github.io/open-reverse-geocoder/tiles/{z}/{x}/{y}.pbf',\n layer: 'japanese-admins',\n getResult: function (feature: GeoJSON.Feature) {\n const res: ReverseGeocodingResultJP = {\n code:\n 5 === String(feature.id).length\n ? String(feature.id)\n : `0${String(feature.id)}`,\n prefecture: feature.properties?.prefecture,\n city: feature.properties?.city,\n };\n return res;\n },\n },\n};\n\n// default country options\ncountryOptions.DEFAULT = countryOptions.JP;\n\nexport default countryOptions;\n","// Muni file url\nconst MuniURL = 'https://maps.gsi.go.jp/js/muni.js';\nconst MuniRegex = /GSI\\.MUNI_ARRAY\\[\"\\d+\"\\]\\s*=\\s*'(.*?)';/g;\n\nimport axios from 'axios';\n\ninterface MuniRecord {\n prefCode: string;\n prefName: string;\n cityCode: string;\n cityName: string;\n}\n\ninterface MuniMap {\n [key: string]: MuniRecord;\n}\n\ninterface AddressResults {\n muniCd: string;\n lv01Nm: string;\n mesh_code?: string;\n notes?: string;\n}\n\n/**\n * parse muni.js\n * @param muniMap\n */\nconst parseMuniMap = (muniMap: string) => {\n const muniMapObj: MuniMap = {};\n const lines = muniMap.split('\\n');\n lines.forEach((line) => {\n if (MuniRegex.test(line)) {\n const muniRecord = parseMuniRecord(line);\n muniMapObj[muniRecord.cityCode] = muniRecord;\n }\n });\n return muniMapObj;\n};\n\n/**\n * parse muni record\n * @param line\n */\nconst parseMuniRecord = (line: string) => {\n const muniRecord = line.replace(MuniRegex, '$1');\n\n const muniRecordArray = muniRecord.split(',');\n\n // validate muni record\n if (muniRecordArray.length !== 4) {\n throw new Error(`invalid muni record: ${muniRecord}`);\n }\n\n let [prefCode, prefName, cityCode, cityName] = muniRecordArray;\n\n // if cityCode is not 5 digits, add 0 to the beginning\n cityCode = cityCode.padStart(5, '0');\n\n // if prefCode is not 2 digits, add 0 to the beginning\n prefCode = prefCode.padStart(2, '0');\n\n return {\n prefCode: prefCode,\n prefName: prefName,\n cityCode: cityCode,\n cityName: cityName,\n };\n};\n\n/**\n * Fetches the municipality map data from a specified URL.\n *\n * @returns {Promise<object>} A promise that resolves to the parsed municipality map data.\n *\n * @throws Will log an error message and return an empty object if the request fails.\n */\nconst getMuniMap = async () => {\n try {\n const response = await axios.get(MuniURL, {\n responseType: 'text',\n timeout: 500,\n });\n\n const muniMap = response.data;\n return parseMuniMap(muniMap);\n } catch (error) {\n console.log(`Failed to get muni map: ${error}`);\n return {};\n }\n};\n\n/**\n * converts muni code to address name.\n *\n * @param muniMap\n * @param muniCode\n */\nconst muniCodeToAddressName = (muniMap: MuniMap, muniCode: string) => {\n const muniRecord = muniMap[muniCode];\n if (!muniRecord) {\n throw new Error(`muni code ${muniCode} not found`);\n }\n\n const add = `${muniRecord.prefName}${muniRecord.cityName}`;\n return add.replace(/ /g, '');\n};\n\n/**\n * converts address result to address name.\n * @param muniMap\n * @param addressResults\n */\nconst addressResultsToAddressName = (\n muniMap: MuniMap,\n addressResults: AddressResults\n) => {\n const mc = addressResults.muniCd;\n const muniName = muniCodeToAddressName(muniMap, mc);\n const addrName = `${muniName}${addressResults.lv01Nm}`;\n return addrName;\n};\n\nconst getMuniMapLocations = async () => {\n const muniMap = await getMuniMap();\n // muniMap is a map of all cities and wards in Japan\n // key: city code, value: { prefCode, prefName, cityCode, cityName }\n // we need to convert this to a map of all locations in Japan\n // key: prefCode , value: { prefName, cities: { key: cityCode, value: { cityCode, cityName, wards: { key: wardCode, value: { wardCode, wardName } } } } }\n\n const muniMapLocations = {};\n Object.keys(muniMap).forEach((cityCode) => {\n const muniRecord = muniMap[cityCode];\n const { prefCode, prefName, cityName } = muniRecord;\n if (!muniMapLocations[prefCode]) {\n muniMapLocations[prefCode] = { prefName, cities: {} };\n }\n\n // if cityName contains ' ', it is a ward\n // otherwise, it is a city\n if (cityName.includes(' ')) {\n // ward name is after ' '\n const [name, wardName] = cityName.split(' ');\n // find city has the same name\n const city: any = Object.values(muniMap).find(\n (c: any) => c.cityName === name\n );\n if (!city) {\n console.log(`City ${name} not found in prefCode ${prefCode}`);\n } else {\n // add ward to city\n muniMapLocations[prefCode].cities[city.cityCode].wards[cityCode] = {\n prefCode,\n cityCode: cityCode,\n cityName: `${name}${wardName}`,\n bigCityFlag: '1',\n bigCityCode: city.cityCode,\n };\n }\n } else {\n muniMapLocations[prefCode].cities[cityCode] = {\n prefCode,\n cityCode,\n cityName,\n wards: {},\n };\n }\n });\n\n // assign bigCityFlag to each city\n Object.keys(muniMapLocations).forEach((prefCode) => {\n const pref = muniMapLocations[prefCode];\n Object.keys(pref.cities).forEach((cityCode) => {\n const city = pref.cities[cityCode];\n const isBigCity = Object.values(city.wards).length > 0;\n if (isBigCity) {\n city.bigCityFlag = '2';\n } else {\n // delete wards\n delete city.wards;\n // if city is tokyo then bigCityFlag is 3, otherwise 0\n if (city.prefCode === '13') {\n city.bigCityFlag = '3';\n } else {\n city.bigCityFlag = '0';\n }\n }\n });\n });\n\n return muniMapLocations;\n};\n\nexport { getMuniMap };\n","import { lngLatToGoogle } from 'global-mercator';\nimport axios from 'axios';\nimport { setupCache } from 'axios-cache-interceptor';\nimport {\n ReverseGeocodingOptions,\n ReverseGeocodingResult,\n ReverseGeocodingResultJP,\n} from './interfaces';\nimport countryOptions from './countryOptions';\nimport { getTile, getTileResult } from './utils';\n\nimport { getMuniMap } from './muni';\n\ntype LngLat = [number, number];\n\nconst api = setupCache(\n axios.create({\n timeout: 2000,\n }),\n {\n ttl: 60 * 60 * 24 * 1000, // 1 day\n }\n);\n\napi.interceptors.request.use((config) => {\n const fullUrl = `${config.baseURL}${config.url}?${new URLSearchParams(\n config.params\n ).toString()}`;\n console.log('Full URL:', fullUrl);\n return config;\n});\n\nconst defaultOptions = countryOptions.DEFAULT;\n\n/**\n * Performs reverse geocoding to obtain location information based on longitude and latitude.\n *\n * @param lnglat - The longitude and latitude coordinates.\n * @param options - Optional parameters for reverse geocoding.\n * @returns A promise that resolves to the reverse geocoding result.\n */\nconst openReverseGeocoder = async (\n lnglat: LngLat,\n options?: ReverseGeocodingOptions\n): Promise<ReverseGeocodingResult> => {\n const opt = { ...defaultOptions, ...options };\n const [x, y] = lngLatToGoogle(lnglat, opt.zoomBase);\n const tile = await getTile(x, y, opt, api);\n return getTileResult(tile, x, y, lnglat, opt);\n};\n\n/**\n * Performs reverse geocoding using the GSI (Geospatial Information Authority of Japan) API.\n * Given latitude and longitude coordinates, it returns the corresponding municipality code and city name.\n *\n * @param {Object} params - The parameters for the reverse geocoding request.\n * @param {number} params.lat - The latitude coordinate.\n * @param {number} params.lon - The longitude coordinate.\n * @returns {Promise<ReverseGeocodingResultJP>} A promise that resolves to an object containing the municipality code and city name.\n *\n * @example\n * const result = await gsiReverseGeocoder({ lat: 35.6895, lon: 139.6917 });\n * console.log(result); // { code: '13101', city: 'Chiyoda-ku' }\n */\nconst gsiReverseGeocoder = async ({\n lat,\n lon,\n}: {\n lat: number;\n lon: number;\n}) => {\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n const result = response.data;\n const {\n results: { muniCd: code, lv01Nm: city },\n } = result;\n return { code, city } as ReverseGeocodingResultJP;\n};\n\n/**\n * Retrieves the elevation for a given longitude and latitude using the GSI API.\n *\n * @param {Object} coordinates - The coordinates for which to get the elevation.\n * @param {number} coordinates.lon - The longitude of the location.\n * @param {number} coordinates.lat - The latitude of the location.\n * @returns {Promise<{ longitude: number, latitude: number, elevation: number }>}\n * A promise that resolves to an object containing the longitude, latitude, and elevation.\n */\nconst getElevation = async ({ lon, lat }: { lon: number; lat: number }) => {\n // first, get elevation from GSI\n const response = await api.get(\n 'https://mreversegeocoder.gsi.go.jp/general/dem/scripts/getelevation.php',\n {\n responseType: 'json',\n params: {\n lat,\n lon,\n },\n }\n );\n\n const elevation = parseFloat(response.data.elevation);\n return { longitude: lon, latitude: lat, elevation };\n};\n\n/**\n * Reverse geocodes the given longitude and latitude to obtain a city code.\n *\n * @param {Object} params - The parameters for reverse geocoding.\n * @param {number} params.lon - The longitude of the location.\n * @param {number} params.lat - The latitude of the location.\n *\n * @returns {Promise<ReverseGeocodingResult>} A promise that resolves to the reverse geocoding result.\n *\n * @throws Will attempt to use an alternative geocoding service if the primary service fails.\n */\nconst reverseGeocoder = async ({\n lon,\n lat,\n}: {\n lon: number;\n lat: number;\n}): Promise<ReverseGeocodingResult> => {\n // first, get city code from open reverse geocoder(local)\n try {\n const result = await openReverseGeocoder([lon, lat]);\n return result;\n } catch (error) {\n // if failed, get city code from GSI\n console.log('Failed to get city code from open reverse geocoder');\n return gsiReverseGeocoder({ lat, lon });\n }\n};\n\nexport { reverseGeocoder, getElevation, getMuniMap as getCityMap };\n","import { geoContains } from 'd3-geo';\nimport axios, { AxiosInstance } from 'axios';\nimport { VectorTile } from 'mapbox-vector-tile';\nimport { ReverseGeocodingOptions, ReverseGeocodingResult } from './interfaces';\n\n/**\n * Get a tile from targeted country's tilesets by using x and y tile index\n * @param x x tile index\n * @param y y tile index\n * @param options ReverseGeocodingOptions\n * @param api Axios object\n * @returns VectorTile object\n */\nexport const getTile = async (\n x: number,\n y: number,\n options: ReverseGeocodingOptions,\n api: AxiosInstance = axios\n): Promise<VectorTile> => {\n const tileUrl = options.tileUrl\n .replace('{z}', String(options.zoomBase))\n .replace('{x}', String(x))\n .replace('{y}', String(y));\n\n let buffer;\n\n try {\n const res = await api.get(tileUrl, { responseType: 'arraybuffer' });\n buffer = Buffer.from(res.data, 'binary');\n } catch (error) {\n throw error;\n }\n\n const tile = new VectorTile(buffer);\n return tile;\n};\n\n/**\n * Get a result of reverse geocoding\n * @param tile VectorTile object\n * @param x x tile index\n * @param y y tile index\n * @param lnglat number[] longitude, latitude\n * @param options ReverseGeocodingOptions\n * @returns an object of result of reverse gecoding\n */\nexport const getTileResult = (\n tile: VectorTile,\n x: number,\n y: number,\n lnglat: [number, number],\n options: ReverseGeocodingOptions\n): ReverseGeocodingResult => {\n let layers = Object.keys(tile.layers);\n\n if (!Array.isArray(layers)) layers = [layers];\n\n let geocodingResult: ReverseGeocodingResult = {};\n layers.forEach((layerID) => {\n const layer = tile.layers[layerID];\n if (layer && options.layer === layer.name) {\n for (let i = 0; i < layer.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feature: any = layer.feature(i).toGeoJSON(x, y, options.zoomBase);\n if (layers.length > 1) feature.properties.vt_layer = layerID;\n\n const geojson = {\n type: 'FeatureCollection',\n features: [feature],\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = geoContains(geojson as any, lnglat);\n if (res) {\n geocodingResult = options.getResult(feature);\n }\n }\n }\n });\n return geocodingResult;\n};\n\n"],"names":["countryOptions","JP","zoomBase","tileUrl","layer","getResult","feature","_feature$properties","_feature$properties2","code","String","id","length","prefecture","properties","city","DEFAULT","MuniRegex","api","setupCache","axios","create","timeout","ttl","interceptors","request","use","config","fullUrl","baseURL","url","URLSearchParams","params","toString","console","log","defaultOptions","Promise","resolve","get","responseType","then","response","muniMapObj","data","split","forEach","line","test","muniRecord","replace","muniRecordArray","Error","prefCode","prefName","cityCode","cityName","padStart","parseMuniRecord","_catch","error","e","reject","_ref2","lon","lat","elevation","parseFloat","longitude","latitude","_ref3","lnglat","opt","_extends","openReverseGeocoder","_lngLatToGoogle","lngLatToGoogle","x","y","options","buffer","_temp2","_result","VectorTile","_temp","res","Buffer","from","getTile","tile","layers","Object","keys","Array","isArray","geocodingResult","layerID","name","i","toGeoJSON","vt_layer","geoContains","type","features","getTileResult","_ref","_result$results","results","muniCd","lv01Nm","gsiReverseGeocoder"],"mappings":"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"}
package/dist/muni.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ interface MuniRecord {
2
+ prefCode: string;
3
+ prefName: string;
4
+ cityCode: string;
5
+ cityName: string;
6
+ }
7
+ interface MuniMap {
8
+ [key: string]: MuniRecord;
9
+ }
10
+ /**
11
+ * Fetches the municipality map data from a specified URL.
12
+ *
13
+ * @returns {Promise<object>} A promise that resolves to the parsed municipality map data.
14
+ *
15
+ * @throws Will log an error message and return an empty object if the request fails.
16
+ */
17
+ declare const getMuniMap: () => Promise<MuniMap>;
18
+ export { getMuniMap };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sk-global/js-msearch-gsi-jp",
3
- "description": "Reverse Geocoder, a library for reverse geocoding based on the Geospatial Information Authority of Japan (GSI) data",
4
- "version": "2.0.0",
3
+ "description": "A client library for APIs that presented by Geospatial Information Authority of Japan",
4
+ "version": "2.0.1",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.module.js",
@@ -9,13 +9,15 @@
9
9
  "types": "dist/index.d.ts",
10
10
  "files": [
11
11
  "dist/**.js*",
12
- "dist/**/*.ts"
12
+ "dist/**/*.ts",
13
+ "dist/data"
13
14
  ],
14
15
  "engines": {
15
16
  "node": ">=18.0.0"
16
17
  },
17
18
  "scripts": {
18
- "dev": "node src/local.mjs",
19
+ "dev": "ts-node ./src/local.ts",
20
+ "create-data": "ts-node ./src/create_data.ts",
19
21
  "build": "microbundle --define PKG_VERSION=$npm_package_version",
20
22
  "watch": "microbundle watch --define PKG_VERSION=$npm_package_version",
21
23
  "test": "jest --coverage",
@@ -60,6 +62,6 @@
60
62
  },
61
63
  "repository": {
62
64
  "type": "git",
63
- "url": "https://github.com/skglobal-jsc/reverse-geocoder"
65
+ "url": "https://github.com/skglobal-jsc/js-msearch-gsi-jp"
64
66
  }
65
67
  }