Как нанести маркеры на OSM + d3-плитку? - PullRequest
0 голосов
/ 21 января 2020

Я работаю над проектом карты, где мы визуализируем карту с использованием плиток OSM и проекта плитки d3. Я пытаюсь поставить на него маркеры. Однако проекция (long, lat) возвращает странные значения, которые не соответствуют маркерам, например, -0.4777943611111111, -0.3832333211677277 для Нью-Йорка:

     newyork = [-74.2605518, 40.6971478];

    svg.selectAll("circle")
          .data([newyork]).enter()
          .append("circle")
          .attr("cx", function (d) { console.log(projection(d)); return -projection(d)[0]; })
          .attr("cy", function (d) { return -projection(d)[1]; })
          . attr("r", "20px")
          .attr("fill", "red")

Полный исходный код ниже

<!DOCTYPE html>
<meta charset="utf-8">
<style>
    body {
        margin: 0;
    }


</style>
<svg></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://unpkg.com/d3-tile@0.0.4/build/d3-tile.js"></script>
<script>

    var tau = 2 * Math.PI;

    var width = 960;
        height = 500;

    // Initialize the projection to fit the world in a 1×1 square centered at the origin.
    var projection = d3.geoMercator()
        .scale(1 / tau)
        .translate([0, 0]);

    var path = d3.geoPath()
                 .projection(projection);

    var tile = d3.tile()
                 .size([width, height]);

    var zoom = d3.zoom()
                 .on("zoom", zoomed);

    var svg = d3.select("svg")
                .attr("width", width)
                .attr("height", height);

    var raster = svg.append("g");

    // Center at US
    var center = projection([-98.5, 39.5]);
    console.log("Center " + center[0]);

    // Apply a zoom transform equivalent to projection.{scale,translate,center}.
    svg.call(zoom)
       .call(zoom.transform, d3.zoomIdentity
        .translate(width / 2, height / 2)
        .scale(1 << 12)
        .translate(-center[0], -center[1]));

    newyork = [-74.2605518, 40.6971478];

    console.log(projection(newyork))

    svg.selectAll("circle")
          .data([newyork]).enter()
          .append("circle")
          .attr("cx", function (d) { console.log(projection(d)); return -projection(d)[0]; })
          .attr("cy", function (d) { return -projection(d)[1]; })
          . attr("r", "20px")
          .attr("fill", "red")

    function zoomed() {
        var transform = d3.event.transform;

        var tiles = tile
            .scale(transform.k)
            .translate([transform.x, transform.y])
            ();

        var image = raster
            .attr("transform", stringify(tiles.scale, tiles.translate))
            .selectAll("image")
            .data(tiles, function(d) {
                return d;
            });

        image.exit().remove();
        // enter:
        var entered = image.enter().append("image");

        // update:
        image = entered.merge(image)
            .attr('xlink:href', function(d) {
                return 'http://' + 'abc' [d.y % 3] + '.tile.openstreetmap.org/' +
                    d.z + '/' + d.x + '/' + d.y + '.png';
            })
            .attr('x', function(d) {
                return d.x * 256;
            })
            .attr('y', function(d) {
                return d.y * 256;
            })
            .attr("width", 256)
            .attr("height", 256);
    }

    function stringify(scale, translate) {
        var k = scale / 256,
            r = scale % 1 ? Number : Math.round;
        return "translate(" + r(translate[0] * scale) + "," + r(translate[1] * scale) + ") scale(" + k + ")";
    }
</script>

Любая помощь оценили. Спасибо!

1 Ответ

0 голосов
/ 22 января 2020

Любой, кто ищет ответ, найдет его здесь: Картография D3: круги lon / lat в неправильном месте на карте (проекция)

Хитрость заключается в увеличенной функции преобразования круг:

function zoomed() {
...
  vector
      .attr("transform", transform)
      .attr("r", 5/transform.k);
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...