Merkezi bir geoJSON bir nesne verilen d3 göster | Netgez.com
SORU
24 Ocak 2013, PERÅžEMBE


Merkezi bir geoJSON bir nesne verilen d3 göster

Şu anda d3 varsa geoJSON nesne gidiyorsun çekmek için ölçek ve tercüme almak için bu boyutu istedi ve tercüme için merkezi. Bu deneme yanılma çok sıkıcı bir iştir, ve eğer biri bu değerleri elde etmek için daha iyi bir yol biliyor mu diye merak ettim?

Örneğin eğer bu kod var

var path, vis, xy;
xy = d3.geo.mercator().scale(8500).translate([0, -1200]);

path = d3.geo.path().projection(xy);

vis = d3.select("#vis").append("svg:svg").attr("width", 960).attr("height", 600);

d3.json("../../data/ireland2.geojson", function(json) {
  return vis.append("svg:g")
    .attr("class", "tracts")
    .selectAll("path")
    .data(json.features).enter()
    .append("svg:path")
    .attr("d", path)
    .attr("fill", "#85C3C0")
    .attr("stroke", "#222");
});

Nasıl edinebilirim .ölçek(8500) ve .([0, -1200]) tercüme azar azar gitmeden?

CEVAP
4 ÅžUBAT 2013, PAZARTESÄ°


Benim cevabım Jan van der Laan bulunur, ama coğrafi ağırlık merkezi Hesaplaması gerek yok çünkü işleri biraz kolaylaştırmak; sadece sınırlayıcı kutunun gerekiyor. Ve, ölçeklendirilmemiş, untranslated birim bir projeksiyon kullanarak, matematik basitleştirebilirsiniz.

Kod önemli bölümü şudur:

// Create a unit projection.
var projection = d3.geo.albers()
    .scale(1)
    .translate([0, 0]);

// Create a path generator.
var path = d3.geo.path()
    .projection(projection);

// Compute the bounds of a feature of interest, then derive scale & translate.
var b = path.bounds(state),
    s = .95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height),
    t = [(width - s * (b[1][0]   b[0][0])) / 2, (height - s * (b[1][1]   b[0][1])) / 2];

// Update the projection to use computed scale & translate.
projection
    .scale(s)
    .translate(t);

Birim projeksiyon özelliÄŸi bounding box comping sonra, uygun hesaplayabilirsinizölçektuvalin en boy oranını (width height) için sınırlayıcı kutunun (b[1][0] - b[0][0] b[1][1] - b[0][1]) en boy oranını karşılaÅŸtırarak. Bu durumda, ben de ölçekli sınırlayıcı kutu için • tuval yerine 100%, o yüzden biraz ekstra oda kenarları için darbeleri ve çevre özellikleri veya dolgu.

O zaman hesaplayabilirsiniztercümesınırlayıcı kutusunun merkezine ((b[1][0] b[0][0]) / 2 (b[1][1] b[0][1]) / 2) kullanarak tuvalin Merkezi (width / 2 height / 2). Sınırlama kutusunu koordinatları ünite izdüşümü olduğundan, ölçek (s) çarpımı olmalıdır.

, 14**: örneğin

project to bounding box

Projeksiyon ayarlama olmadan bir koleksiyon belirli bir özelliği zoom nasıl olduğu ile ilgili bir soru varyanive uzaklaştırmak için bir geometrik dönüşümü ile projeksiyon birleştirerek. Bu yukarıdaki gibi aynı ilkeleri kullanır, ama matematik geometrik (SVG "" özniteliği) coğrafi projeksiyon ile birlikte. dönüşümü yüzünden biraz farklıdır

, 16**: örneğin

zoom to bounding box

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • Learn Math Tutorials

    Learn Math T

    20 Kasım 2011