วิธีติดป้ายกำกับรูปหลายเหลี่ยม GeoJSON


10

ฉันกำลังใช้ Leaflet รวมกับคุณสมบัติ GeoJSON มีวิธีติดป้ายกำกับคุณลักษณะ GeoJSON (ในกรณีนี้คือรูปหลายเหลี่ยม) หรือไม่ ควรได้รับฉลากจาก

feature.properties.name 

นี่คือรหัสของฉันที่ฉันคิดว่าฉันสามารถแทรกป้ายกำกับ:

function style(feature) {
            return {
                weight: 2,
                opacity: 1,
                color: 'white',
                dashArray: '3',
                fillOpacity: 0.7,
                fillColor: getColor(feature.properties.coloring)
            };
        }

1
คุณจะโพสต์วิธีแก้ปัญหาที่คุณใช้ในการติดป้ายรูปหลายเหลี่ยมถ้ายังคงอยู่ในมือ?
a1an

คำตอบ:


6

คุณจำเป็นต้องรู้แผ่นพับรูปแบบที่คาดว่าจะใช้ RFM ตัวอย่าง: OpenLayers คาดหวังรูปแบบ GeoJSON นี้เพื่อสร้างจุดและกำหนดแอตทริบิวต์ที่กำหนดเอง:

{"type":"FeatureCollection",
    "features":[
        {"type":"Feature",
            "properties":{
                "name":"TRON-02",
                "serial":"TRON002",
                "bearing":0,
                "color":"green",
                "size":15,
                "image":"img/unit_map3.png",
            },
            "geometry":{
                "type":"Point",
                "coordinates":[-50.06542968749966,-23.749149728383717]
            }
        }
    ]
}

อย่างที่คุณเห็นฉันได้สร้างรูปทรงเรขาคณิต (จุด) และเข้าร่วมคุณลักษณะของฉัน เมื่อฉันส่งสิ่งนี้ไปยัง OpenLayers ผลลัพธ์จะสอดคล้องกับตัวอย่างของ @ Aragon โดยใช้ "color" และ "name" (เป็นป้ายกำกับ) เพื่อกำหนดจุดในแผนที่เอง

โปรดคัดลอกและวางตัวอย่าง GeoJSON นี้ในhttp://json.parser.online.fr/หรือใช้ไซต์เพื่อลองและตรวจสอบความถูกต้องของคุณเอง


ไม่ใช่คำถามเกี่ยวกับรูปหลายเหลี่ยมใช่ไหม คำตอบเกี่ยวกับรูปทรงเรขาคณิตของจุดแก้ปัญหาได้อย่างไร
a1an

รูปหลายเหลี่ยมคืออะไร คุณจะตั้งชื่อเหมือนกัน สิ่งเดียวที่จะเปลี่ยนคือส่วน "เรขาคณิต" ไม่เพียงแก้ไขคำถาม แต่ได้รับ 5 ups จนถึงตอนนี้
Magno C

ขอให้ฉันใช้ถ้อยคำใหม่อีกครั้ง: ฉันมีคำถามเดียวกันและการวางป้ายบนรูปหลายเหลี่ยมนั้นค่อนข้างแตกต่างจากการวางไว้ที่จุดหนึ่งดังนั้นรูปหลายเหลี่ยมจึงมีความหมายกับฉันวัตถุสองมิติที่ปิดด้วยขอบหลายอันในบริบทนี้ นั่นเป็นเหตุผลที่ฉันมีความสนใจในการรับรายละเอียดดังนั้นความคิดเห็นแรกของฉัน คำตอบ "มันแก้ปัญหาไม่ได้" แต่ก็ไม่เป็นประโยชน์ แต่ขอบคุณอยู่ดี :-)
a1an

1
เพียงเพิ่มสิ่งที่ "คุณสมบัติ" และทั้งหมดจะถูกปรับ ดู @Aragon คำตอบreturn feature.properties.color;ที่คุณเห็นpropertiesเป็นfeatureแอตทริบิวต์และมีcolorเป็นหนึ่งในคุณลักษณะ คุณสามารถใส่สิ่งที่คุณต้องการลงในวัตถุนี้ตามด้วยวิธีนี้
Magno C

2
RFMไม่มีการเรียกใช้ทั้งหมด และความแตกต่างระหว่างจุดและรูปหลายเหลี่ยมมีความสำคัญเนื่องจากการรู้ว่ารูปทรงเรขาคณิตที่ใช้เป็นปัญหาที่นี่
สตีเฟ่นนำ

5

นี่คือวิธีที่ฉันแก้ไขมันด้วย Leaflet Polygons และ Labels เพื่อให้คุณได้รับฉลากลอยบนรูปหลายเหลี่ยมที่มีคุณสมบัติชื่อ

สมมติ:

  • คุณได้รับการตอบสนอง json แยกวิเคราะห์เป็นตัวแปร json
  • มีรูปหลายเหลี่ยมแบบง่ายเท่านั้นที่ไม่มีรูในรูปแบบ json
  • polygon_style มีตัวเลือกสไตล์ที่ส่งคืนโดยฟังก์ชันสไตล์ของคุณ
  • labels_layer เป็นแผ่นพับ Layergroup (หรือแผนที่ของคุณโดยตรง)

แล้ว:

for ( var i=0; i < json.features.length; i++ ) {
    feat = json.features[i];
    coords = [];
    for ( var j = 0 ; j < feat.geometry.coordinates[0].length - 1; j++ ) {
        coord = feat.geometry.coordinates[0][j];
        point = [];
        point.push( coord[1], coord[0]);
        coords.push( point );
    }
    labels_layer.addLayer(L.polygon( coords, polygon_style ).bindLabel(feat.properties.name))  ;
}

แปลกมากพอ GeoJson (จริง ๆ คือ EPSG: 4326) และพิกัดของแผ่นพับจะถูกสลับตามลำดับ


1
สำหรับผู้ที่ใช้ Leaflet 1.0+ L.Label ได้ถูกย้ายไปยัง Leaflet core เป็น L.Tooltip และปลั๊กอินเลิกใช้แล้ว คุณต้องการใช้ bindTooltip () แทน bindLabel () github.com/Leaflet/Leaflet.label
aethergy

1

ฉันคิดว่าคำถามนี้เกี่ยวกับ openlayers.if ดังนั้นคุณสามารถใช้สำหรับการติดฉลาก;

var style = new OpenLayers.Style({
    weight: 2,
    opacity: 1,
    color: 'white',
    dashArray: '3',
    fillOpacity: 0.7,
    fillColor: "${getColor}",  
    label: "${getLabel}"
  } , {
    context: {
      getColor: function(feature) {
        return feature.properties.color;
      },
      getLabel: function(feature) {
        return feature.properties.name;
      }
    }
  );

ฉันหวังว่ามันจะช่วยคุณ ...


1
ไม่ใช่ OpenLayers ฉันกำลังใช้ Leaflet รวมกับคุณสมบัติ GeoJSON ดังนั้นนี่ใช้ไม่ได้ แต่ขอขอบคุณสำหรับความพยายาม
เทียบกับ

ทำไมคุณไม่ fillColor: "${color}"สร้างฟังก์ชั่นแทน?
Magno C

1
@ Magno C ไม่มีความแตกต่างระหว่างประเด็นของคุณทั้งคู่เหมือนกัน ฉันได้เขียนสิ่งนี้ไว้หากคุณต้องการเพิ่มฟังก์ชั่นที่ซับซ้อนมากขึ้นเช่นสีแบบสุ่มหรืออย่างอื่น ยังคงขอบคุณสำหรับจุดของคุณ
Aragon

เข้าใจอารากอน ขอบคุณสำหรับวิธีการใหม่ อาจมีประโยชน์ในอนาคต ยกนิ้วให้!
Magno C

ฉันคิดว่าไม่มีทาง @againstflow วิ่งออกมาจากรูปแบบที่ฉันแสดงเพราะมีการพิจารณาคดีสเปค GeoJSON ที่นี่: ลิงค์
Magno C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.