Node.js рдореЗрдВ GeoJSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛: рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рдЪрдп

рдЬрд┐рдпреЛрдВрд╕рди рдЬреЛрдВрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рднреМрдЧреЛрд▓рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдкреНрд░рд╛рд░реВрдк рд╣реИред GeoJSON рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдмреЗрд╣рддрд░реАрди рдЙрдкрдХрд░рдг рд╣реИрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░рд╛рд░реВрдк рди рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рднрдВрдбрд╛рд░рдг рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣, рдЕрдВрдХреЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдХреЛ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рд▓рд╛рдЗрдиреЗрдВ, рдмрд╣реБрднреБрдЬ, рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ред



рдмрд┐рдВрджреБ - рдмрд┐рдВрджреБ рд╡рд╕реНрддреБ


GeoJSON рдмрд┐рдВрджреБ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

{
  "type": "Point",
  "coordinates": [-80.1347334, 25.7663562]
}

рдпрд╣ рдмрд┐рдВрджреБ рдорд┐рдпрд╛рдореА рдмреАрдЪ, рдлреНрд▓реЛрд░рд┐рдбрд╛, рдЕрдореЗрд░рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрд╛рд░реНрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ ред рдЖрдк geojson.io рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред


рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ

рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕рдордиреНрд╡рдпcoordinatesрдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ[lng, lat]ред GeoJSON рдореЗрдВ рджреЗрд╢рд╛рдВрддрд░ рдЕрдХреНрд╖рд╛рдВрд╢ рд╕реЗ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИ ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЗрд╢рд╛рдВрддрд░ рдкреВрд░реНрд╡-рдкрд╢реНрдЪрд┐рдо рджрд┐рд╢рд╛ (xрдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░рдЕрдХреНрд╖) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдХреНрд╖рд╛рдВрд╢ рдЙрддреНрддрд░-рджрдХреНрд╖рд┐рдг рджрд┐рд╢рд╛ (yрдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░рдЕрдХреНрд╖) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред GeoJSON рд▓реЗрдЦрдХреЛрдВ рдиреЗрд╕рдордиреНрд╡рдп рдХреНрд░рдо рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдорд╛рдВрдЧ рдХреАx, yред

GeoJSON рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рдпреЛрдХреЛрдбрд┐рдВрдЧ рд╣реИ - рджреЗрд╢рд╛рдВрддрд░реЛрдВ рдФрд░ рдЕрдХреНрд╖рд╛рдВрд╢реЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ "429 рд▓реЗрдиреЙрдХреНрд╕ рдПрд╡реЗрдиреНрдпреВ, рдорд┐рдпрд╛рдореА рдмреАрдЪ, рдПрдлрдПрд▓" рдЬреИрд╕реЗ рдкрддреЗ рдХрд╛ рдЕрдиреБрд╡рд╛рджред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВрдЬрд┐рдпреЛрдХреЛрдбрд┐рдВрдЧ рдореИрдкрдмреЙрдХреНрд╕ред рдЗрд╕ API рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдирд┐рдореНрди рдмрд┐рдВрджреБ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

https://api.mapbox.com/geocoding/v5/mapbox.places/429%20lenox%20ave%20miami.json?access_token=pk.eyJ1IjoibWF0dGZpY2tlIiwiYSI6ImNqNnM2YmFoNzAwcTMzM214NTB1NHdwbnoifQ.Or19S7KmYPHW8YjRz82v6g&cachebuster=1581993735895&autocomplete=true

рдЬрд╡рд╛рдм рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЖрдПрдЧрд╛:

{"type":"FeatureCollection","query":["429","lenox","ave","miami"],"features":[{"id":"address.8052276751051244","type":"Feature","place_type":["address"],"relevance":1,"properties":{"accuracy":"rooftop"},"text":"Lenox Avenue","place_name":"429 Lenox Avenue, Miami Beach, Florida 33139, United States","center":[-80.139145,25.77409],"geometry":{"type":"Point","coordinates":[-80.139145,25.77409]}, ...}

рдпрджрд┐ рдЖрдк рдЙрддреНрддрд░ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ features[0].geometryJSON рдХреЛрдб рдореЗрдВ рдпрд╣ рдПрдХ GeoJSON рдмрд┐рдВрджреБ рд╣реИ:

{"type":"Point","coordinates":[-80.139145,25.77409]}




рдПрдкреАрдЖрдИ рд╕реНрдЯреЗрдЯрд┐рдХ рдореИрдкреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореИрдкрдмреЙрдХреНрд╕ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░ рдЕрдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИред рдиреАрдЪреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреА рдЧрдИ рд╣реИ, рдЬреЛ рдЙрд╕рдореЗрдВ рджреА рдЧрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддреА рд╣реИ рдФрд░ рдЙрд╕ URL рдХреЛ рдЙрд╕ рдЫрд╡рд┐ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИред

const axios = require('axios');

async function search(str) {
  const geocoderUrl = 'https://api.mapbox.com/geocoding/v5/mapbox.places/' +
    encodeURIComponent(str) +
    '.json?access_token=' +
    'pk.eyJ1IjoibWF0dGZpY2tlIiwiYSI6ImNqNnM2YmFoNzAwcTMzM214NTB1NHdwbnoifQ.Or19S7KmYPHW8YjRz82v6g';

  const res = await axios.get(geocoderUrl).then(res => res.data);
  const point = res.features[0].geometry;

  return 'https://api.mapbox.com/styles/v1/mapbox/streets-v11/static/' +
    'pin-l-1+333(' + point.coordinates[0] + ',' + point.coordinates[1] + ')/' +
    point.coordinates[0] + ',' + point.coordinates[1] +
    ',14.25,0,0/600x600/' +
    '?access_token=pk.eyJ1IjoibWF0dGZpY2tlIiwiYSI6ImNqNnM2YmFoNzAwcTMzM214NTB1NHdwbnoifQ.Or19S7KmYPHW8YjRz82v6g';
}

search('429 Lenox Ave, Miami Beach').then(res => console.log(res));


рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рддрд░реНрдЬ - рд░реЗрдЦрд╛рдУрдВ рдХреА рд░реЗрдЦрд╛рдПрдБ


GeoJSON рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ LineStringрдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирдХреНрд╢реЗ рдкрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд LineStringрд╕рдВрдпреБрдХреНрдд рд░рд╛рдЬреНрдп рдЕрдореЗрд░рд┐рдХрд╛ рдореЗрдВ рдХреИрд▓рд┐рдлреЛрд░реНрдирд┐рдпрд╛ рдФрд░ рдУрд░реЗрдЧрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдиреБрдорд╛рдирд┐рдд рд╕реАрдорд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ GeoJSON рд╡рд╕реНрддреБ рд╣реИ :

{
  "type": "LineString",
  "coordinates": [[-124.2, 42], [-120, 42]]
}


рдкрд░ рдПрдХ рдирдХреНрд╢рд╛ рдПрдХ LineString рдкреНрд░рддрд┐рдкрд╛рджрди

рд▓рд╛рдЗрдиреНрд╕, рдХреА рддрд░рд╣ рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ MapBox , рджреЛ рдЕрдВрдХ рдХреЗ рдмреАрдЪ рдПрдХ рдХрджрдо-рджрд░-рдХрджрдо рдкрде рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рд╕рдбрд╝рдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛[-80.139145,25.77409](рдорд┐рдпрд╛рдореА рдмреАрдЪ рдореЗрдВ рд╡реЗрд╡рд░реНрдХ рдХрд╛рд░реНрдпрд╛рд▓рдп) рдПрдХ рдмрд┐рдВрджреБ[-80.2752743,25.7938434](рдорд┐рдпрд╛рдореА рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ) рдкрд░ рдПрдХ рдЬреЗрдЬреЗрдиреНрд╕рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИLineString:

{
  "type": "LineString",
  "coordinates": [
    [-80.139153, 25.774281],
    [-80.13829, 25.774307],
    [-80.142029, 25.774479],
    [-80.148438, 25.772148],
    [-80.151237, 25.772232],
    [-80.172043, 25.78116],
    [-80.177322, 25.787195],
    [-80.185326, 25.787212],
    [-80.189804, 25.785891],
    [-80.19268, 25.785954],
    [-80.202301, 25.789175],
    [-80.207954, 25.788721],
    [-80.223, 25.782646],
    [-80.231026, 25.78261],
    [-80.238007, 25.784889],
    [-80.246025, 25.784403],
    [-80.249611, 25.785175],
    [-80.253166, 25.786049],
    [-80.259262, 25.786324],
    [-80.264038, 25.786186],
    [-80.264221, 25.787256],
    [-80.264214, 25.791618],
    [-80.264221, 25.792633],
    [-80.264069, 25.795443],
    [-80.263397, 25.795652],
    [-80.263786, 25.794928],
    [-80.267723, 25.794926],
    [-80.271141, 25.794859],
    [-80.273163, 25.795704],
    [-80.275009, 25.796482],
    [-80.277481, 25.796461],
    [-80.278435, 25.795622],
    [-80.278061, 25.794088],
    [-80.275276, 25.793804]
  ]
}

LineStringрдХреБрдЫ рдорд╛рд░реНрдЧ рдЬреЛ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рд╡реЗ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рд╡рд╕реНрддреБ, 15 рдорд┐рдирдЯ рдХреА рдЫреЛрдЯреА рд╕рд╡рд╛рд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред рдпрд╣ рд╕рдм рдирдХреНрд╢реЗ рдкрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред


рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдкрде

рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИLineStringрдЬреЛdirectionsрдореИрдкрдмреЙрдХреНрд╕рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдкрде рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред

const axios = require('axios');

async function directions(fromPt, toPt) {
  const fromCoords = fromPt.coordinates.join(',');
  const toCoords = toPt.coordinates.join(',');
  const directionsUrl = 'https://api.mapbox.com/directions/v5/mapbox/driving/' +
    fromCoords + ';' + toCoords + '?' +
    'geometries=geojson&' +
    'access_token=pk.eyJ1IjoibWF0dGZpY2tlIiwiYSI6ImNqNnM2YmFoNzAwcTMzM214NTB1NHdwbnoifQ.Or19S7KmYPHW8YjRz82v6g';

  const res = await axios.get(directionsUrl).then(res => res.data);
  return res.routes[0].geometry;
}

const wework = { type: 'Point', coordinates: [-80.139145,25.77409] };
const airport = { type: 'Point', coordinates: [-80.2752743,25.7938434] };

directions(wework, airport).then(res => {
  console.log(res);
});

рдмрд╣реБрднреБрдЬ - рдмрд╣реБрднреБрдЬ рд╡рд╕реНрддреБрдПрдБ


GeoJSON рдмрд╣реБрднреБрдЬ, рд╡рд╕реНрддреБрдУрдВ PolygonрдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░ рдмрдВрдж рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рдПрдХ рддреНрд░рд┐рднреБрдЬ, рд╡рд░реНрдЧ, рдбреЛрдбреЗрдХреЗрдЧрди рдпрд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЖрдХрд╛рд░ рдореЗрдВ рдкрдХреНрд╖реЛрдВ рдХреА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд GeoJSON рд╡рд╕реНрддреБ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдВрдпреБрдХреНрдд рд░рд╛рдЬреНрдп рдЕрдореЗрд░рд┐рдХрд╛ рдореЗрдВ рдХреЛрд▓реЛрд░рд╛рдбреЛ рд░рд╛рдЬреНрдп рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ:

{
  "type": "Polygon",
  "coordinates": [[
    [-109, 41],
    [-102, 41],
    [-102, 37],
    [-109, 37],
    [-109, 41]
  ]]
}


рдПрдХ рдирдХреНрд╢реЗ рдкрд░ рдмрд╣реБрднреБрдЬ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди

GeoJSON polygons рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдЖрдХреГрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдмреЗрд░ рдиреЗ рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдпреЛрдиреНрд╕рди-рдЯреНрд░реЗрдирд┐рдВрдЧ рдЧреНрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реИрди рдлреНрд░рд╛рдВрд╕рд┐рд╕реНрдХреЛ рдЦрд╛рдбрд╝реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рднреА 3 рдкреНрд░рдореБрдЦ рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ GeoJSON-polygon

рд╕рдЪ рд╣реИ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ GeoJSON-polygons рд╣рд▓рдХреЛрдВ рдФрд░ рджреАрд░реНрдШрд╡реГрддреНрдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╣реБрднреБрдЬ рдХрд┐рдирдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ? рдЖрдорддреМрд░ рдкрд░ - рдЬрд┐рдпреЛрдлреЗрдВрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЙрдмрд░ рдореЗрдВ рдпрд╛ Lyft рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ рд╕реЗ рдпрд╛рддреНрд░рд╛рдПрдВ рдмреБрдХ рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░реАрдиред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЬрд┐рд╕ рдмрд┐рдВрджреБ рд╕реЗ рдпрд╛рддреНрд░рд╛ рдмреБрдХ рдХреА рдЧрдИ рд╣реИ, рд╡рд╣ рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реИ (рдпрд╛ рдкрд┐рдЫрд▓реЗ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рдХрдИ рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ)ред

рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрднреБрдЬ рдХреЗ рднреАрддрд░ рдПрдХ GeoJSON рдмрд┐рдВрджреБ рд╣реИ, рдЬреЛ Turpm npm рдореЙрдбреНрдпреВрд▓рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдореЙрдбреНрдпреВрд▓ @turf/boolean-point-in-polygon рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдмрд┐рдВрджреБ рдмрд╣реБрднреБрдЬ рдХреЗ рднреАрддрд░ рд╣реИред

const pointInPolygon = require('@turf/boolean-point-in-polygon').default;

const colorado = {
  "type": "Polygon",
  "coordinates": [[
    [-109, 41],
    [-102, 41],
    [-102, 37],
    [-109, 37],
    [-109, 41]
  ]]
};

const denver = {
  "type": "Point",
  "coordinates": [-104.9951943, 39.7645187]
};

const sanFrancisco = {
  "type": "Point",
  "coordinates": [-122.4726194, 37.7577627]
};

// true
console.log(pointInPolygon(denver, colorado));

// false
console.log(pointInPolygon(sanFrancisco, colorado));

рдЯрд░реНрдл рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рдПрдХ рдмрд┐рдВрджреБ рдмрд╣реБрднреБрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рд╕рдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЬреНрдЮрд╛рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрд┐рд▓реНрдЯ-рдЗрди MongoDB рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ$geoIntersects GeoJSON рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдХреНрд╡реЗрд░реА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрдореЗрд░рд┐рдХреА рд░рд╛рдЬреНрдп рдирдХреНрд╢реЗ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:

const mongoose = require('mongoose');

run().catch(err => console.log(err));

async function run() {
  await mongoose.connect('mongodb://localhost:27017/geotest', {
    useNewUrlParser: true,
    useUnifiedTopology: true
  });
  await mongoose.connection.dropDatabase();

  const State = mongoose.model('State', mongoose.Schema({
    name: String,
    location: mongoose.Schema({
      type: String,
      coordinates: [[[Number]]]
    })
  }));

  const colorado = await State.create({
    name: 'Colorado',
    location: {
      "type": "Polygon",
      "coordinates": [[
        [-109, 41],
        [-102, 41],
        [-102, 37],
        [-109, 37],
        [-109, 41]
      ]]
    }
  });

    const denver = {
    "type": "Point",
    "coordinates": [-104.9951943, 39.7645187]
  };

  const sanFrancisco = {
    "type": "Point",
    "coordinates": [-122.4726194, 37.7577627]
  };

  //     ?
  let res = await State.findOne({
    location: {
      $geoIntersects: { $geometry: denver }
    }
  });
  res.name; // 

  //     -?
  res = await State.findOne({
    location: {
      $geoIntersects: { $geometry: sanFrancisco }
    }
  });
  res; // null
}

рд╕рд╛рд░рд╛рдВрд╢


GeoJSON рди рдХреЗрд╡рд▓ рдЕрдВрдХреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рднрдВрдбрд╛рд░рдг рд╣реИред рдЖрдк рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред GeoJSON рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЬрд┐рдпреЛрдлреЗрдВрд╕ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ рдерд╛ред рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ GeoJSON рднреА рдЖрдкрдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред GeoJSON рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЖрд╕рдкрд╛рд╕, рдорд╣рд╛рди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ, рд╕рдВрд╕рд╛рдзрди geojson.io рдЖрдкрдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд░рд▓ рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдкрдмреЙрдХреНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрдиреНрдирдд рднреМрдЧреЛрд▓рд┐рдХ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЯрд░реНрдл рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдФрд░ Node.js. рдореЗрдВ рднреВ-рд╕реНрдерд╛рдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

MongoDB рднреМрдЧреЛрд▓рд┐рдХ рдбреЗрдЯрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рдЕрдВрдХреЛрдВ рдХреЗ рдпреБрдЧреНрдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреМрдЧреЛрд▓рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬреЗрдЬреЗрдиреНрд╕рди рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдорд╣рд╛рди рд╡рд┐рдХрд╛рд╕ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк GeoJSON рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?


All Articles