Skip to content

RU Географические траектории

mingun edited this page Jun 16, 2014 · 3 revisions

ВикиСправка по APIГеографияГеографические траектории
English | Русский

Для картографических визуализаций D3 поддерживает небольшую группу компонентов для отображения и манипуляции географическими данными. Эти компоненты используют формат GeoJSON — стандартный способ представления географических возможностей в JavaScript (также посмотрите на формат TopoJSON, расширение формата GeoJSON, который делает его значительно более компактным). Для конвертирования файлов форм в GeoJSON используйте ogr2ogr из пакета GDAL.

Также вас могут заинтересовать другие инструменты:

  • TopoJSON — упрощение файлов форм, конструирование топологии и сжатие GeoJSON.
  • Shapely — манипуляция планарными геометрическими объектами.
  • ColorBrewer — цветовые шкалы для карт.
  • PostGIS — геопространственная база данных.

Основным механизмом для отображения географических данных является d3.geo.path. Этот класс подобен классу d3.svg.line и другим генераторам фигур SVG: по данной геометрии или объекту-описанию он генерирует строковые данные пути, подходящие для вставки в атрибут "d" SVG-элемента path. Класс d3.geo.path может быть отрисован непосредственно на холсте (Canvas), что может дать лучшую производительность при анимировании проекции.

# d3.geo.path()

Создаёт новый генератор географических траекторий с настройками по умолчанию: проекцией albersUsa и радиусом точки в 4.5 пикселя.

# path(feature[, index])

Возвращает строковые данные пути для данной характеристики feature, котороя может быть одной из характеристик GeoJSON или геометрическим объектом:

  • Point — позиция.
  • MultiPoint — массив позиций.
  • LineString — массив позиций, формирующих непрерывную линию.
  • MultiLineString — массив массивов позиций, формирующих несколько линий.
  • Polygon — массив массивов позиций, формирующих многоугольник (возможно, с дырами).
  • MultiPolygon — многомерный массив позиций, формирующий несколько многоугольников.
  • GeometryCollection — массив геометрических объектов.
  • Feature — характеристика, содержащая один из выше приведённых геометрических объектов.
  • FeatureCollection — массив объектов характеристик.

Так же поддерживается тип "Sphere" (сфера), который полезен для отрисовки контура глобуса. Сфера не имеет координат. Может быть указан необязательный индекс index, который передаётся в функцию доступа pointRadius; index передаётся автоматически при вызове генератора траекторий из selection.attr.

Важно: точки находятся внутри многоугольника, если многоугольник огибает их по часовой стрелке. Если ваш входной GeoJSON содержит многоугольники с неправльным порядком обхода, вы должны обратить его, например с помощью ST_ForceRHR; также вы можете преобразовать ваш GeoJSON в TopoJSON, и это будет сделано автоматически.

Для отрисовки нескольких характеристик, вы можете поместить их в одну характеристику-коллекцию и один элемент path:

svg.append("path")
    .datum({type: "FeatureCollection", features: features})
    .attr("d", d3.geo.path());

Или вы можете создать несколько различных элементов path:

svg.selectAll("path")
    .data(features)
  .enter().append("path")
    .attr("d", d3.geo.path());

Использование различных элементов path обычно более медленно, нежели использование одного элемента path вместе с коллекцией. Однако, различные элементы path предпочтительны, если вы хотите взаимодейтсвовать с каждой характеристикой по отдельности (например, используя псевдокласс CSS :hover или события click).

# path.projection([projection])

Если указан параметр projection, устанавливает проекцию, используемую генератором путей, в указанную функцию проекции. Если параметр projection не указан, возвращает текущую проекцию, которая по умолчанию установлена в albersUsa. Проекция обычно является одной из встроенных в D3 географический проекций; однако, может использоваться любая функция. Функция проецирования принимает двухэлементный массив чисел, представляющих координаты местоположения [долгота, широта], и возвращает подобный двухэлементный массив чисел, представляющих спроектированные позиции пикселей [x, y]. Например, элементарная сферическая проекция Меркатора:

function mercator(coordinates) {
  return [
    coordinates[0] / 360,
    (-180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + coordinates[1] * Math.PI / 360))) / 360
  ];
}

В деталях реализации, эта точечная функция проекции обёрнута в запасной преобразователь потока, который позволяет выполнять адаптивную передискретизацию. Однако, запасной поток не делает никакого отсечения или обрезания.

Для большего контроля над потоковыми трансформациями, параметр projection может быть определён как объект, реализующий метод stream (смотрите пример). Метод stream берёт выходной поток как входной и возвращает обёрнутый поток, который проецирует входную геометрию; другими словами, он реализует projection.stream.

Если параметр projection равен null, путь будет использовать единичную трансформацию, когда входная геометрия не проецируется, а вместо этого отрисовывается непосредственно в сырых координатах. Это может быть полезно для быстрой отрисовки уже спроецированной геометрии или для быстрой отрисовки равнопромежуточной проекции.

# path.context([context])

Если указан параметр context, устанавливает контекст рисования и возвращает генератор путей. Если context равен null, то генератор путей будет возвращать строку пути SVG при вызове на данной характеристике. Если context не равен null, генератор пути будет вместо этого вызывать методы указанного контекста для отрисовки геометрии. Контекст должен реализовывать следующие методы:

  • beginPath()
  • moveTo(x, y)
  • lineTo(x, y)
  • arc(x, y, radius, startAngle, endAngle)
  • closePath()

Обратите внимание, что это подмножество методов элемента холста для двумерного контекста рисования и, таким образом, контекст холста может быть передан в генератор пути, в этом случае геометрия будет отрисована непосредственно на холсте. Если параметр context не указан, возвращает текущий контекст рисования, который по умолчанию установлен в null.

# path.area(feature)

Вычисляет площадь проецирования (в квадратных пикселях) для указанной характеристики feature. Характеристики Point, MultiPoint, LineString и MultiLineString всегда имеют нулевую площадь. Для характеристик Polygon и MultiPolygon этот метод сначала вычисляет площадь охватывающего кольца, а затем вычитает площади любых внутренних отверстий. Этот метод замечает любые отсечения и передискретизации, производимые потоком проецирования.

# path.centroid(feature)

Вычисляет спроецированный центр масс (в пикселях) для указанной характеристики feature. Это удобно, например, для пометок границ между регионами или государствами, или отображения карты символов. Пример несмежных картограмм масштабирует каждый штат относительно его центра. Этот метод замечает любые отсечения и передискретизации, производимые потоком проецирования.

# path.bounds(feature)

Вычисляет спроецированный ограничивающий прямоугольник (в пикселях) для указанной характеристики feature. Это удобно, например, для масштабирования конкретной характеристики. Этот метод замечает любые отсечения и передискретизации, производимые потоком проецирования.

# path.pointRadius([radius])

Если указан параметр radius, устанавливает радиус, используемый для отображения характеристик Point и MultiPoint, в указанное число. Если параметр radius не указан, возвращает текущий радиус. Хотя радиус обычно определяется числовой константой, он также может быть указан в виде функции, которая вычисляется для каждой характеристики, параметрами в неё передаются характеристика feature и индекс index из функции path. Например, если ваши данные GeoJSON имеют дополнительные свойства, вы можете получить к ним доступ изнутри функции радиуса для изменения размеров точки; или же вы можете использовать d3.svg.symbol и проекцию для большего контроля отображения.

Генераторы фигур

Обратите внимание: для генерирования большой дуги в D3, просто передайте объект геометрии типа LineString в d3.geo.path. Проекции D3 используют интерполяцию по большой дуге для промежуточных точек (с адаптивной передискретизацией), так что вам не нужно использовать генератор фигур для создания больших дуг.

# d3.geo.graticule

Конструирует генератор характеристик для создания картографических сеток.

# graticule()

Возвращает объект геометрии типа MultiLineString, представляющий все меридианы и параллели этой картографической сетки.

# graticule.lines()

Возвращает массив объектов геометрии типа LineString, по одной на каждый меридиан или параллель этой картографической сетки.

# graticule.outline()

Возвращает объект геометрии типа Polygon, представляющий внешнюю границу этой картографической сетки, т.е. по линиям мередианов и параллелей, определяющих её размеры.

# graticule.extent(extent)

Если указан параметр extent, устанавливает главные и второстепенные размеры этой картографической сетки. Если параметр extent не указан, возвращает текущие второстепенные размеры, которые по умолчанию установлены в ⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩.

# graticule.majorExtent(extent)

Если указан параметр extent, устанавливает главные размеры этой картографической сетки. Если параметр extent не указан, возвращает текущие главные размеры, которые по умолчанию установлены в ⟨⟨-180°, -90° + ε⟩, ⟨180°, 90° - ε⟩⟩.

# graticule.minorExtent(extent)

Если указан параметр extent, устанавливает второстепенные размеры этой картографической сетки. Если параметр extent не указан, возвращает текущие второстепенные размеры, которые по умолчанию установлены в ⟨⟨-180°, -80° + ε⟩, ⟨180°, 80° - ε⟩⟩.

# graticule.step(step)

Если указан параметр step, устанавливает главные и второстепенные шаги этой картографической сетки. Если параметр step не указан, возвращает текущие второстепенные шаги, которые по умолчанию установлены в ⟨10°, 10°⟩.

# graticule.majorStep(step)

Если указан параметр step, устанавливает главные шаги этой картографической сетки. Если параметр step не указан, возвращает текущие главные шаги, которые по умолчанию установлены в ⟨90°, 360°⟩.

# graticule.minorStep(step)

Если указан параметр step, устанавливает второстепенные шаги этой картографической сетки. Если параметр step не указан, возвращает текущие второстепенные шаги, которые по умолчанию установлены в ⟨10°, 10°⟩.

# graticule.precision(precision)

Если указан параметр precision, устанавливает точность этой картографической сетки, в градусах. Если параметр precision не указан, возвращает текущую точность, которая по умолчанию установлена в 2.5°.

# d3.geo.circle

Конструирует генератор характеристик для создания окружностей, отцентрованных в данной географической локации с данным радиусом в градусах.

# circle(arguments…)

Возвращает объект GeoJSON'а Polygon, приближающий окружность. Функция доступа к центру координат определяет, как определять центр координат для указанных аргументов arguments; функция доступа по умолчанию использует константный центр координат в точке ⟨0°, 0°⟩.

# circle.origin([origin])

Если указан параметр origin, устанавливает начало координат окружности. Должен быть определён двухэлементный массив или функция доступа. Если параметр origin не указан, возвращает текущий центр координат, который по умолчанию установлен в ⟨0°, 0°⟩.

# circle.angle([angle])

Если указан параметр angle, устанавливает угловой радуус окружности в градусах. Если параметр angle не указан, возвращает текущий радиус, который по умолчанию установлен в 90°.

# circle.precision([precision])

Если указан параметр precision, устанавливает точность интерполяции сегментов окружности, в градусах. Эти интерполируемые сегменты вставляются, когда характеристика обрезается по окружности. Если параметр precision не указан, возвращает текущую точность, которая по умолчанию установлена в 6°.

Сферическая математика

# d3.geo.area(feature)

Возвращает сферическую площадь указанной характеристики feature в стерадианах. Также смотрите path.area, которая вычисляет спроецированную на декартову плоскость площадь.

# d3.geo.centroid(feature)

Возвращает сферический центр масс указанной характеристики feature. Также смотрите path.centroid, которая вычисляет спроецированный на декартову плоскость центр масс.

# d3.geo.bounds(feature)

Возвращает сферический ограничивающий прямоугольник для указанной характеристики feature. Ограничивающий прямоугольник представляется двумерным массивом: [​[left, bottom], [right, top]​], где left — это минимальная долгота, bottom — минимальная широта, right — максимальная долгота и top — максимальная широта. Также смотрите path.bounds, которая вычисляет спроецированный на декартову плоскость ограничивающий прямоугольник.

# d3.geo.distance(a, b)

Возвращает расстояние по большой дуге в радианах между двумя точками a и b. Каждая точка определяется массивом [longitude, latitude], в котором координаты выражены в градусах.

# d3.geo.length(feature)

Возвращает длину большой дуги указанной характеристики feature в радианах. Для многоугольников возвращается периметр внешнего кольца плюс периметры любых внутренних колец.

# d3.geo.interpolate(a, b)

Вовзращает интерполятор между данными двумя местоположениями a и b. Каждое местоположение должно быть представлено двухэлементным массивом [longitude, latitude]. Возвращённый интерполятор принимает один параметр t из диапазона от 0 до 1. По значению 0 возвращается местоположение a, а по значению 1 возвращается местоположение b. Промежуточные значения интерполируются от a до b вдоль охватывающей большой дуги.

# d3.geo.rotation(rotate)

Определяет вращение в форме массива, [λ, φ, γ]. Элементы массива являются углами в градусах и определяют вращение в следующем порядке: вокруг долготы, вокруг широте и вокруг центра координат. Если последний элемент в массиве, γ, будет опущен, по умолчанию он предполагается равным нулю. Возвращает функцию, котороя поворачивает указанное местоположение как описано далее.

# rotation(location)

Поворачивает указанное местоположение location на углы, определяющие данное вращение, в порядке, описанном выше. Местоположение определяется массивом [longitude, latitude], в котором координаты выражены в градусах. Возвращает новый массив, представляющий повёрнутое местоположение.

# rotation.invert(location)

Поворачивает указанное местоположение location на углы, определяющие данное вращение, но в порядке, обратном описанному выше. Местоположение определяется массивом [longitude, latitude], в котором координаты выражены в градусах. Возвращает новый массив, представляющий повёрнутое местоположение.

Clone this wiki locally