Круги geojson, поддерживаются или нет?
Когда я просматриваю спецификации GeoJson, я вижу, что круги поддерживаются:
http://geopriv.dreamhosters.com/geojson/geojson-spec.html#circleExample
Когда я пытаюсь выполнить код в geojsonlint (http://geojsonlint.com/), это дает мне ошибку.
Input:
{
"type": "Circle",
"coordinates": [4.884, 52.353],
"radius": 200
}
Дает:
"Circle" is not a valid GeoJSON type.
Я хочу показать разные места интересов с диапазоном влияния на карте с помощью d3. Для ввода данных требуется GeoJson, но верно, что круги не поддерживаются GeoJson?
Ответы
Ответ 1
Когда я просматриваю спецификации GeoJson, я вижу, что круги поддерживаются
Это не так. Кажется, вам удалось найти некоторые поддельные или неправильные спецификации. Перейдите на страницу geojson.org, чтобы найти спецификации, ничего о кругах нет.
Ответ 2
Как объясняет принятый ответ, круги не поддерживаются в спецификации GeoJson.
Большинство реализаций карт, однако, позволяют вам создавать круги, но в случае, если это не сработает для вас (например, вам нужно сохранить его в базе данных и запросить его), решение состоит в создании многоугольника, который приблизительно приближается к кругу. (представьте многоугольник с ребрами 32+).
Я написал модуль, который делает это. Вы можете использовать это так:
const circleToPolygon = require('circle-to-polygon');
const coordinates = [-27.4575887, -58.99029]; //[lon, lat]
const radius = 100; // in meters
const numberOfEdges = 32; //optional that defaults to 32
let polygon = circleToPolygon(coordinates, radius, numberOfEdges);
Чтобы выяснить, почему круги не поддерживаются, это связано с искривлением земли. Поскольку земля не является идеальной сферой, если бы вы нарисовали на ней круглую форму, она бы тоже не была идеальной. Однако приведенное выше решение подходит для большинства сценариев, в которых вам не требуется критическая точность.
Ответ 3
Нет поддержки круга от geojson,
но вы можете использовать LineString для моделирования круга
использовать объект геометрической линии LineString
"geometry": {
"type": "LineString",
"coordinates": [
[center_X, center_y],
[center_X, center_y]
]
}
then set the dynamic style use radius as the strokeweight
function featureStyle(feature){
return {
strokeWeight: radius,
};
}
он выглядит как круг на карте.
Ответ 4
A circle... some code I use for making a circle for an OpenStreetMap
-- x is decimal latitude
-- y is decimal longitude
-- r is radius -- .00010 is about 40m in OSM (3 about 50km)
-- Adjust for map latitude distortion further north or south
x = math.log(math.tan((90 + x) * math.pi/360)) / (math.pi/180)
-- For loop to gather all the points of circle here 1 to 360
-- can also use the for loop to make some other interesting shapes
for i = 1, 360 do
angle = i * math.pi / 180
ptx = x + r * math.cos( angle )
pty = y + r * math.sin( angle )
-- readjust latitude for map distortion
ptx = 180/math.pi * (2 * math.atan(math.exp( ptx * math.pi/180)) - math.pi/2 )
-- Build an array of positions for GeoJSON - formatted lat and long
data[i] = '[' .. string.format("%.6f",pty) .. ","
data[i] = data[i] .. string.format("%.6f",ptx) .. ']'
-- End of for loop
end
-- Cycle through the data array with another for loop to build the
coordinates (put in brackets and commas etc. for the actual
GeoJSON coordinates string. Add data[1] to the end to close
the polygon (circle). A circle.
-- If you want a solid circle then use fill and a hex color
-- If you want a LineString just make fill invisible or #ffffff
Include the stroke-width and stroke-color parameters as well.
-- If latitude is greater than 89.5 or less than -89.5 you may wish
to cut off the circle by drawing a line at polar regions by using
those latitudes.
-- I use this simply for several circles and not for hundreds of them.
Cheers!
--
Ответ 5
Используйте свойства объекта для хранения дополнительной информации о функции.