에 EPSG 프로젝션 경계를 변환 (말하자면이 알라바마 한 : [http://spatialreference.org/ref/epsg/26729/][1])는 EPSG 투사 감안할 D3.js
당신이 그들을 사용할 수있는 방법으로 주어진 WGS84 프로젝션 경계를 취할 수있는 방법D3.js 투영.
예를 들어지도를 표시하는 데 사용할 투영 각도, 회전 각도 또는 경계 상자를 어떻게 알 수 있습니까?
에 EPSG 프로젝션 경계를 변환 (말하자면이 알라바마 한 : [http://spatialreference.org/ref/epsg/26729/][1])는 EPSG 투사 감안할 D3.js
당신이 그들을 사용할 수있는 방법으로 주어진 WGS84 프로젝션 경계를 취할 수있는 방법D3.js 투영.
예를 들어지도를 표시하는 데 사용할 투영 각도, 회전 각도 또는 경계 상자를 어떻게 알 수 있습니까?
이것은 상당히 복잡한 질문입니다. 답은 공간 참조 (SRS 또는 좌표 참조 시스템 (CRS)) 시스템과 궁극적 인 목표에 따라 달라집니다.
나는이 대답에 d3.js의 V4를 사용하고
, 지도?
모든 예측을 포함하는 어렵고 빠른 규칙은 없습니다. 투영 매개 변수를 보면 일반적으로 투영을 신속하게 작성하기위한 충분한 정보를 얻을 수 있습니다. 투영이 d3의 상자 밖으로 나온다고 가정합니다.
매개 변수를 설정할 때 가장 좋은 조언은 회전 할 때와 중심에있을 때, 사용할 평행선 등을 말합니다. 투영을 다듬을 때 줌 아웃하여 각 매개 변수의 위치와 위치를 볼 수 있습니다. 너는보고있다. 그런 다음 확장 또는 범위 조정을 수행하십시오. this one과 같은 바운딩 박스에 geojson 유효성 검사기를 사용하십시오.
마지막으로 투영 된 데이터를 사용하여 d3.geoProjection을 완전히 삭제할 수 있습니다 (this question). 모든 데이터가 이미 같은 투영법에 투영 된 경우 투영법을 정의하는 것이 논점입니다.
난 당신이 데이텀의 차이를 보면 문제가 더 복잡해질 수 있다는 것을 빨리 알게 될 것이다. 예를 들어, 참조한 SRS는 NAD27 datum을 사용했습니다. 데이텀은 지구의 모양을 수학적으로 표현한 것으로, NAD27은 NAD83 또는 WGS84과 다를 수 있습니다. 단, 데이텀은 지구의 3 차원 표면을 나타 내기 때문에 모두도 단위로 측정됩니다. 충돌하는 데이텀을 사용하는 데이터를 혼합하는 경우 정밀도 문제가 발생할 수 있습니다. 예를 들어 NAD27과 NAD83 사이의 데이텀 이동은 필요에 따라 중요하지 않습니다 (위키 피 디아 스크린 샷, 이미지에 연결할 수 없음).
여러 개의 데이텀을 사용하기 때문에 위치가 어긋나는 것이 문제가되면 하나 이상의 표준 데이텀으로 변환하려면 d3 이상이 필요합니다. D3에서는 GPS 시스템에서 사용하는 WGS84를 사용할 것으로 가정합니다. 이러한 변화가 문제가되지 않는다면이 부분을 무시하십시오.
는 자, 당신의 투사에 EPSG:26729을 살펴 보자는 :
PROJCS["NAD27/Alabama East",
GEOGCS["NAD27",
DATUM["North_American_Datum_1927",
SPHEROID["Clarke 1866",6378206.4,294.9786982138982,
AUTHORITY["EPSG","7008"]],
AUTHORITY["EPSG","6267"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4267"]],
UNIT["US survey foot",0.3048006096012192,
AUTHORITY["EPSG","9003"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",30.5],
PARAMETER["central_meridian",-85.83333333333333],
PARAMETER["scale_factor",0.99996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
AUTHORITY["EPSG","26729"],
AXIS["X",EAST],
AXIS["Y",NORTH]]
이 투사의 꽤 표준에 대한 설명입니다. 각 유형의 투영에는 고유 한 매개 변수가 있으므로 항상 동일하지는 않습니다.
이 설명의 가장 중요한 부분
은 다음과 같습니다NAD27/Alabama East
프로젝션 이름, 필요하지하지만 좋은 참고 그것이 EPSG 번호보다 기억하기 좀 더 쉽게, 그리고 참조/도구 만 대신 일반 이름을 사용할 수 있습니다로 EPSG 번호.
PROJECTION["Transverse_Mercator"]
우리가 다루고있는 투영의 유형. 이것은 지구의 표면상의 점을 나타내는 3d 좌표가 직교 좌표계에서 2 차원 좌표로 어떻게 변환되는지를 정의합니다. 지원되는 프로젝션 (v3 - v4)의 d3 목록에없는 투영이 여기에 표시되면 커스텀 투영을 정의하는 작업이 조금 있습니다. 하지만, 일반적으로, 당신은 이것을 일치하는 투영법을 발견 할 것입니다. 투영의 유형은지도를 회전하거나 각 축의 중앙에 배치할지 여부를 변경합니다.
PARAMETER["latitude_of_origin",30.5],
PARAMETER["central_meridian",-85.83333333333333],
이 두 매개 변수는 투영의 중심을 설정합니다. 횡축 메르카토르의 경우 중앙 자오선 만 중요합니다. See this demo of the effect of choosing a central meridian on a transverse Mercator.
위도는 주로 노스 북에 대한 참조 점을 설정하는 데 사용됩니다. 중심 자오선은 eastings에서도 마찬가지이지만 위에서 언급했듯이 왜곡이 극점에서 극점으로 최소화되는 중앙 자오선을 설정합니다 (일반 메르카토르의 적도와 같습니다). 종이지도에서 x, y 위치를 비교하고 동일한 프로젝션을 공유하는 웹지도를 비교할 수 있도록 적절한 northings 및 eastings이 필요하면 d3이 아마도이 용도에 가장 적합한 수단이 아닙니다. 데카르트 좌표계에서 좌표를 측정하는 데 신경 쓰지 않는다면,이 매개 변수는 중요하지 않습니다. D3은 투영 좌표 시스템을 복제하지 않고 (피트로 측정 한 값은 false eastings/northings이지만) SVG 좌표에서 동일한 모양을 복제합니다 공간.
d3.geoTransverseMercator()
.rotate([85.8333,0])
.center([0,30.5])
는 이유는 대략 86도 회전 않았다
그래서, 투사 설명의 관련 매개 변수에 같을 것이다이 투사의 기원을 중심으로 d3.geoProjection을 기반으로? 이것은 가로 메르카토르가 만들어지는 방식입니다. 횡축 메르카토르의 demo에서는지도가 x 축을 따라 회전합니다. x 축 중심은 투영의 속성을 변경하지 않고지도를 좌우로 이동하는 것입니다. demo에서는 투영이 패닝과 근본적으로 다른 변화를 겪고 있음이 분명합니다. 이것은 적용되는 회전입니다. 내가 사용한 투영은 지구를 투사로 돌릴 때 음수입니다. 그래서이 투영은 -85.833도 또는 서쪽 85.8333도에 집중됩니다.
트랜스 버스 메르카토르 (Transverse Mercator)에서 왜곡이 자오선과 일치하므로 팬을 아래로 내릴 수 있고 회전 할 필요가 없습니다.이것이 내가 y 축 (이 경우 )을 사용하는 이유이며, 다른 경우 y 축을 y 축으로 회전하여 원통형 투영을지도 아래로 회전시켜 패닝과 동일한 결과를 얻을 수 있습니다). 우리는 공정한 조금을 축소하는 경우
이 투사의 모습입니다 :
그것은 꽤 왜곡 보일 수 있지만 및 알라바마 근처 영역을 표시하기위한 것입니다.
다음 질문은 자연스럽게이다 : 어떤 규모에 대해 그 안에 확대는 훨씬 더 일반적인보고 시작? 글쎄 이것은 뷰포트의 크기와 보여주고 자하는 영역에 따라 달라질 것입니다. 그리고, 당신의 투영은 경계를 지정하지 않습니다. 지도 투영의 범위를 보여주고 싶다면 답의 마지막 부분을 살펴 보겠습니다. 영사법에 범위가 있어도 표시하려는 영역 (일반적으로 전체 영사 범위 경계의 하위 집합)과 잘 맞지 않을 수 있습니다.
다른 곳으로 센터링하는 방법은 무엇입니까? 투영의 중심에있는 일이 발생하지 않는 마을 만 보여주고 싶습니까? 센터를 사용할 수 있습니다. x 축에서 지구를 회전 시켰기 때문에 중심 맞춤은 중앙 자오선을 기준으로합니다. [1,30.5]를 중심으로 중앙 자오선 (서쪽 85.8333도)의 동쪽 1도를 중심으로지도를 만듭니다. 따라서 x 구성 요소는 회전에 상대적이며, y 구성 요소는 적도와 관련이 있습니다 (위도).
d3.geoTransverseMercator()
.center([0,y])
.rotate([-x,0])
...
이 :
투사을 준수하는 것이 중요 경우
,이 이상한 센터링 동작하지 않을 경우, 당신이 좋아 보이는 돌출부를 가질 수 있도록 단순히 X 회전을 수정하는 것이 더 쉬울 수 있습니다, 필요 특정 지역에 맞게 최적화 된 횡단 메르카토르를 사용자 정의 할 수 있지만 출발 전망에서 벗어나는 비용이 듭니다.다른 전망은 다른 매개 변수가있을 수 있습니다. 예를 들어, 원뿔 투영은 하나의 접선 (접선) 또는 두 개의 (세컨드) 선을 가질 수 있습니다. 이것은 투영이 지구와 교차하는 점을 나타내므로 왜곡이 최소화됩니다.
d3.geoAlbers()
.rotate([-x,0])
.center([0,y])
.parallels([a,b])
See this answer on how to rotate/center an Albers (예컨대 알버스 또는 램버트 등각 등)이 돌기 접선 또는 할선을 나타내는 유사점을 지정하는 (중심 (Y), -x 회전)을 중심으로하는 동일한 방법을 사용하지만, 추가 파라미터가 (이 순간에 떠오르는 모든 원추형 투영에 대해 본질적으로 동일합니다).
평면/방위각 투영 (확인하지 않음)은 중심에 위치 할 가능성이 큽니다. 그러나 각지도 투영법은 '센터링'(일반적으로 .rotate와 .center의 조합)에 약간 다른 방법이있을 수 있습니다.
다른 프로젝션 유형/제품군을 설정하는 방법에 대한 많은 예제와 SO 질문이 있으며 대부분의 특정 예측에 도움이됩니다.
그러나, 당신은 경계를 지정하는 투사가있을 수 있습니다. 또는 image with a bounds and a projection 일 가능성이 있습니다. 이 경우 해당 경계를 지정해야합니다. 지정된 GeoJSON 개체에 맞게
투사의 규모를 설정하고 번역 :
projection.fitExtent (범위, 목적)이 가장 쉽게
d3.geoProjection()
의.fitExtent
방법을 사용하여 geojson의 기능을 수행 주어진 범위의 중심에 범위는 배열 [[x0, y0], [x1, y1]]로 지정됩니다. 여기서 x0은 경계 상자의 왼쪽이고, y0는 위쪽이며, x1은 오른쪽이고 y1은 아래입니다. 투영을 반환합니다.
(또한 this question/answer 참조)
내가 프로젝션을 정의하는 데 도움이 경계 상자의 사용을 설명하기 질문 here의 예제를 사용합니다. 그 투사와 그 경계 상자 (I이 편리했고, 충분히 빠른 정의 된 경계 상자와 좋은 예를 찾을 수 없습니다) :
목표는 다음과 같은 지식 map below를 투영하는 것그러나 경계 상자 좌표에 도달하기 전에 투영을 살펴 보겠습니다.
우리가 경계 상자를 기반으로 규모와 중심점을 선택 D3시키는 수있는 바와 같이,PROJCS["ETRS89/Austria Lambert",
GEOGCS["ETRS89",
DATUM["European_Terrestrial_Reference_System_1989",
SPHEROID["GRS 1980",6378137,298.257222101,
AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6258"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4258"]],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
PROJECTION["Lambert_Conformal_Conic_2SP"],
PARAMETER["standard_parallel_1",49],
PARAMETER["standard_parallel_2",46],
PARAMETER["latitude_of_origin",47.5],
PARAMETER["central_meridian",13.33333333333333],
PARAMETER["false_easting",400000],
PARAMETER["false_northing",400000],
AUTHORITY["EPSG","3416"],
AXIS["Y",EAST],
AXIS["X",NORTH]]
, 우리는 몇 가지 매개 변수에 대한 관심 :
PARAMETER["standard_parallel_1",49],
PARAMETER["standard_parallel_2",46],
이가이 경우에 뭔가 like입니다 지도 투영이 지구의 표면을 가로막는 두 개의 분리 선.
PARAMETER["central_meridian",13.33333333333333],
이 중앙 자오선 (하나가 마음에 와서 모든 원뿔 예측을 위해 할 것 같은) 우리가 X 축을 따라 투사를 회전에 사용할 수입니다.
그리고 가장 중요한 :
PROJECTION["Lambert_Conformal_Conic_2SP"],
이 줄은 우리에게 투사 패밀리/유형을 제공합니다.
d3.geoConicConformal()
.rotate([-13.33333,0]
.parallels([46,49])
이제, 이러한 제한에 의해 정의 된 경계 상자 :
은 전부이 우리에게 뭔가를 제공합니다
.fitExtent
(및 .fitSize
) 방법은 geojson 객체을 적절 투영 변환 스케일. 범위 내 여백을 건너 뛸 때 여기 .fitSize
을 사용합니다 (fitExtent
은 유일한 차이점입니다). 그래서 우리는 그 경계와 geojson 객체를 생성해야합니다
var bbox = {
"type": "Polygon",
"coordinates": [
[
[9.3, 49.2], [17.2, 49.2], [17.2, 46], [9.3, 46], [9.3,49.2]
]
]
}
이 right hand rule를 사용하고, (그렇지 않으면 끝없는 슬픔) 당신의 시작 지점과 동일한 최종 점을 기억하십시오.
이제이 방법을 호출하면됩니다. 이미지를 사용하여 프로젝션 매개 변수의 유효성을 검사하고 있으므로 원하는 가로 세로 비율을 알 수 있습니다. 종횡비를 모르는 경우 너비 또는 높이가 초과 될 수 있습니다..
var projection = d3.geoConicConformal()
.parallels([46,49])
.rotate([-13.333,0])
.fitSize([width,height],bbox)
그리고 (마음에 무겁게 다운 샘플링 세계 topojson 유지)와 같은 행복을 찾고 최종 제품 :
젠장, 나는 그 부분을 결론이나 요약이라고 불렀어야하며 짧은 답변을 더 명확하게 제공해야한다고 생각했다 : "의존한다". –
StackOverflow 정책에 위배된다는 것을 알고 있지만 @AndrewReid는이 사이트에서 본 최고의 답변 중 하나입니다. 엄청나게 도움이되고 유용합니다. 세부 사항에 관심을 가져 주셔서 감사합니다! – aboutaaron