web-dev-qa-db-ja.com

geojsonサークル、サポートされているかどうか?

GeoJsonの仕様を調べると、サークルがサポートされていることがわかります。

http://geopriv.dreamhosters.com/geojson/geojson-spec.html#circleExample

しかし、geojsonlint( http://geojsonlint.com/ )でコードを試してみると、エラーが発生します。

入力:

{ 
"type": "Circle",
"coordinates": [4.884, 52.353],
"radius": 200
}

与える:

"Circle" is not a valid GeoJSON type. 

D3を使用して、さまざまな関心のある場所を地図上にさまざまな影響を与えて表示したいと思います。入力にはGeoJsonが必要ですが、GeoJsonで円がサポートされていないのは本当ですか?

15
cantdutchthis

GeoJsonの仕様を調べると、サークルがサポートされていることがわかります

そうではありません。偽の仕様や間違った仕様を見つけることができたようです。 geojson.orgにアクセスして specs を見つけてください。円については何もありません。

25
L. Sanna

受け入れられた回答 が説明しているように、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);

円がサポートされていない理由を明確にするために、それは地球の曲率と関係があります。地球は完全な球体ではないので、円を描くと完全な円にもなりません。ただし、上記のソリューションは、重要な精度を必要としないほとんどのシナリオで機能します。

6
arg20

Geojsonによる円のサポートはありませんが、LineStringを使用して円をシミュレートできます

lineStringgeiometryオブジェクトを使用する

"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
Chen Yuling
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!
-- 
0
Matroc